13.Mybatis-plus分页插件
spring注入mybatis配置分页插件:
//Spring boot方式
@Configuration
//mapper扫描路径
@MapperScan("com.baomidou.cloud.service.*.mapper*")
public class MybatisPlusConfig {
/**
* 分页插件
*/
@Bean
public PaginationInterceptor paginationInterceptor() {
return new PaginationInterceptor();
}
}
如何使用分页插件?此处参考Mybatis-plus官方文档给出的传参区分模式。
//Dao层mapper接口
public interface UserMapper{//可以继承或者不继承BaseMapper
/**
* <p>
* 查询 : 根据state状态查询用户列表,分页显示
* </p>
*
* @param page
* 翻页对象,可以作为 xml 参数直接使用,传递参数 Page 即自动分页
* @param state
* 状态
* @return
*/
List<User> selectUserList(Pagination page, Integer state);
}
//Service层调用分页方法:page对象需要做为参数传入service层方法,这里的page可以进行分页参数配置。
public Page<User> selectUserPage(Page<User> page, Integer state) {
// 不进行 count sql 优化,解决 MP 无法自动优化 SQL 问题
// page.setOptimizeCountSql(false);
// 不查询总记录数
// page.setSearchCount(false);
// page.setRecords 回传必须存在,将分页后的结果回传。
return page.setRecords(userMapper.selectUserList(page, state));
}
//UserMapper.xml 分页已经在service完成并回传。
<select id="selectUserList" resultType="User">
SELECT * FROM user WHERE state=#{state}
</select>
Guns中的分页应用:
1. 针对前端分页结果显示,guns框架预先设置了对应BootStrap Table默认的分页配置。
public class PageFactory<T> {
public Page<T> defaultPage() {
HttpServletRequest request = HttpKit.getRequest(); //获取request
int limit = Integer.valueOf(request.getParameter("limit")); //每页多少条数据
int offset = Integer.valueOf(request.getParameter("offset")); //每页的偏移量(本页当前有多少条)
String sort = request.getParameter("sort"); //排序字段名称
String order = request.getParameter("order"); //asc或desc(升序或降序)
//根据排序字段的有无进行page对象的构建
if (ToolUtil.isEmpty(sort)) {
Page<T> page = new Page<>((offset / limit + 1), limit);
page.setOpenSort(false);
return page;
} else {
Page<T> page = new Page<>((offset / limit + 1), limit, sort);
if (Order.ASC.getDes().equals(order)) {
page.setAsc(true);
} else {
page.setAsc(false);
}
return page;
}
}
}
在package com.baomidou.mybatisplus.plugins包中:Page对象有两种构造方法。
public Page(int current, int size) {
super(current, size);
}
public Page(int current, int size, String orderByField) {
super(current, size);
this.setOrderByField(orderByField);
}
传递的参数是:当前页码 + 每页显示数据数量 + (排序字段)
2. guns框架中的操作日志和登录日志列表数据获取的业务中采用了分页显示。
以登录日志模块为例:查询操作日志列表方法中
//根据BootStrap Table进行page对象的创建和初始化
Page<OperationLog> page = new PageFactory<OperationLog>().defaultPage();
//这里对getLoginLogs方法进行了简化显示,只说重点的三个参数。
List<Map<String, Object>> result = logDao.getLoginLogs(page, ..., page.getOrderByField(), page.isAsc());
1. page:page对象经过初始化后,需要把page对象作为参数传入需要分页的mapper接口方法中。
2. page.getOrderByField():排序依据字段,defaultPage已经根据request携带参数是否含有sort进行设置。
3. page.isAsc():排序顺序,当request参数中含有sort字段并且含有order参数时进行配置。
这里获取的这三个的目的是构建多条件的查询mapper。此处mp提供的简单查询就要被重写了。
这里定位到LogDao.xml中的<select id="getLoginLogs">
看下局部mapper的编写:
<choose>
<when test="orderByField != null and orderByField !=''">
<choose>
<when test="isAsc == true">
order by ${orderByField} ASC
</when>
<otherwise>
order by ${orderByField} DESC
</otherwise>
</choose>
</when>
</choose>
这也就是传参为什么要含有page.getOrderByField()、 page.isAsc()的原因,动态SQL语句的构建,根据参数的不同进行不同SQL语句的构建和执行。
//最后对分页结果进行回传,必做操作。Guns中对分页结果result进行了包装进行了返回。
page.setRecords((List<OperationLog>) new LogWarpper(result).warp());
总结下:mybatis-plus分页插件使用步骤
1. 根据前端分页显示格式构建初始化Page对象。
2. 执行查询逻辑,参数添加Page、page.getOrderByField()、page.isAsc()。
3. 分页查询结果回传:page.setRecords(result)。