您好,登錄后才能下訂單哦!
今天就跟大家聊聊有關Mybatis執行流程的源碼分析,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。
public static void main(String[] args) { try { // 基本mybatis環境 // 1.定義mybatis_config文件地址 String resources = "mybatis_config.xml"; // 2.獲取InputStreamReaderIo流 Reader reader = Resources.getResourceAsReader(resources); // 3.獲取SqlSessionFactory SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); // 4.獲取Session SqlSession sqlSession = sqlSessionFactory.openSession(); // 5.操作Mapper接口 UserMapper mapper = sqlSession.getMapper(UserMapper.class); UserEntity user = mapper.getUser(2); System.out.println(user.getName()); } catch (Exception e) { e.printStackTrace(); } }
1、讀取Mybatis配置文件信息
2、獲取SqlSessionFactory
a.使用XMLMappperBuilder解析Mybatis配置文件,封裝成Environment對象,再把Environment對象設置給Configuration對象;
b.調用ConfigurationElement函數,最終執行addMappedStatement方法,將mapper配置文件中的每一條SQL語句封裝成mappedStatement對象,作為value保存在HashMap集合中;
c.進入addLoaderResource方法,使用HashSet集合存放mybatis的mapper.xml 映射文件路徑地址;
d.進入bindMapperForNamespace()方法,通過namespace使用Java反射機制找到mapper接口,再調用addMapper()方法,判斷是否是接口類型,是否注冊過(注冊過則拋出異常)其中mapperRegistry通過HashMap保存mapper接口,【key:接口;value:MapperProxyFactory】
3、獲取session
a.進入openSession()方法,執行newExecutor()方法創建執行器;
b.先創建 SimpleExecutor簡單執行器,再判斷是否開啟了二級緩存,默認是開啟的,就會去創建CacheExecutor緩存執行器,
c.執行interceptorChain.pluginAll()方法,責任鏈設計模式,底層使用動態代理技術,使開發者可以自定義插件開發,只需要實現Interceptor接口,并指定想要攔截的方法簽名即可,最后返回執行器;
4、操作mapper接口
a.調用getMapper()方法,最終執行mapperProxyFactory.newInstance(sqlSession)方法創建代理類MapperProxy;
b.當我們調用mapper,getUser()方法的時候,就會去執行MapperProxy代理類的invoke()方法;
c.判斷mapper接口是否有實現類,顯然我們沒有實現類,則調用cacheMapperMethod()方法去緩存中獲取要代理的方法method;
d.進入cacheMapperMethod()方法先去查找緩存中有沒有,沒有的話將mapper配置文件中配置的SQL語句和對應的mapper接口方法進行關聯并放入map緩存中,后期直接走緩存了,最后執行execute()方法;
e.執行execute()方法,最終調用selectOne()方法;
f.進入selectOne()方法,底層還是查詢所有的,但是取第一個,查詢多個的話會拋出異常;
g.進入selectList()方法,調用getMapperStatement()方法獲取對應的SQL語句;
h.執行query()方法進行查詢,判斷如果開啟了二級緩存并且配置了二級緩存存儲介質(Redis,EhCache..)則先走二級緩存中查詢數據,第一次查詢是沒有緩存數據的,則刷新緩存配置,清除緩存。
i.二級緩存(sessionFactory)中沒有查詢到數據,就回去執行BaseExecutor去查詢 HashMap一級緩存中(sqlSession)是否有緩存數據,一級緩存(PerpetualCache)存放在內存中的,同理也是沒有的,最后查詢數據庫DB。
j.將從數據庫查詢出來的數據緩存到一級緩存中,再把一級緩存中的數據同步到二級緩存,添加到二級緩存之前先添加到getTransactionalCache的entritiesToAddOnCommit的map集合中臨時緩存起來;
k.調用executor.close()方法循環迭代TransactionCache,最后將臨時map緩存數據提交到二級緩存中,如果事務回滾,則會將緩存數據清除掉。
看完上述內容,你們對Mybatis執行流程的源碼分析有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。