mybatis

初始化:獲取xml配置信息,解析xml文件構(gòu)造出Configuration,通過配置信息生成sqlSessionFactory,生成sqlSession。

具體點:XmlConfigerBuilder將xml轉(zhuǎn)換成Document,dtd文件文件轉(zhuǎn)換成XMLMapperEntityResolver,兩者作為入?yún)?gòu)造出XpathParser,XpathParser根據(jù)xpath表達式解析Document生成出sqlSessionFactory(解析過程涉及環(huán)境變量,datasource,事務管理器等,放入configuration)

dataSource:poolDataSource,unPoolDataSource,jndi數(shù)據(jù)源

connection創(chuàng)建過程:配置dataSource,由dataSourceFactory創(chuàng)建,放入環(huán)境變量賦值給configration,生成sqlSessionFactory,產(chǎn)生sqlSession,當執(zhí)行sql時,sqlSession.getDataSource.getConnection創(chuàng)建連接(Class.forName("com.mysql.jdbc.Driver");//注冊數(shù)據(jù)庫驅(qū)動con=DriverManager.getConnection("jdbc:mysql://localhost:3306/test?user=root&password=root");//獲取數(shù)據(jù)庫連接),其中unPoolDataSource每次執(zhí)行sql建一個新鏈接

dataSource和連接池:空閑連接池和活動連接池,先從空閑獲取,獲取不到判斷活動是否滿,沒有滿新建放入活動,活動滿看活動是否有過期,沒過期等待,過期的話刪除新建。通過代理方式,當調(diào)用connection.close方法會放入連接池而不是關閉

鏈接方式:

? ?DBCP:最大連接數(shù),斷開會全部斷開,不能自動回收,有對象池,tomcat等

? ? ?c3p0:最大鏈接時間,超過自動斷開,有自動回收功能,hibernate,spring等

JNDI:api接口,提供了一套根據(jù)資源名稱名稱的方式,通過datasource放到jndi數(shù)樹上來找到鏈接

mybatis緩存:

一級緩存:本地緩存,把查詢sql+參數(shù)作為HashMap(key),緩存結(jié)果,update/delete都會刪除一級緩存。

事務開啟情況下從threadlocal取sqlsession獲取一級緩存,非實物情況下每次新建sqlsession

二級緩存:全局緩存,需要開啟,緩存的是mapper,對應莫條select設置useCache。可用mybatis提供的,或者自定義,也可集成三方的。是在進行executor操作之前裝飾器模式增加緩存處理,二級緩存存在臟讀問題(共享緩存,可通過事務緩存機制解決,不可重復讀問題仍然存在)

mybatis動態(tài)代理:getMapper生成動態(tài)代理實現(xiàn)類,根據(jù)方法名和參數(shù)找到sql,構(gòu)建sql片段樹(boundSql),查詢二級緩存,一級緩存,statementHandler執(zhí)行查詢返回結(jié)果

插件:通過攔截器動態(tài)代理方式實現(xiàn)方法執(zhí)行前的攔截處理

KeyGenerator:

獲取主鍵數(shù)組(keyProperties)

獲取 ResultSet 元數(shù)據(jù)

遍歷參數(shù)列表,為每個主鍵屬性獲取 TypeHandler

從 ResultSet 中獲取主鍵數(shù)據(jù),并填充到參數(shù)中

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

友情鏈接更多精彩內(nèi)容