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,所以这里相当于解绑。 } } }