SQLSessionFactoryBuilder
SQLSessionFactoryBuilder是利用XML或者Java编码获得资源来构建SqlSessionFactory的,通过它可以构建多个SessionFactory。它的作用就是一个构建器,一旦构建了SqlSessionFactory,它的作用就已经完结,失去了存在的意义,这时我们就应该毫不犹豫的废弃它,将它回收。所以它的生命周期只存在于方法的局部,它的作用是生成SqlSessionFactory对象。
SqlSessionFactory
SqlSessionFactory的作用是创建SqlSession。每次应用程序需要访问数据库,我们就要通过SqlSessionFactory创建SqlSession,所以SqlSessionFactory应该在MyBatis应用的整个生命周期中。而如果我们多次创建同一个数据库的SqlSessionFactory,则每次创建SqlSessionFactory会打开更多的数据库连接,那么连接资源就很快被耗尽,因此SqlSessionFactory的责任是唯一的,它的责任就是创建SqlSession,所以我们采用单例模式。
SqlSession
SqlSession是一个会话,它的生命周期应该在请求数据库处理事务的过程中。它是一个线程不安全的对象。每次创建的SqlSession都必须及时关闭它,它长期存在就会使数据库连接池的活动资源减少,对系统的性能影响很大。因此常在finally块关闭SqlSession。它存活于一个应用的请求和操作,可以执行多条SQL,保证事务的一致性。
Mapper
Mapper是一个接口,而没有任何实现类,它的作用是发送SQL,然后返回我们需要的结果,或者执行SQL从而修改数据库的数据,因此它应该在一个SqlSession事务方法之内,是一个方法级别的东西。
以下是创建SqlSessionFactory以及SqlSession的方法:
public class SqlSessionFactoryUtil {
private static SqlSessionFactory sqlSessionFactory = null;
private SqlSessionFactoryUtil() {
}
//双重检查方式实现单例
public static SqlSessionFactory getInstance() {
String resource = "mybatis-config.xml";
InputStream in = null;
try {
in = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
if (sqlSessionFactory == null) {
// 添加了一个类锁
synchronized (SqlSessionFactoryUtil.class) {
if (sqlSessionFactory == null) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(in);
}
}
}
return sqlSessionFactory;
}
/**
* 打开SqlSession
*/
public static SqlSession openSqlSession() {
if (sqlSessionFactory == null) {
sqlSessionFactory = getInstance();
}
return sqlSessionFactory.openSession();
}
}
参考文献:
深入浅出MyBatis技术原理与实战