Mybatis保证同一session及分页插件url

来源:互联网 发布:飞行燃料 支持淘宝 编辑:程序博客网 时间:2024/06/10 07:45
 在ORM持久化框架中,如hibernate、mybatis,与数据库交互的对象是session,而一个操作的完成有的时候可能需要多次使用到session
比如,插入操作,开启事物需要使用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



0 0
原创粉丝点击