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

来源:互联网 发布:药店服务论文数据分析 编辑:程序博客网 时间:2024/06/03 23:02
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;
}
}
原创粉丝点击