從上文的最終測試類,可以發(fā)現(xiàn)最終主要涉及到幾個(gè)類:Resources,SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession.本文希望通過對這幾個(gè)類進(jìn)行說明,來了解一下mybatis的聲明周期.
先了解一下這幾個(gè)類主要做了什么
- Resources
讀取配置文件的工具類. - SqlSessionFactoryBuilder
構(gòu)建SqlSessionFactory. - SqlSessionFactory
mybatis應(yīng)用的中心,一般一個(gè)mybatis的應(yīng)用實(shí)例對應(yīng)一個(gè)SqlSessionFactory.一旦被創(chuàng)建,在應(yīng)用的運(yùn)行期間就會一直存在.而且最佳實(shí)踐是在應(yīng)用運(yùn)行期間不要重復(fù)創(chuàng)建. - SqlSession
完全包含了面向數(shù)據(jù)庫執(zhí)行SQL命令所需的所有方法.
mybatis的生命周期
- 從config.xml配置文件中構(gòu)建SqlSessionFactory
private static SqlSessionFactory sqlSessionFactory;
static {
try {
Reader reader = Resources.getResourceAsReader("config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
} catch (IOException e) {
e.printStackTrace();
}
}
- 從SqlSessionFactory中獲取SqlSession
SqlSession sqlSession = sqlSessionFactory.openSession();
- 通過SqlSession執(zhí)行sql查詢語句,并將sql查詢結(jié)果映射到j(luò)ava對象
try {
Student student = sqlSession.selectOne("com.yongssu.mybatis.demo1.StudentMapper.selectStudentById", 1);
System.out.println(student);
} finally {
sqlSession.close();
}
通過跟蹤分析源碼,發(fā)現(xiàn)selectOne最終執(zhí)行了了這么一個(gè)函數(shù).
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
try {
// 通過配置文件獲取執(zhí)行sql,參數(shù)以及映射對象
MappedStatement ms = configuration.getMappedStatement(statement);
// 執(zhí)行查詢并進(jìn)行結(jié)果映射
return executor.query(ms, wrapCollection(parameter), rowBounds, Executor.NO_RESULT_HANDLER);
} catch (Exception e) {
throw ExceptionFactory.wrapException("Error querying database. Cause: " + e, e);
} finally {
ErrorContext.instance().reset();
}
}