Mybatis分页插件 - PageHelper说明
V3.2.0:
统一返回值为Page<E>(可以直接按List使用),方便在页面使用EL表达式,如${page.pageNum},${page.total}
解决count sql在oracle中的错误
增加了对Hsqldb的支持,主要目的是为了方便测试使用Hsqldb
增加了该项目的一个测试项目Mybatis-Sample,测试项目数据库使用Hsqldb
增加MIT协议
关于startPage方法和RowBounds方式
这个方法的参数为pageNum和pageSize,pageNum为第几页,pageSize为每页数量,在大多数前台框架中,使用这两个参数比较方便。但是这种方式和RowBounds不一致,如果不了解这种区别就会出错,RowBounds中的参数是offset和limit,limit和pageSize一样,offset和pageNum很不一样,offset是起始的行号,是从几个开始,而pageNum是起始的页码,offset = (pageNum-1)*pageSize。由于这种不同的存在,可能会导致一些意外出现,因而,这里希望各位使用分页插件或想使用分页插件说说自己的想法和建议,哪一种方式更好?是否有必要进行统一,以那个为准?
希望各位能在此留下您宝贵的意见(或进入【Issues4】讨论)。
使用方法
将本插件中的两个类Page.java和PageHelper.java放到项目中。
然后在Mybatis的配置xml中配置拦截器插件:
<!-- plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下: properties?, settings?, typeAliases?, typeHandlers?, objectFactory?,objectWrapperFactory?, plugins?, environments?, databaseIdProvider?, mappers? --> <plugins> <!-- packageName为PageHelper类所在包名 --> <plugin interceptor="packageName.PageHelper"> <property name="dialect" value="mysql"/> </plugin> </plugins>
这里的PageHelper要使用完整的类路径,需要加上包路径。
增加dialect属性,使用时必须指定该属性,可选值为oracle,mysql,hsqldb,没有默认值,必须指定该属性。
不支持的情况
对于关联结果查询,使用分页得不到正常的结果,因为只有把数据全部查询出来,才能得到最终的结果,对这个结果进行分页才有效(Mybatis自带的内存分页也无法对这种情况进行正确的分页)。因而如果是这种情况,必然要先全部查询,在对结果处理,这样就体现不出分页的作用了。
相关内容:Mybatis关联结果查询分页方法
Mybatis-Sample项目
这个项目是一个分页插件的测试项目,使用Maven构建,该项目目前提供了4种基本使用方式的测试用例,需要测试Mybatis分页插件的可以clone该项目,该项目中的PageHelper.java和Page两个类不能保证随时和当前项目同步更新,使用时请注意!
项目地址:http://git.oschina.net/free/Mybatis-Sample
引用来自“jiangkeju”的评论
能不能支持 关联查询分页引用来自“jiangkeju”的评论
这个太重要了。不能关联查询的分页 没啥意义啊具体原因你可以看看Mybatis的源码。这是无解的,只能手写SQL。
引用来自“CraneHe”的评论
版本弟啊!引用来自“19岁的天空”的评论
什么年代了,还在用Mybatis支持!感谢分享!
PS to楼主: 有些人会指指点点也很正常,国内的开源环境并不好,需要有更多的奉献精神
PS to吐槽的牛人们: 毕竟人无完人,国外的开源代码也不是行行都写的完美无缺,照样会有错误遗漏.也希望那些有能力能找到代码问题的人可以更积极些,完全可以fork一个分支修改后提交给作者,帮助作者完善项目从而让更多的人受益
引用来自“xmut”的评论
为什么要一直纠结于“关联结果查询”呢?难道是用<collection select="">不行吗?难道是我理解错误???这里写出来是因为有些人不知道为什么自己分页的时候结果不对。。因为他们恰好用的是关联结果查询。
这里只是提醒。
引用来自“Chet_W”的评论
还是自己写PluginAdapter扩展靠谱引用来自“CraneHe”的评论
版本弟啊!引用来自“454071331”的评论
try {//创建SqlSessionFactory
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
//创建数据库
SqlSession session = sqlSessionFactory.openSession();
Connection conn = session.getConnection();
reader = Resources.getResourceAsReader("CreateDB.sql");
ScriptRunner runner = new ScriptRunner(conn);
runner.setLogWriter(null);
runner.runScript(reader);
reader.close();
session.close();
} catch (IOException e) {
e.printStackTrace();
}
没看见关闭Connection 不知道会不会有连接泄露啊
//创建SqlSessionFactory
Reader reader = Resources.getResourceAsReader("mybatis-config.xml");
sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
reader.close();
//创建数据库
SqlSession session = sqlSessionFactory.openSession();
Connection conn = session.getConnection();
reader = Resources.getResourceAsReader("CreateDB.sql");
ScriptRunner runner = new ScriptRunner(conn);
runner.setLogWriter(null);
runner.runScript(reader);
reader.close();
session.close();
} catch (IOException e) {
e.printStackTrace();
}
没看见关闭Connection 不知道会不会有连接泄露啊