【Mybatis】| 如何创建MyBatis的工具类
目录
- 🌟更多专栏请点击👇
- 一、前言
- 二、实现过程
- 1. 创建一个ThreadLocal对象
- 2. 初始化SqlSessionFactory
- 3. 获取并存储sqlSession对象
- 4. 关闭sqlSession对象
- 三、 总代码
🌟更多专栏请点击👇
专栏 | 名字 |
---|---|
🔥Elasticsearch专栏 | es |
🔥spring专栏 | spring开发 |
redis专栏 | redis学习笔记 |
🔥项目专栏 | 项目集锦 |
修bug专栏 | bug修理厂 |
一、前言
使用MyBatis框架在持久层操作中,如果多个DML操作都属于一个事务,因为commit()和rollback()都是SqlSession完成的,所以必须保证只使用一个SqlSession,但是不同的DML操作可能在不同类的不同方法中,每个方法都需要获取SqlSession,所以应该如何在多个DML操作中保证使用同一个SqlSession呢?
二、实现过程
1. 创建一个ThreadLocal对象
下面给大家带来了一个工具类:ThreadLocal,它可以储存SqlSession对象,并且保证一个线程只使用一个SqlSession。现在来学习一下如何创建MyBatis这个工具类
首先需要new一个ThreadLocal对象,以便存储SqlSession:
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();
2. 初始化SqlSessionFactory
在一个静态代码块中初始化SqlSessionFactory:
static {//创建SqlSessionFactoryInputStream is = null;try {is = Resources.getResourceAsStream("mybatis-cfg.xml");} catch (IOException e) {e.printStackTrace();}sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);}
3. 获取并存储sqlSession对象
接下来就是从ThreadLocal中获取sqlSession对象,并且使用ThreadLocal存储该对象:
tips:存储SqlSession的时候要判断该对象是否为空,要是为空就要获取一个,然后再存到ThreadLocal,返回一个SqlSession。
//获取SqlSessionpublic static SqlSession getSqlSession(){SqlSession sqlSession = threadLocal.get(); if(sqlSession == null){sqlSession = sqlSessionFactory.openSession(); threadLocal.set(sqlSession); }return sqlSession;}
4. 关闭sqlSession对象
接下来也可以在该工具类写关闭sqlSession方法
//关闭sqlSessionpublic static void closeSqlSession(){SqlSession sqlSession = threadLocal.get();if (sqlSession != null){ sqlSession.close();threadLocal.set(null);}}
三、 总代码
public class MyBatisUtils {private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();private static SqlSessionFactory sqlSessionFactory = null;static {//创建SqlSessionFactoryInputStream is = null;try {is = Resources.getResourceAsStream("mybatis-cfg.xml");} catch (IOException e) {e.printStackTrace();}sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);}//获取SqlSessionpublic static SqlSession getSqlSession(){SqlSession sqlSession = threadLocal.get(); if(sqlSession == null){sqlSession = sqlSessionFactory.openSession(); threadLocal.set(sqlSession); }return sqlSession;}//关闭sqlSessionpublic static void closeSqlSession(){SqlSession sqlSession = threadLocal.get();if (sqlSession != null){ sqlSession.close();threadLocal.set(null);}}
}