MyBatis相關

xyq1212發表於2020-12-09

概念

  • MyBatis是一個半ORM框架,它內部封裝了JDBC,開發時只需要關注SQL語句本身。程式設計師直接編寫原生態sql語句,可以嚴格控制sql執行效能,靈活度高

MyBatis從執行sql語句到返回results的過程

  • 通過xml或註解的方式將要執行的statement配置起來

  • 通過Java物件和statement中sql的動態引數進行對映生成最終執行的sql語句

  • MyBatis框架執行sql並將結果對映為Java物件返回

Dao/Mapper介面的工作原理

  • JDK動態代理,MyBatis執行時會使用JDK動態代理為Mapper介面生成代理物件proxy,代理物件會攔截介面方法,轉而執行MapperStatement所代表的sql,然後返回sql執行結果

延遲載入

  • MyBatis僅支援association關聯物件和collection關聯物件的延遲載入

  • 它的原理是,使用CGLIB建立目標物件的代理物件,當呼叫目標方法時,進入攔截器方法,比如呼叫a.getB().getName(),攔截器invoke()方法發現a.getB()是null值,那麼就會單獨傳送事先儲存好的查詢關聯B物件的sql,把B查詢上來,然後呼叫a.setB(b),於是a的物件b屬性就有值了,接著完成a.getB().getName()方法的呼叫。這就是延遲載入的基本原理。

MyBatis的一級、二級快取

  • 一級快取:基於PerpetualCache,使用HashMap本地儲存,儲存作用域為Session,一級快取預設開啟,當Session flush或close之後,該Session中的所有Cache將清空

  • 二級快取:基於PerpetualCache,使用HashMap儲存,儲存作用域為Mapper(namespace),可以自定義儲存源,預設不開啟二級快取,如果要開啟二級快取,需要實現序列化介面,並在對映檔案中配置<cache/>

  • 快取更新:當某個作用域進行了C/D/U操作後,預設該作用域下select中的快取將被clear並重新更新,如果開啟了二級快取,則只根據配置判斷是否重新整理

使用MyBatis的Mapper介面呼叫時的要求

  • Mapper介面方法名要和mapper.xml中定義的每個sql的id相同

  • Mapper介面輸入引數的型別要和mapper.xml中每個sql的parameter Type型別相同

  • Mapper介面輸出引數的型別要和mapper.xml中每個sql語句的resultType的型別相同

  • Mapper介面的類路徑要和mapper.xml檔案中的namespace相同