1. 程式人生 > >Mybatis工作原理?

Mybatis工作原理?

模板 操作 配置 們的 對象 實現 做了 判斷 映射


簡單來說,他跟你直接用一個sqlUtil的實現是一樣,只不過很多復雜的util優化的事情,提前有其他程序員做了。

Mybatis是一個映射封裝,他與你用util的區別就是,他將在代碼塊中的sql存在統一的xml文件也就是sqlmaper中。

同時他將你執行sql的傳參也就是執行變量進行了通配,然後映射到你的model中。

Mybatis大概的執行過程:

通過factory方法獲取sqlsession----通過MapperProxy代理到dao--執行底層數據庫操作,

簡單說就是跟樓上說的據經過controller 再經過service 然後執行service中的相關方法並關聯到mapper 再執行mapper.xml中的sql語句===


我們以JDBC為例看看他們的區別:

JDBC:

(1) 加載JDBC驅動,建立並獲取數據庫連接 ,創建statement對象

(2) 設置SQL語句的傳入參數

(3) 執行SQL語句並獲得查詢結果

(4) 對查詢結果進行轉換處理並將處理結果返回

(5) 釋放資源

Mybatis:

1:使用連接池,datasource,在驅動並連接的這個過程中優化並解耦

JDBC第一步其實從效率角度來看是不合適的,因為無論什麽數據庫都不可能支撐隨機和龐大的連接數,而且不可避免的存在連接浪費的情況,Mybatis就封裝了這些優化的方法。

2:統一sql存取到XML

如果代碼寫在java塊中,在團隊合作中很可能出現兩個交叉業務的代碼使用類似的sql語句,而開發人員的工作本身沒有交集,那就代表sql語句肯定是無法復用的。而且對sql的修改,就代表著對java文件的修改,需要重新編譯和打包部署(比如常見的狀態值更改,sql修改隨著業務變化必然存在修改)。

mybatis將sql統一存取到xml中,就算存在業務交叉,但因為統一配置的緣故,sql在xml中一目了然,兩個跨team的程序員可以看到對方的sql,來判斷自己是否需要重用。並且使用xml配置可以減少代碼編譯。

還有就是在java中拼寫長sql太惡心了。

3:參數和結果集映射

sql的方式需要傳入參數,如果存在多條件“或類型”的查詢(列表查詢的查詢條件允許空),那就代表你必須傳參進行sql拼接,就算使用xml的方式也不行。要麽每個業務獨立配置xml中的sql,要麽還是寫入java代碼中,或者以工具的方式進行自動拼接。

Mybatis使用映射的方式,方便model管理參數,同時以解析器的方式將參數動態拼接到sql(sqlmaper裏那些標簽),由於是model映射,連查詢結果都可以統一映射,方便取出和運算。而且mybatis對查詢結果集進行了緩存處理,使得重復查詢進一步進行了優化。

4:對多重復sql進行復用封裝

比如模板方法,將常用sql模塊化,直接調用。比如通用的save和getID之類的,只有表名和字段名有變化。

Mybatis工作原理?