Mybatis_11_Mybatis核心对象的生命周期和创建一个Mybatis工具类

Mybatis核心对象的生命周期

  • SqlSessionFactoryBuilder

     - 该类可以被实例化,使用和丢弃,一旦创建了SqlSessionFactory对象,那么就不再需要SqlSessionFactoryBuilder了
    
  • SqlSessionFactory

     - 该类一旦被实例化,就应该在程序运行期间一直存在,没有任何理由对它进行清除或者重建,使用静态代码块进行创建。
    
     - 对于一个应用来说,整个web容器中只有一个SqlSessionFactory对象化该对象只能创建一次,应该在类加载的时候创建。
    
  • SqlSession

    - 每个线程都应该有自己的SqlSession对象,SqlSession不是线程安全的,因此不能被共享,所以它最佳的作用域是请求或方法作用域。
    
    - 一个线程一个Connection,一个线程一个sqlSession
    
  • 怎么保证把Connection 和 SqlSession对象放在ThreadLocal中?

    - 创建一个ThreadLocal,然后使用ThreadLocal的set()方法将 SqlSession对象放到ThreadLocal中,然后使用get()方法获取
    
        private  static ThreadLocal<SqlSession> local = new ThreadLocal<>();
    
  • 创建一个Mybatisutil工具类 代码:

    
        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;
    
    
        public class MybatisUtil {
    
            //工具类的构造方法一般都是私有化的,因为工具类的使用不需要实例化,用类名.就可以引用
            private MybatisUtil(){}
    
            private  static ThreadLocal<SqlSession> local = new ThreadLocal<>();
            private static SqlSessionFactory sqlSessionFactory;
    
    
    
            /**
             * 在类加载的时候初始化SqlSessionFactory对象,只初始化一次。
             */
            static {
                try {
                    sqlSessionFactory=new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("Mybatis-config"));
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
    
    
    
            /**
             * 获取当前线程中的SqlSession对象
             * @return
             */
    
            public static SqlSession getCurrentSqlSession(){
                SqlSession sqlSession=local.get();
                if (sqlSession==null){
                 sqlSession=sqlSessionFactory.openSession();
                 local.set(sqlSession); // 将SqlSession对象和线程T1进行绑定
                }
               return  sqlSession;
            }
    
    
            /**
             * 回滚事务
             * @param sqlSession
             */
            public static void rollback(SqlSession sqlSession){
                if(sqlSession!=null) {
                    sqlSession.rollback();
                }
    
            }
    
            /**
             * 关闭当前SqlSession,释放资源
             * @param sqlSession
             */
            public static void close(SqlSession sqlSession){
                if(sqlSession!=null){
                    sqlSession.close();
                    local.remove(); //Tomcat服务器自带线程池,用过的线程t1,下一次可能还会使用t1,所以这里相当于解绑。
                }
    
            }
        }
    
    
    
    
posted @ 2021-04-28 21:56  失昼  阅读(81)  评论(0)    收藏  举报