package util;
import java.io.Reader;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
/**
* MyBatis工具类
* @author 尹涛
*
*/
public class MyBatisUtil {
// 私有静态配置文件名称,必须与mybatis的配置文件同名
private static final String RESOURCE = "mybatis-config.xml";
// 定义私有静态SqlSession工厂对象
private static SqlSessionFactory sqlSessionFactory = null;
// 定义私有静态当前线程泛型对象
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>();
// 静态域,使用该类时,自动加载该语句块
static{
// 定义Reader对象,用于读取配置文件
Reader reader = null;
// 异常处理
try {
// 读取配置文件
reader = Resources.getResourceAsReader(RESOURCE);
// 创建SqlSession工厂解析器对象
SqlSessionFactoryBuilder sqlSessionFacotryBuilder = new SqlSessionFactoryBuilder();
// 解析配置文件,实例化SqlSession工厂对象
sqlSessionFactory = sqlSessionFacotryBuilder.build(reader);
} catch (Exception e) {
// 手动抛出异常
throw new ExceptionInInitializerError("初始化MyBatis错误");
}
}
// 获取SQLSession工厂对象
public static SqlSessionFactory getSqlSessionFactory(){
return sqlSessionFactory;
}
// 获取SqlSession对象
public static SqlSession getSession(){
/*
* threadLocal的get()方法根据当前线程返回其对应的线程内部变量
* 也就是我们需要的SqlSession,多线程情况下共享数据库连接是不安全的
* ThreadLocal保证了每个线程都有自己的SqlSession
*/
SqlSession session = threadLocal.get();
// 验证session是否为空、null, 如果为true则打开一个新的session
if (session == null) {
// 使用工厂对象创建SqlSession对象
// 或者使用三元表达式:(sqlSessionFactory!=null?sqlSessionFactory.openSession():null)
session = sqlSessionFactory.openSession();
// 将新建的session对象添加到当前线程中
threadLocal.set(session);
}
// 返回session
return session;
}
// 关闭对象,释放资源
public static void closeSession(){
// 获取当前线程中的session对象
SqlSession session = threadLocal.get();
// 将线程中的session对象清空
threadLocal.set(null);
// 判断session是否为null
if (session != null) {
// 关闭对象
session.close();
}
}
}