在ORM持久化框架中,如hibernate、mybatis,与数据库交互的对象是session,而一个操作的完成有的时候可能需要多次使用到session
比如,插入操作,开启事物需要使用session,与数据库交互保存数据也需要使用session,如果这两个session使用的不同,可能会出现
程序正常运行,返回结果也正确,但是数据库中并未真正插入数据的情况。hibernate在这个问题上有一个解决方案:通过currentSession
方法实现,进入这个方法,可以看到如下代码:
但是在mybatis中并没有像hibernate这样已经封装好的可以获取同一个session的方法,我们可以根据hibernate获取同一session的实现思路给mybatis添加同样的功能。
下面是测试:
输出结果为:
false
比如,插入操作,开启事物需要使用session,与数据库交互保存数据也需要使用session,如果这两个session使用的不同,可能会出现
程序正常运行,返回结果也正确,但是数据库中并未真正插入数据的情况。hibernate在这个问题上有一个解决方案:通过currentSession
方法实现,进入这个方法,可以看到如下代码:
public static final ThreadLocal session = new ThreadLocal();
public static Session currentSession() {
Session s = (Session)session.get();
//open a new session,if this session has none
if(s == null){
s = sessionFactory.openSession();
session.set(s);
}
return s;
}
但是在mybatis中并没有像hibernate这样已经封装好的可以获取同一个session的方法,我们可以根据hibernate获取同一session的实现思路给mybatis添加同样的功能。
public class MybatisUtils {
private static ThreadLocal<SqlSession> local = new ThreadLocal<SqlSession>();
public static SqlSession getSqlSession() throws IOException{
Reader reader = Resources.getResourceAsReader("mybatis-configrations.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(reader);
return sessionFactory.openSession();
}
public static SqlSession getcurrSession() throws IOException{
SqlSession session = local.get();
if(session==null){
session = getSqlSession();
local.set(session);
}
return session;
}
}
下面是测试:
public class MybatisTest {
@Test
public void testSqlSession() throws IOException{
//use openSession method,get the session
SqlSession s1 = MybatisUtils.getSqlSession();
SqlSession s2 = MybatisUtils.getSqlSession();
System.out.println(s1==s2);
//get the same session,use the mock method
SqlSession s3 = MybatisUtils.getcurrSession();
SqlSession s4 = MybatisUtils.getcurrSession();
System.out.println(s3==s4);
}
}
输出结果为:
false
true
mybatis分页插件:
http://git.oschina.net/free/Mybatis_PageHelper