MyBatis工具类

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();
        }
        
    }
    
}

 

posted on 2016-12-15 15:47  小尹有个小小梦想  阅读(905)  评论(0)    收藏  举报

导航