1.SqlSessionFactory
SqlSessionFactory是MyBatis的关键对象,它是个单个数据库映射关系经过编译后的内存镜像。SqlSessionFactory对象的实例可以通过SqlSessionFactoryBuilder对象类获得,而SqlSessionFactoryBuilder则可以从XML配置文件或一个预先定制的Configuration的实例构建出SqlSessionFactory的实例。每一个MyBatis的应用程序都以一个SqlSessionFactory对象的实例为核心。同时SqlSessionFactory也是线程安全的,SqlSessionFactory一旦被创建,应该在应用执行期间都存在。在应用运行期间不要重复创建多次,建议使用单例模式。SqlSessionFactory是创建SqlSession的工厂。
注意:openSession()的方法的参数为boolean时,如果传入true表示关闭事务控制,自动提交事务。如果传入false表示开启事务控制。若不传参数,默认为false;
openSession每次可以获得一个新的SqlSession实例。如下代码:
String resource = "mybatis-config.xml";
Configuration config = null;
try {
XMLConfigBuilder configBuilder = new XMLConfigBuilder(Resources.getResourceAsStream(resource));
config = configBuilder.parse();
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(config);
SqlSession session1 = sessionFactory.openSession();
SqlSession session2 = sessionFactory.openSession();
System.out.println(session1 == session2);
} catch (Exception ex) {
ex.printStackTrace();
}
运行结果:
false
SqlSessionFactory的单例实现。
package com.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SqlSessionFactoryUtil {
private static SqlSessionFactory sqlSessionFactory;
private static final Class CLASS_LOCK = SqlSessionFactoryUtil.class;
/**
* 私有化构造
*/
private SqlSessionFactoryUtil() {
}
/*
* 单实例对象
*/
public static SqlSessionFactory initSqlSessionFactory() {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
synchronized (CLASS_LOCK) {
if (sqlSessionFactory == null) {
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
}
return sqlSessionFactory;
}
public static SqlSession openSqlSession() {
if (sqlSessionFactory == null) {
initSqlSessionFactory();
}
return sqlSessionFactory.openSession();
}
}
测试单例效果:
public class SqlSessionFactoryUtilTest {
@Test
public void testSqlSessionFactoryUtil(){
SqlSessionFactory sqlSessionFactory1 = SqlSessionFactoryUtil.initSqlSessionFactory();
SqlSessionFactory sqlSessionFactory2 = SqlSessionFactoryUtil.initSqlSessionFactory();
System.out.println(sqlSessionFactory1 == sqlSessionFactory2);
}
}
运行结果:
true
2.SqlSession
SqlSession是MyBatis的关键对象,是执行持久化操作的独享,类似于JDBC中的Connection.它是应用程序与持久层之间执行交互操作的一个单线程对象,也是MyBatis执行持久化操作的关键对象。SqlSession对象完全包含以数据库为背景的所有执行SQL操作的方法,它的底层封装了JDBC连接,可以用SqlSession实例来直接执行被映射的SQL语句。每个线程都应该有它自己的SqlSession实例。SqlSession的实例不能被共享,同时SqlSession也是线程不安全的,绝对不能讲SqlSeesion实例的引用放在一个类的静态字段甚至是实例字段中。也绝不能将SqlSession实例的引用放在任何类型的管理范围中,比如Servlet当中的HttpSession对象中。使用完SqlSeesion之后关闭Session很重要,应该确保使用finally块来关闭它。
一个规范的SqlSession创建与释放过程实例代码如下:
String resource = "mybatis-config.xml";
Configuration config = null;
SqlSession session=null;
try {
XMLConfigBuilder configBuilder = new XMLConfigBuilder(Resources.getResourceAsStream(resource));
config = configBuilder.parse();
//构建sqlSession的工厂
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(config);
session = sessionFactory.openSession();
String statement = "com.mapper.usersMapper.getUser";//映射sql的标识字符串
//执行查询返回一个唯一user对象的sql
Users user = session.selectOne(statement, 3);
System.out.println(user);
}catch(Exception ex){
ex.printStackTrace();
}finally{
session.close();
}