`

mybatis学习笔记(一)

 
阅读更多


每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象来获得。SqlSessionFactoryBuilder对象可以通过XML配置文件,或从以往使用惯例中准备好的Configuration类实例中来构建SqlSessionFactory对象。

1、从XML中构建SqlSessionFactory

代码如下:

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

XML配置文件包含对MyBatis系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器。
XML的一个简单的例子:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
	<environments default="development">
		<environment id="development">
			<transactionManager type="JDBC" />
			<dataSource type="POOLED">
				<property name="driver" value="${driver}" />
				<property name="url" value="${url}" />
				<property name="username" value="${username}" />
				<property name="password" value="${password}" />
			</dataSource>
		</environment>
	</environments>
	<mappers>
		<!-- 
			<mapper resource="org/mybatis/example/BlogMapper.xml" />
		 -->
	</mappers>
</configuration>


2、从SqlSessionFactory中获取SqlSession

通过以下代码获得SqlSession实例。

SqlSession session = sqlMapper.openSession();


3、映射SQL语句的XML

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
	"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.mybatis.example.BlogMapper">
	<select id="selectBlog" parameterType="int" resultType="Blog">
		select * from Blog where id = #{id}
	</select>
</mapper>

在命名空间“com.mybatis.example.BlogMapper”中,它定义了一个名为“selectBlog”的映射语句,这样它允许你使用完全限定名“org.mybatis.example.BlogMapper.selectBlog”来调用映射语句。所以,相应的代码写法为:

SqlSession session = sqlMapper.openSession();
try {
	Blog blog = (Blog) session.selectOne("org.mybatis.example.BlogMapper.selectBlog", 101);
} finally {
	session.close();
}

这个命名可以直接映射相同命名空间下的映射器类,使用一个名称,参数和返回值和已映射的查询语句都一样的方法即可。这个命名可以直接映射相同命名空间下的映射器类,使用一个名称,参数和返回值和已映射的查询语句都一样的方法即可。

SqlSession session = sqlSessionFactory.openSession();
try {
	BlogMapper mapper = session.getMapper(BlogMapper.class);
	Blog blog = mapper.selectBlog(101);
} finally {
	session.close();
}

相对于第一种,第二种更简洁。使用合理描述参数和SQL语句返回值的接口(比如BlogMapper.class),这样现在就可以执行更简单,更安全的代码,没有容易发生的字符串文字和转换的错误。


4、范围和生命周期


SqlSessionFactoryBuilder
这个类可以被实例化,使用和丢弃。一旦你创建了SqlSessionFactory后,这个类就不需要存在了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是本地方法变量)。

SqlSessionFactory
一旦被创建,SqlSessionFactory实例应该在你的应用程序执行期间都存在。没有理由来处理或重新创建它。使用SqlSessionFactory的最佳实践是在应用程序运行期间不要重复创建多次。因此SqlSessionFactory的最佳范围是应用范围。有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。然而这两种方法都不认为是最佳实践。考虑依赖注入容器,比如Google Guice或Spring。这样的框架允许你创建支持程序来管理单例SqlSessionFactory的生命周期。

SqlSession
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能共享使用,它也是线程不安全的。因此最佳的范围是请求或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Serlvet架构中的HttpSession。
基于收到的HTTP请求,你可以打开了一个SqlSession,然后返回响应,就可以关闭它了。关闭Session很重要,你应该确保使用finally块来关闭它。下面的示例就是一个确保SqlSession关闭的基本模式:
SqlSession session = sqlSessionFactory.openSession();
try {
// do work
} finally {
session.close();
}

映射器实例
映射器是你创建绑定映射语句的接口。映射器接口的实例可以从SqlSession中获得。那么从技术上来说,当被请求时,任意映射器实例的最宽范围和SqlSession是相同的。然而,映射器实例的最佳范围是方法范围。也就是说,它们应该在使用它们的方法中被请求,然后就抛弃掉。
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
// do work
} finally {
session.close();
}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics