1)在靜態初始化塊中加載mybatis配置文件和StudentMapper.xml文件一次
2)使用ThreadLocal對象讓當前線程與SqlSession對象綁定在一起
3)獲取當前線程中的SqlSession對象,如果沒有的話,從SqlSessionFactory對象中獲取SqlSession對象
4)獲取當前線程中的SqlSession對象,再將其關閉,釋放其占用的資源
package loaderman; import java.io.IOException; import java.io.Reader; import java.sql.Connection; 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 MybatisUtil { private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); private static SqlSessionFactory sqlSessionFactory; /** * 加載位於src/mybatis.xml配置文件 */ static{ try { Reader reader = Resources.getResourceAsReader("mybatis.xml"); sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException(e); } } /** * 禁止外界通過new方法創建 */ private MybatisUtil(){} /** * 獲取SqlSession */ public static SqlSession getSqlSession(){ //從當前線程中獲取SqlSession對象 SqlSession sqlSession = threadLocal.get(); //如果SqlSession對象為空 if(sqlSession == null){ //在SqlSessionFactory非空的情況下,獲取SqlSession對象 sqlSession = sqlSessionFactory.openSession(); //將SqlSession對象與當前線程綁定在一起 threadLocal.set(sqlSession); } //返回SqlSession對象 return sqlSession; } /** * 關閉SqlSession與當前線程分開 */ public static void closeSqlSession(){ //從當前線程中獲取SqlSession對象 SqlSession sqlSession = threadLocal.get(); //如果SqlSession對象非空 if(sqlSession != null){ //關閉SqlSession對象 sqlSession.close(); //分開當前線程與SqlSession對象的關系,目的是讓GC盡早回收 threadLocal.remove(); } } /** * 測試 */ public static void main(String[] args) { Connection conn = MybatisUtil.getSqlSession().getConnection(); System.out.println(conn!=null?"連接成功":"連接失敗"); } }