楔子
之前用了很久的mybatis,但是從來沒有去認(rèn)真的看過它的源代碼,于是便產(chǎn)生的閱讀mybatis源代碼的念頭纤子。無論做什么事,開始的著手點(diǎn)是最難的。對(duì)于閱讀源代碼控硼,最好的方式無外乎寫一下小的case泽论,然后一步一步debug跟進(jìn)。但是由mybatis源代碼中提供完善的單元測(cè)試卡乾,因此我們可以不必自己去寫case翼悴,直接使用這些單元測(cè)試就可以了。
例如:使用mybatis簡(jiǎn)單的執(zhí)行一條SQL就可以通過SqlSessionTest這個(gè)test suit來了解幔妨,mybatis會(huì):
- 創(chuàng)建data source鹦赎,讀取配置文件,創(chuàng)建session manager
@BeforeClass public static void setup() throws Exception { createBlogDataSource(); final String resource = "org/apache/ibatis/builder/MapperConfig.xml"; final Reader reader = Resources.getResourceAsReader(resource); sqlMapper = new SqlSessionFactoryBuilder().build(reader); }
- 打開session误堡,執(zhí)行sql古话,完成后關(guān)閉session
@Test public void shouldSelectCountOfPosts() throws Exception { SqlSession session = sqlMapper.openSession(); try { Integer count = session.selectOne("org.apache.ibatis.domain.blog.mappers.BlogMapper.selectCountOfPosts"); assertEquals(5, count.intValue()); } finally { session.close(); }
以上就是mybatis如果執(zhí)行簡(jiǎn)單的sql。
我們可以看到锁施,mybatis首先會(huì)通過讀取配置創(chuàng)初始化環(huán)境陪踩。然后在執(zhí)行SQL的時(shí)候,首先回去打開一個(gè)session悉抵,執(zhí)行完SQL之后肩狂,會(huì)關(guān)閉session。對(duì)于環(huán)境的初始化姥饰,我們?cè)谙乱还?jié)在看傻谁,首先我們來看session的創(chuàng)建。
Session Factory
從上面的代碼列粪,我們可以看到审磁,mybatis會(huì)通過讀取配置文件創(chuàng)建一個(gè)session factory,這里使用了抽象工廠的模式岂座,session factory是一個(gè)interface态蒂,
public interface SqlSessionFactory {
SqlSession openSession();
SqlSession openSession(boolean autoCommit);
SqlSession openSession(Connection connection);
SqlSession openSession(TransactionIsolationLevel level);
SqlSession openSession(ExecutorType execType);
SqlSession openSession(ExecutorType execType, boolean autoCommit);
SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);
SqlSession openSession(ExecutorType execType, Connection connection);
Configuration getConfiguration();
}
openSession方法會(huì)返回一個(gè)SqlSession。同樣SqlSession也只是一個(gè)繼承了Closeable接口掺逼。
public interface SqlSession extends Closeable
mybatis通過兩個(gè)SqlSessionFactory的實(shí)現(xiàn)
- DefaultSqlSessionFactory
- SqlSessionManager
與之相應(yīng)的有兩個(gè)SqlSession的實(shí)現(xiàn) - DefaultSqlSession
- SqlSessionManager
在我們的test case中,mybatis使用的是DefaultSqlSessionFactory瓤介,所以我們來看DefaultSqlSessionFactory吕喘。在DefaultSqlSessionFactory中,有兩種方式來open session刑桑,
一種是通過datasource來創(chuàng)建transaction氯质,一種是通過connect創(chuàng)建。同時(shí)兩種方式都會(huì)根據(jù)configuration創(chuàng)建executer祠斧,以及transaction的commit方式闻察,然后以參數(shù)形式維護(hù)到sql session中。同樣的兩種方式最終都是指向JdbcTransaction,回歸到最根本的jdbc transaction辕漂。
上面的就是我們mybatis源碼閱讀的開始呢灶,下來我們將學(xué)習(xí)mybatis如何讀取配置初始化環(huán)境。