初始化:獲取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ù)中