晾衣架 東莞網(wǎng)站建設(shè)百度一下點(diǎn)擊搜索
目錄
- 🌟更多專欄請(qǐng)點(diǎn)擊👇
- 一、前言
- 二、實(shí)現(xiàn)過程
- 1. 創(chuàng)建一個(gè)ThreadLocal對(duì)象
- 2. 初始化SqlSessionFactory
- 3. 獲取并存儲(chǔ)sqlSession對(duì)象
- 4. 關(guān)閉sqlSession對(duì)象
- 三、 總代碼
🌟更多專欄請(qǐng)點(diǎn)擊👇
專欄 | 名字 |
---|---|
🔥Elasticsearch專欄 | es |
🔥spring專欄 | spring開發(fā) |
redis專欄 | redis學(xué)習(xí)筆記 |
🔥項(xiàng)目專欄 | 項(xiàng)目集錦 |
修bug專欄 | bug修理廠 |
一、前言
使用MyBatis框架在持久層操作中,如果多個(gè)DML操作都屬于一個(gè)事務(wù),因?yàn)閏ommit()和rollback()都是SqlSession完成的,所以必須保證只使用一個(gè)SqlSession,但是不同的DML操作可能在不同類的不同方法中,每個(gè)方法都需要獲取SqlSession,所以應(yīng)該如何在多個(gè)DML操作中保證使用同一個(gè)SqlSession呢?
二、實(shí)現(xiàn)過程
1. 創(chuàng)建一個(gè)ThreadLocal對(duì)象
下面給大家?guī)砹艘粋€(gè)工具類:ThreadLocal,它可以儲(chǔ)存SqlSession對(duì)象,并且保證一個(gè)線程只使用一個(gè)SqlSession?,F(xiàn)在來學(xué)習(xí)一下如何創(chuàng)建MyBatis這個(gè)工具類
首先需要new一個(gè)ThreadLocal對(duì)象,以便存儲(chǔ)SqlSession:
private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<>();
2. 初始化SqlSessionFactory
在一個(gè)靜態(tài)代碼塊中初始化SqlSessionFactory:
static {//創(chuàng)建SqlSessionFactoryInputStream is = null;try {is = Resources.getResourceAsStream("mybatis-cfg.xml");} catch (IOException e) {e.printStackTrace();}sqlSessionFactory = new SqlSessionFactoryBuilder().build(is);}
3. 獲取并存儲(chǔ)sqlSession對(duì)象
接下來就是從ThreadLocal中獲取sqlSession對(duì)象,并且使用ThreadLocal存儲(chǔ)該對(duì)象:
tips:存儲(chǔ)SqlSession的時(shí)候要判斷該對(duì)象是否為空,要是為空就要獲取一個(gè),然后再存到ThreadLocal,返回一個(gè)SqlSession。
//獲取SqlSessionpublic static SqlSession getSqlSession(){SqlSession sqlSession = threadLocal.get(); if(sqlSession == null){sqlSession = sqlSessionFactory.openSession(); threadLocal.set(sqlSession); }return sqlSession;}
4. 關(guān)閉sqlSession對(duì)象
接下來也可以在該工具類寫關(guān)閉sqlSession方法
//關(guān)閉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 {//創(chuàng)建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;}//關(guān)閉sqlSessionpublic static void closeSqlSession(){SqlSession sqlSession = threadLocal.get();if (sqlSession != null){ sqlSession.close();threadLocal.set(null);}}
}