之前用的一种:
public class JDBCUtils {
private static SqlSessionManager sqlSessionManager = null;
static{
Reader resourceAsReader = null;
try {
resourceAsReader = Resources.getResourceAsReader("Configuration.xml");
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionManager = SqlSessionManager.newInstance(resourceAsReader);
try {
if(resourceAsReader!=null) {
resourceAsReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
private JDBCUtils(){}
/**
* 非事务
* @return
*/
public static SqlSession getSqlSession(){
return getSqlSessionManager().openSession(true);
}
/**
* 事务sqlSession
* @return
*/
public static SqlSessionManager getSqlSessionManager(){
return sqlSessionManager;
}
}
SqlManager(org.apache.ibatis.session.SqlSessionManager)是mybatis帮我们封装了事务的类。
上面是之前用的,后来又借鉴别人的用ThreadLocal重新封装了一个。
public class JDBCUtils { private static ThreadLocal<SqlSession> threadLocal = new ThreadLocal<SqlSession>(); private static SqlSessionFactory sqlSessionFactory=null; static{ Reader resourceAsReader = null; try { resourceAsReader = Resources.getResourceAsReader("Configuration.xml"); } catch (IOException e) { e.printStackTrace(); throw new RuntimeException("读取配置文件异常"); } sqlSessionFactory = new SqlSessionFactoryBuilder().build(resourceAsReader); if(resourceAsReader!=null) { try { resourceAsReader.close(); } catch (IOException e) { e.printStackTrace(); } } } private JDBCUtils() { } public static SqlSession getSqlSession(){ SqlSession sqlSession = threadLocal.get(); if(sqlSession==null){ sqlSession = sqlSessionFactory.openSession(false); threadLocal.set(sqlSession); } return sqlSession; } /** * 产生动态代理的sqlSession对象,修改原来的commit与rollback方法 * @return */ public static SqlSession getProxySqlsession(){ final SqlSession sqlSession = getSqlSession(); SqlSession proxySqlSession = (SqlSession)Proxy.newProxyInstance(sqlSession.getClass().getClassLoader(), new Class[]{SqlSession.class}, new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if(method.getName().equals("commit")){ Object invoke = method.invoke(sqlSession, args); close(sqlSession); return invoke; } else if(method.getName().equals("rollback")){ Object invoke = method.invoke(sqlSession, args); close(sqlSession); return invoke; } else if(method.getName().equals("close")){ close(sqlSession); return null; } else{ return method.invoke(sqlSession,args); } } }); return proxySqlSession; } public static void close(SqlSession sqlSession) { if(sqlSession!=null) { sqlSession.close(); threadLocal.remove(); if(threadLocal!=null){ threadLocal.set(null); } } } }至于哪种更好,只能靠小伙伴自己去判断了。