从上文的最终测试类,可以发现最终主要涉及到几个类:Resources,SqlSessionFactoryBuilder,SqlSessionFactory,SqlSession.本文希望通过对这几个类进行说明,来了解一下mybatis的声明周期.
先了解一下这几个类主要做了什么
- Resources
读取配置文件的工具类. - SqlSessionFactoryBuilder
构建SqlSessionFactory. - SqlSessionFactory
mybatis应用的中心,一般一个mybatis的应用实例对应一个SqlSessionFactory.一旦被创建,在应用的运行期间就会一直存在.而且最佳实践是在应用运行期间不要重复创建. - SqlSession
完全包含了面向数据库执行SQL命令所需的所有方法.
mybatis的生命周期
- 从config.xml配置文件中构建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执行sql查询语句,并将sql查询结果映射到java对象
try {
Student student = sqlSession.selectOne("com.yongssu.mybatis.demo1.StudentMapper.selectStudentById", 1);
System.out.println(student);
} finally {
sqlSession.close();
}
通过跟踪分析源码,发现selectOne最终执行了了这么一个函数.
public <E> List<E> selectList(String statement, Object parameter, RowBounds rowBounds) {
try {
// 通过配置文件获取执行sql,参数以及映射对象
MappedStatement ms = configuration.getMappedStatement(statement);
// 执行查询并进行结果映射
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();
}
}