Mybatis学习(1)_ 入门
1.入门
每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。SqlSessionFactory对象的实例通过SqlSessionFactoryBuilder对象来获得。SqlSessionFactoryBuilder对象可以从XML配置文件或从Configuration类的实例中构建SqlSessionFactory对象。
1.1从XML中构建SqlSessionFactory
从XML文件中构建SqlSessionFactory实例非常简单。这里建议使用类路径下的XML文件来配置,你也可以使用任意的Reader实例,这个实例可以使用文件形式的文件路径或URL形式的路径file://来创建。
1 //从配置文件中得到SQLMapConfig.xml文件
2 String resource = "sqlMapConfig.xml";
3 InputStream inputStream = Resources.getResourceAsStream(resource);
4 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
XML配置文件包含对MyBatis系统的核心设置,包含获取数据库连接实例的数据源和决定事务范围和控制的事务管理器。
<?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>
1.2不使用XML构建SqlSessionFactory(不建议)
MyBatis也可以不使用XML文件来构建SqlSessionFactory,MyBatis提供了完整的配置类。
DataSource dataSource = BlogDataSourceFactory.getBlogDataSource();
TransactionFactory transactionFactory = new JdbcTransactionFactory();
Environment environment = new Environment("development", transactionFactory, dataSource);
Configuration configuration = new Configuration(environment);
configuration.addMapper(BlogMapper.class);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(configuration);
注意这种情况下配置是添加映射类。映射类是 Java 类,这些类包含 SQL 映射语句的注 解从而避免了 XML 文件的依赖, XML 映射仍然在大多数高级映射 (比如: 嵌套 Join 映射) 时需要。出于这样的原因,如果存在 XML 配置文件的话,MyBatis 将会自动查找和加载一 个对等的 XML 文件(这种情况下,基于类路径下的 BlogMapper.class 类的类名,那么 BlogMapper.xml 将会被加载)。
2.从SqlSessionFactory中获取SqlSession
现在获取了SqlSessionFactory对象,这样我们就可以获取SqlSession的实例了。SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法。你可以使用SqlSession实例来直接执行以映射的SQL语句。如:
SqlSession session = sqlSessionFactory.openSession();
try{
List list=session.selectList("com.slt.ibatis.model.User.selectAllUsers");
} finally{
session.close();
}
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">
<sqlMap>
<typeAlias alias="User" type="com.slt.ibatis.model.User"/>
<select id="selectAllUsers" resultClass="User">
select * from user
</select>
</sqlMap>
3.范围和生命周期
3.1 SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃。一旦你创建了SqlSessionFactory后,这个类就不需要存在了。因此SqlSessionFactoryBuilder实例的最佳范围是方法范围(也就是本地方法变量)。你可以重用SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例。
3.2 SqlSessionFactory
一旦被创建,SqlSessionFactory应该在你的应用执行期间都存在。没有理由来处理或重新创建它。使用SqlSessionFactory的最佳实践是在应用期间不要重复创建多次。多次创建是非常消耗资源的(非常不推荐)。因此SqlSessionFactory的最佳范围是应用范围。可以使用单例模式或者静态单例模式。
3.3 SqlSession
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享,也是线程不安全的。因此最佳的范围是请求范围或方法范围。绝对不能将SqlSession实例的引用放在一个类的静态字段甚至是实例字段中。也不能将SqlSession实例的引用放在任何类型的管理范围中,比如Serlvet架构中的Session中。如果你现在正用任意的Web框架,要考虑SqlSession放在一个和HTTP请求对象的范围内,也就是说:基于收到HTTP请求,你可以打开一个SqlSession,然后返回响应,就可以关闭它了。关闭SqlSession很重要,你应该确保使用finally块来关闭它。例如(确保SqlSession关闭的基本模式):
SqlSession session = sqlSessionFactory.openSession();
try{
//对数据库执行操作
}finally{
session.close();
}
3.4 Mapper实例
映射器是你创建绑定映射语句的接口,映射器接口的实例可以从SqlSession中获得。映射器实例的最宽范围和SqlSession是相同的。然而,映射器实例的最佳范围是方法范围。也即是说,它们应该在使用它们的方法中被请求,然后就弃掉。它们不需要明确地关闭,那么在请求对象中保留它们就不是什么问题了,这和SqlSession相似。
SqlSession session = sqlSessionFactory.openSession();
try {
BlogMapper mapper = session.getMapper(BlogMapper.class);
// do work
} finally {
session.close();
}
如果使用Spring框架,那么可以不考虑SqlSession的范围了。÷