有关Mybatis创建线程会话的工具类

本文介绍了一个用于MyBatis的会话工厂类实现,包括如何初始化SqlSessionFactory、开启和关闭SqlSession,以及如何获取线程绑定的SqlSession实例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

import java.io.IOException;
import java.io.InputStream;


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 MyBatisSessionFactory {


private static SqlSessionFactory sqlSessionFactory;
private static ThreadLocal<SqlSession> sqlSessionVar = new ThreadLocal<>();


static {
String resource = "mybatis-config.xml";
InputStream inputStream;
try {
inputStream = Resources.getResourceAsStream(resource);
// 根据配置生成一个sessionFactory,对应一个数据库
sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);
} catch (IOException e) {
e.printStackTrace();
}
}


/**
* 给过滤器调用,在开始之前(doFilter之前)调用该方法,并保存返回值

* @return
*/
public static boolean openSession() {
SqlSession sqlSession = sqlSessionVar.get();
// 如果线程中没有SqlSession的变量,创建一个并保存到线程中
if (sqlSession == null) {
sqlSession = sqlSessionFactory.openSession();
sqlSessionVar.set(sqlSession);
return true;
} else {
return false;
}
}


/**
* 创建一个不使用线程变量的SqlSession

* @return
*/
public static SqlSession openSessionWithoutThreadLocal() {
SqlSession sqlSession = sqlSessionFactory.openSession();
return sqlSession;
}


/**
* 关闭线程中的SqlSession
*/
public static void closeSession() {
SqlSession sqlSession = sqlSessionVar.get();
// 如果线程中没有SqlSession的变量,创建一个并保存到线程中
if (sqlSession != null) {
sqlSession.close();
// 关闭会话以后,要把session从线程中删除掉
sqlSessionVar.remove();
}
}


/**
* 获取一个数据库会话,因为此方法不创建会话,因为也不要在使用以后自行关闭会话。

* @return
*/
public static SqlSession getSession() {
SqlSession sqlSession = sqlSessionVar.get();
if (sqlSession == null) {
throw new RuntimeException("会话过滤器未起作用,请通过会话过滤器过滤后再访问业务代码");//可根据自己需求创建异常类
}
return sqlSession;
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值