Mybatis是一个持久层,主要是操作sql语句的。项目数据的来源一般都是数据库,如果数据是十分庞大的,一下子把所有数据查询出来,会给数据库带来压力,所以不得不实现分页查询来降低数据库的压力。其实,实现在mybaits中实现分页,就是对sql查询语句的操作,显示想要显示的数据,十分简单。在JDBC中实现分页,首先要查询要分页数据的总数,然后再通过传递分页开始的索引和结束的索引(或者要显示的条数)这两个查询来查询每一页的数据,最后把相关的参数返回到前端页面中。
在mybatis中,也是按JDBC这个思路来实现分页的,但是在mybatis中可以通过PageHelper分页插件来简化分页步骤,这个插件主要是通过内部拦截器把要分页的sql语句进行拦截来实现分页的,其实思路也是一样的,把要分页的sql语句进行拦截,传入分页开始索引和结束索引进行查询,然后把总数和要分页的数据查询返回回来,只不过这些查询总数的sql语句不用我们来编写而已。
那么,如何使用PageHelper插件呢?
- 首先引入相关jar包(mybatis框架的jar包这里就忽略了)
jsqlparser-0.9.5.jar
pagehelper-4.1.4.jar
- 在mybatis的配置文件mybatis-config.xml中配置以下信息:
对于不同数据库,分页的方式有所不同,所以要在下面配置信息中设置相关操作的数据库mysql
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0 //EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--开启二级缓存 注意配置顺序 settings在前面 -->
<settings>
<setting name="cacheEnabled" value="true"/>
</settings>
<!-- 使用自动扫描包来定义别名 -->
<typeAliases>
<package name="com.koi.pojo" />
</typeAliases>
<!-- 配置分页插件 -->
<plugins>
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 设置数据库类型 Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库 -->
<property name="dialect" value="mysql" />
</plugin>
</plugins>
</configuration>
- 创建分页工具ResuleVo类,主要是用来封装返回到前端页面分页表格的修改参数,对应不同的分页表格插件,返回的相关参数有所不同,这里是使用layui的分页表格插件,下面代码主要是对相关的参数实现了封装,其中code是响应的编码,msg为提示,这里主要提供了两个默认值,count代表总数,而data代表是要查询出来的数据:
package com.koi.vo;
public class ResuleVo {
private Integer code;
private String msg;
private Long count;
private Object data;
/**
* 返回layui表格数据格式
* @param count
* @param data
*/
public static ResuleVo toLayui(Long count,Object data){
return new ResuleVo(count, data);
}
public ResuleVo (Long count, Object data) {
this.code = 0;
this.msg = "";
this.count = count;
this.data = data;
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Long getCount() {
return count;
}
public void setCount(Long count) {
this.count = count;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
- 使用PageHelper插件所提供的相关对象方法:
第一步,传入必要的两个参数当前页page和分页大小limit,然后调用PageHelper所提供静态方法startPage(),其中为该方法传入page和limit,最后一个boolean值代表是否开启分页。
第二步,查询要分页的数据。
第三步,通过查询出来的数据集合list进行分页。
第四步,通过PageInfo返回的对象来查询总数,其中PageInfo对象包含了很多分页的信息。
第五步,把总数和数据集合当作参数传入ResuleVo类返回。
@Override
public ResuleVo selectPerAllocation(String info, Integer page, Integer limit) {
//page 当前页 limit代表页面的大小 boolean代表是否开启分页
PageHelper.startPage(page, limit, true);
List<URolePermission> list = userPermissionMapper.selectPerAllocation(info);
PageInfo<URolePermission> pageInfo = new PageInfo<URolePermission>(list);
long count = pageInfo.getTotal();//总数
return ResuleVo.toLayui(count, list);
}