十, Mybatis之PageHelper分页插件
一,PageHelper原理:
在执行原有要sql的基础上进行分析,自动生成分页以及select count(*)这样的语句,因为涉及对原始sql的分析和解析,所以交给了jsqlparser这个sql解释器组件,所有必须要对其进行引用,具体的sql执行过程在执行后即可查看。
二,PageHelper使用流程
-
maven引入PageHelop和jsqlparser
注意:pagehelper5.1.10后,因为采用了新的api,jsqlparser版本必须是2.0及以上的才可以适配
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.10</version>
</dependency>
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>2.0</version>
</dependency>
- mybatis-config.xml增加Plugins配置
<plugins>
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<!--指定对应的数据库,这个可以不写,插件会自动识别,但是严谨角度建议还是写一下-->
<property name="helperDialect" value="mysql"/>
<!--开启分页合理化(如输入第0页时,展示第一页数据,输入超过最大页数的数据时候,展示最大页数的数据)-->
<property name="reasonable" value="true"/>
</plugin>
</plugins>
goods.xml文件配置
<select id="selectPage" resultType="com.imooc.mybatis.entity.Goods">
select * from t_goods where current_price <1000
</select>
注意:这里我踩坑了,sql语句尾巴习惯性的加了个分号,运行时候就报错了,查了半天,大家引以为戒
your MySQL server version for the right syntax to use near 'LIMIT 10, 10' at line 1
The error may exist in mappers/goods.xml
The error may involve defaultParameterMap
The error occurred while setting parameters
SQL: select * from t_goods where current_price <1000; LIMIT ?, ?
Cause: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIMIT 10, 10' at line 1
- 代码中使用PageHelper.startPage()自动分页
@Test
public void testSelectPage() {
SqlSession sqlSession = null;
try {
sqlSession = MyBatisUtils.openSession();
// 起始行号,每页显示行数
PageHelper.startPage(2, 10);
Page<Goods> page = (Page) sqlSession.selectList("goods.selectPage");
System.out.println("总条数:" + page.getTotal());
System.out.println("总页数:" + page.getPages());
System.out.println("开始页数:" + page.getStartRow());
System.out.println("结束页数:" + page.getEndRow());
// 获得当前页数据
List<Goods> goods = page.getResult();
for (Goods goods1 : goods) {
System.out.println(goods1.getTitle());
}
} catch (Exception e) {
throw e;
} finally {
MyBatisUtils.closeSqlSession(sqlSession);
}
}