『網際網路架構』軟體架構-mybatis體系結構(14)

joytoy發表於2021-09-09

>今天說說mybatis,之前說過spring ioc,aop,mvc,接下來就到資料庫的持久層了。從上到下的順序,mvc,ioc,最下面就是資料庫的持久層。mybatis是網際網路和企業內廣為應用的框架。官方參考文件這個文件很詳細:

圖片描述

資料庫訪問層的4種實現方案對比

JDBC

>當初最早的實現dao層,都是透過jdbc的方式

圖片描述

  1. 獲取連結,透過DriverManager.getConnection
  2. 構建sql語句,可能這個sql語句,增刪改查都有可能
  3. 設定引數,跟jdbc資料庫是一一對應的
  4. 執行sql,透過execute
  5. 獲取返回結果
  6. 基於結果構建DO
  7. 關閉連結

> 非常的繁瑣,可以基於一個元件,開發一個工具類,獲取連結和關閉連結肯定是兩個方法,1-7步可以透過代理方法構建。第二步可以透過引數的形式傳遞給方法。自動幫我們獲取連結,設定引數,執行sql。大大簡化了我們開發。後來就開始企業開發使用jdbc template。

JdbcTemplate

圖片描述

  1. 構建sql語句
  2. 構建引數
  3. 呼叫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防注入的。

圖片描述

  1. 獲取session
  2. 開啟事務,返回transaction物件
  3. 呼叫save,返回執行結果
    3.1 配置對映
    3.2 預計DO對映生成SQL(底層還是jdbc,就好像我們spring mvc底層還是用的servlet)
    3.3 獲取連結
    3.4 設定sql引數
    3.5 執行sql
    3.6 釋放連結
  4. 提交事務

>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維護的。

圖片描述

  1. 獲取session
  2. 開啟事務返回Transaction
  3. 呼叫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/,如需轉載,請註明出處,否則將追究法律責任。

相關文章