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,所以这里相当于解绑。
}
}
}
Mybatis_11_Mybatis核心对象的生命周期和创建一个Mybatis工具类
原文:https://www.cnblogs.com/szqengr/p/14715959.html