package com.rlovep.util; 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; /** * * @ClassName: MyBatisUtil * @Description: 创建单例工厂,可以获得线程session * @author peace w_peace12@163.com * @date 27 Mar 2016 10:01:45 pm * */ public class MyBatisUtil { // 创建线程独立的session private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); // 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); } } /** * * <p> * Title: * </p> * <p> * Description:禁止外界new 该工具类 * </p> */ private MyBatisUtil() { } /** * 获取session,线程独立 */ 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?"连接成功":"连接失败"); } }