Mybatis核心类生命周期和管理

Mybatis核心类生命周期和管理

原文链接:https://blog.csdn.net/qq1134550437/article/details/51960480

1、SqlSessionFactoryBuilding

  这个类可以被实例化、使用和丢弃。一但创建了SqlSessionFactory后,这个类就不需要存在 了,因此sqlsessionfactorybuilder 实例的最佳作用域是方法范围(即作为方法的变量)

2、SqlSessionFactory

  SqlSessionFactory,顾名思义就是获取SqlSession对象的工厂,功能类似于jdbc中加载数据库驱动。所以sqlsessionfactory对象一但被创建,应该在应用执行期间都存在,因此sqlsessionfactory的最佳作用域是应用范围,建议定义为静态变量。

3、sqlsession

  sqlsession类似于jdbc的connection对象,每个线程都因该有自己的sqlsession 实例。sqlsesion的实例,sqlsession的实例不能共享,他是 线程不安全的,因此最佳作用域是请求或方法范围,sqlsession对象能够执行数据库的增删改查操作,因此在使用后应该关闭,并保存使用finally快来关闭。

package util;

import java.io.IOException;
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;

public class MyBatisUtil {

    private MyBatisUtil() {
    }

    private static final String RESOURCE = "config.xml";
    private static SqlSessionFactory sqlSessionFactory = null;
    private static ThreadLocal<SqlSession> threadlocal = new ThreadLocal<SqlSession>();
    static {
        Reader reader = null;
        try {
            reader = Resources.getResourceAsReader(RESOURCE);// 读取映射文件
            SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
            sqlSessionFactory = builder.build(reader);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            throw new ExceptionInInitializerError("初始化MyBatis错误");
        }

    }

    public static SqlSessionFactory getSqlSessionFactory() {

        return sqlSessionFactory;
    }

    public static SqlSession getSession() {

        SqlSession session = threadlocal.get();

        // 如果session为null,则打开一个新的session

        if (session == null) {
            session = (sqlSessionFactory != null) ? sqlSessionFactory
                    .openSession() : null;
            threadlocal.set(session);
        }
        return session;
    }

    public static void closeSession() {

        SqlSession session = (SqlSession) threadlocal.get();
        threadlocal.set(null);
        if (session != null) {
            session.close();
        }
    }
}

 

posted @ 2018-05-15 17:24  寻水的小鱼  阅读(445)  评论(0编辑  收藏  举报