MyBatis - SqlSessionFactory和SqlSession简解

【1】SqlSessionFactoryBuilder

这个类可以被初始化、使用和丢弃,如果你已经创建好了一个SqlSessionFactory 后就不用再保留它。

因此,SqlSessionFactoryBuilder 的最好作用域是方法体内

比如说定义一个方法变量。你可以重复使用SqlSessionFactoryBuilder 生成多个SqlSessionFactory 实例,但是最好不要强行保留,因为XML 的解析资源要用来做其它更重要的事。

MyBatis - SqlSessionFactory和SqlSession简解_第1张图片


【2】SqlSessionFactory

一旦创建,SqlSessionFactory 就会在整个应用过程中始终存在。所以没有理由去销毁和再创建它,一个应用运行中也不建议多次创建SqlSessionFactory。

因此SqlSessionFactory最好的作用域是Application。

可以有多种方法实现,最简单的方法是单例模式或者是静态单例模式。然而这也不是广泛赞成和好用的。反而,使用Google Guice 或Spring 来进行依赖反射会更好。这些框架允许你生成管理器来管理SqlSessionFactory 的单例生命周期。


【3】SqlSession

每个线程都有自己的SqlSession 实例,SqlSession 实例是不能被共享,也不是线程安全的。

因此最好使用Request 作用域或者方法体作用域。

不要使用类的静态变量来引用一个SqlSession 实例,甚至不要使用类的一个实例变量来引用。

永远不要在一个被管理域中引用SqlSession

比如说在Servlet 中的HttpSession 中。如果你正在使用WEB 框架,应该让SqlSession 跟随HTTP 请求的相似作用域。也就是说,在收到一个HTTP 请求过后,打开SqlSession,等返回一个回应以后,立马关掉这个SqlSession。

关闭SqlSession 是非常重要的,你必须要确保SqlSession 在finally 方法体中正常关闭。

MyBatis - SqlSessionFactory和SqlSession简解_第2张图片


【4】映射器实例

映射器是你创建绑定映射语句的接口–mapper,映射器接口的实例可以从sqlSession中获得。

那么从技术上来说,映射器实例的最宽范围和sqlSession是相同的。

然而映射器实例的最佳范围是方法范围!

SqlSession sqlSession = sqlSessionFactory.openSession();

try{
	//BlogMapper 是注解dao接口
	BlogMapper mapper = sqlSession.getMapper(BlogMapper.class);
}finally{
	sqlSession.close();
}


【5】创建SQLSessionFactory的几种方式

① 使用resource and reader

String resource = "org/mybatis/example/Configuration.xml";
Reader reader = Resources.getResourceAsReader(resource);
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader);

② 使用InputStream

String resource = "mybatis.xml";
/*MybatisUtils.class.getResourceAsStream(resource)----- it's wrong !!!!
* please distinguish the two up and down 
* */
InputStream inputStream = MybatisUtils.class.getClassLoader().getResourceAsStream(resource);

SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);

你可能感兴趣的:(MyBatis)