『網際網路架構』軟體架構-mybatis體系結構(14)
>今天說說mybatis,之前說過spring ioc,aop,mvc,接下來就到資料庫的持久層了。從上到下的順序,mvc,ioc,最下面就是資料庫的持久層。mybatis是網際網路和企業內廣為應用的框架。官方參考文件這個文件很詳細:
資料庫訪問層的4種實現方案對比
JDBC
>當初最早的實現dao層,都是透過jdbc的方式
- 獲取連結,透過DriverManager.getConnection
- 構建sql語句,可能這個sql語句,增刪改查都有可能
- 設定引數,跟jdbc資料庫是一一對應的
- 執行sql,透過execute
- 獲取返回結果
- 基於結果構建DO
- 關閉連結
> 非常的繁瑣,可以基於一個元件,開發一個工具類,獲取連結和關閉連結肯定是兩個方法,1-7步可以透過代理方法構建。第二步可以透過引數的形式傳遞給方法。自動幫我們獲取連結,設定引數,執行sql。大大簡化了我們開發。後來就開始企業開發使用jdbc template。
JdbcTemplate
- 構建sql語句
- 構建引數
- 呼叫jdbc模板方法
3.1 獲取連結
3.2 設定引數
3.3 執行sql
3.4 獲取返回結果
3.5 基於result物件屬性對映構建DO
4 返回DO物件
>雖然JdbcTemplate 簡化我們對資料庫的操作,但是它有個問題,sql語句都要java類,程式碼的方式拼接sql,最後導致程式碼非常的混亂,資料庫的型別和java的型別進行對映。寫sql語句本身就是很繁瑣的事情,ORM的出現物件關係對映,資料庫裡面的二維和java裡面的bean,做一對一的配置。根本就不需要寫sql語句了,後來開始普及hibernate。
hibernate
> hibernate 是一個完完整整的ORM框架,包含基本的查詢,插入,修改,刪除。透過java api的方式進行呼叫,還包括二級快取這種附加的,天生支援sql防注入的。
- 獲取session
- 開啟事務,返回transaction物件
- 呼叫save,返回執行結果
3.1 配置對映
3.2 預計DO對映生成SQL(底層還是jdbc,就好像我們spring mvc底層還是用的servlet)
3.3 獲取連結
3.4 設定sql引數
3.5 執行sql
3.6 釋放連結 - 提交事務
>hibernate雖然好,但是也有弊端的,最不方便的地方,狀態的把握(遊離態,持久化態,瞬態資料態),特別是模型比較複雜的時候什麼一對一,一對多,多對一,多對多,很容易繞暈,還有HQL語句,這些語句都是hibernate自己生成的,這樣DBA是非常鬱悶的,對效能研究把握比較大的,這樣會感覺它比較重了。 後來很多人從hibernate轉成了JdbcTemplate ,JdbcTemplate 雖然比較繁瑣,但是sql語句都是可控的。sql語句的寫法完全可以考資料庫的經驗。
mybatis
- 歷史
>Mybaits的前身是Apache的一個開源專案iBatis,2010年這個專案由apache software foundation 遷移到了 google code 並且改名為Mybatis,2013年11月遷移到Github,目前mybaits是由Github維護的。
- 獲取session
- 開啟事務返回Transaction
- 呼叫select
3.1 拉取對映配置
3.1.1 基於配置構建configstatement
3.2 執行sql
3.2.1 基於configstatement生成sql
3.2.2 獲取連結
3.2.3 設定sql引數
3.2.4 執行sql
3.2.5 釋放連結,返回Do物件,返回執行結果
>hiberate都是透過對映自己生成sql語句,mybatis是根據xml,你配置什麼sql就執行什麼sql,sql語句是可控的,是可以看的到的。出了問題可以透過經驗執行sql。
四種的對比
分類 | 優點 | 缺點 |
---|---|---|
jdbc | 簡單、純粹 | 1、需要手動關閉連結 2、結果集不能自動映謝 |
jdbcTemplate | 簡單、純粹、自動會話管理、結果集映謝 | 1、手動拼裝SQL管理混亂 |
hirbernate | 程式設計效率高,無需編寫sql。資料庫更換成本低、較完善的二級快取、自動防SQL隱碼攻擊 | 完全掌握的門檻高、效能最佳化較麻煩、複雜映謝 |
myBatis | 學習成本低、可以進行更為細緻的SQL最佳化,減少查詢欄位、統一的SQL管理 | 功能相對簡陋、需要手動編寫維護SQL、表結構變更之後需要手動維護SQL與映謝(儘可能的多關聯查詢什麼的,都寫在業務程式碼裡面,這樣可以良好的完成分散式) |
mybatis的定位
>myBatis 專注於sql 本身,其為sql 映謝而非完整的ORM,需要自己編寫sql 語句,這是其優點也是缺點。優點是:最佳化方便,可更好利用sql編寫經驗。缺點是當資料修改之後調整麻煩耗費時間長.
>試用場景:適用於對效能要求較高,有大批次的查詢修改,並且業務實現沒有過多依懶資料關係模型,比如:電商、O2O等網際網路專案。
>網際網路專案對DAO層的要求:
1.對資料庫的訪問更新純粹
2.儘可能不要使用資料庫做運算
3.SQL語句可以針對性的最佳化(減少查詢欄位、查條件排序例 、查詢條件儘可能命中索引)
myBatis 體系結構圖
myBatis 應用知識結構圖
- Config
> 屬性配置
> 三種設定方式:
1.構建sessionFactory 時傳遞 (優先順序:高)
2.基於resource 屬性載入 或 url 載入 (優先順序:中)
3.基於 屬性設定 (優先順序:低)
>全域性引數配置
具體參考:
>環境配置
> 資料來源:
unpooled 普通連線,每次獲取時都會重新建立一個新的連線.屬性下如下:
• driver :資料庫驅動類
• url: URL地址
• username:使用者名稱。
• password :登入資料庫的密碼。
pooled: 連線池模式,所有連線從連線池當中獲取,由連線池來來進行連線的建立與回收關於等操作,除支援unpooled屬性外還支援屬性如下:
• poolMaximumActiveConnections : 最大活躍數,預設值:10
• poolMaximumIdleConnections :最大空閒連線數
• poolMaximumCheckoutTime :獲取連線超時等待最大(checked out)時間,預設值:20000 毫秒
• poolTimeToWait : 單次獲取連線 最大等待時間 預設:20000 毫秒(即 20 秒)。
• poolMaximumLocalBadConnectionTolerance 獲取連線重試次數 預設:3
• poolPingQuery 用於檢測連線是否斷開的測試 語句
• poolPingEnabled 是否透過執行poolPingQuery 語句做檢測,預設值:false。
• poolPingConnectionsNotUsedFor 連線檢測間隔時間 ,預設60000。
>typeAliases 別名配置
- mappers 檔案引入
>基於 mapper 引入指定資原始檔: resource| url |class
基於package 引入:掃描指定包路徑當下的url
>mapper 映謝檔案配置
mapper 常用元素
• select – 對映查詢語
• insert – 對映插入語句
• update – 對映更新語句
• sql – 可被其他語句引用的可重用語句塊。
• delete – 對映刪除語句
• resultMap 用來描述如何從資料庫結果集中來載入物件。
• cache – 給定名稱空間的快取配置。
• cache-ref – 其他名稱空間快取配置的引用。
>select 查詢標籤
select * from user_info where id = #{id}
其支援屬性如下:
引數的引用的辦法
#{id, mode=in, jdbcType=INT, jdbcTypeName=MY_TYPE}
>insert update delete 標籤
INSERT INTO user_info (user_name,nick_name,password) VALUES
(#{userName},#{nickName},#{password})
update user_info set user_name=#{userName} where id=#{id}
DELETE from user_info where id=#{id}
> 標籤
將重複的sql 語句定文為一個欄位
id,user_name,nick_name
可透過 進行引入 如:
>resultMap
resultMap 是myBatis 物件的映謝
- 動態SQL配置
標籤
trim (where, set) 標籤
foreach 標籤
PS:其實mybatis,我比較習慣自動生成對應的xml,裡面只有簡單的增刪查改,所有的業務邏輯不在表裡面進行處理包括關聯查詢,都在service裡面處理,然後new 新的vo 展示就可以了,這樣把壓力都給程式來完成,資料庫更單純一些。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4650/viewspace-2826547/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 『網際網路架構』軟體架構-環境搭建maven(三)架構Maven
- 網際網路理想架構架構
- 大型網際網路架構概述架構
- 網際網路架構:屢試不爽的架構三馬車架構
- 分散式網際網路架構之路分散式架構
- Java網際網路架構,如何快速搭建一個微服務架構?Java架構微服務
- 架構之:軟體架構漫談架構
- 網路管理體系結構
- 軟體體系結構課堂測試02– 架構評價架構
- 網際網路動靜分離架構架構
- 軟體架構風格——規則架構架構
- 軟體架構模式之微服務架構架構模式微服務
- 工業網際網路產業聯盟:工業網際網路體系架構 2.0(附下載)產業架構
- 工業網際網路平臺架構方案,構建工業網際網路企業數字化、網路化、智慧化服務體系架構
- 軟體體系架構的認識架構
- 軟體體系架構課堂測試07 –邏輯架構設計架構
- 網際網路分層架構的本質架構
- 網際網路資料庫架構設計資料庫架構
- 「網際網路大廠」招聘Java架構師Java架構
- 工業網際網路平臺架構方案架構
- MySQL體系架構MySql架構
- Tomcat 體系架構Tomcat架構
- SQLite體系架構SQLite架構
- 架構知識體系總結架構
- 大型網際網路系統架構是如何設計的?架構
- 軟體架構簡介架構
- 架構:軟體成本估算架構
- 軟體架構指南 - martinfowler架構
- 計算機網路體系結構計算機網路
- 京東方引入SmartX超融合構建”網際網路式”IT架構架構
- 單體架構到垂直架構架構
- 讀書筆記 之《軟體架構設計: 大型網站技術架構與業務架構融合之道》筆記架構網站
- MySQL整體架構與記憶體結構MySql架構記憶體
- 網際網路高併發架構設計模式架構設計模式
- 容器、微服務和網際網路架構淺談微服務架構
- 跨境網際網路券商架構最佳實踐\n架構
- 論軟體系統架構風格架構
- 2_指令集、體系架構、微架構架構