目錄
關於SqlSession的,會另起一篇文章介紹,本次關於Mapper接口的代理就到這裏了,謝謝大家。
一.關係梳理
二.Configuration
配置實體,可以理解爲讀取了xml配置文件後生成的配置實體。
三.MapperRegistry
是Configuration裏面的一個類變量,可用於掃描mapper接口時,通過addMapper方法加載Mapper的Bean到knowsMappers中。 這裏保存的是MapperProxyFactory,並非MapperProxy。
四.MapperProxyFactory
- 在“MapperRegistry”中用到,一個“MapperProxyFactory”對應一個mapperInterface。
- methodCache這個緩存對象會傳入到MapperProxy對象中,由MapperProxy進行寫入MapperMethod數據。
- 通過newInstance方法生成一個MapperProxy(Mapper代理)。
- 有2個newInstance方法,只有newInstance(SqlSession sqlSession)是對外開放的。
關於newInstance中的參數sqlSession是怎麼來的:
這裏涉及到spring加載dao層實體的流程,具體與“SqlSessionTemplate”、“MapperFactoryBean”、“MapperScannerRegistrar”等實現有關,這裏不細說,有興趣的同學可以通讀源碼瞭解。
五.MapperProxy
這個類實現了“InvocationHandler”接口進行反射操作。
反射操作invoke()中會拿到調用的MapperMethod對象,通過執行MapperMethod的execute方法完成用戶的命令
六.MapperMethod
1.MapperMethod在生成的時候已經確認“SqlCommand”,即sql的類型(增刪改查)。
2.在execute方法中,根據SqlCommand和傳入的參數,會選擇對應的具體(增刪改查)方法執行,並對結果進行加工,可以理解MapperMethod只是一個路由。
3.那麼在execute中執行sql,要怎麼與數據庫通信呢(事務、數據庫連接、Statement等等)?
(1)這就涉及到Mybatis中的一個核心了,就是SqlSession(會話)。在程序運行時,所有數據庫命令執行都是在SqlSession下進行的。
(2)SqlSession是一個接口,他的實現類有“DefaultSqlSession”,“SqlSessionManager”,“SqlSessionTemplate”。各自有自己的應用場景,
但是最終都是通過“DefaultSqlSession”去實現具體的數據庫訪問邏輯。