Mybatis-plus配置分页插件返回统一结果集
作者:Java升级之路 发布时间:2022-05-27 19:15:06
标签:Mybatis-plus,分页,返回统一结果集
一、MyBatisPlusConfig中配置分页插件
/**
* 配置分页插件
* @return page
*/
@Bean
public PaginationInterceptor paginationInterceptor(){
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
// 开启 count 的 join 优化,只针对部分 left join
paginationInterceptor.setCountSqlParser(new JsqlParserCountOptimize(true));
return paginationInterceptor;
}
1. 分页实现的原理
Mybatis-plus分页插件使用的是IPage进行分页。IPage内部原理是基于 * ,拦截的是方法以及方法中的参数。判断是否是查询操作,如果是查询操作,才会进入分页的处理逻辑。 进入分页逻辑处理后, * 会通过反射获取该方法的参数进行判断是否存在IPage对象的实现类。如果不存在则不进行分页,存在则将该参数赋值给IPage对象,然后进行拼接sql的处理完成分页操作。
二、统一结果集
1. 创建返回码定义类
public class ResultCode {
/**
* 成功
**/
public final static int OK = 20000;
/**
* 失败
**/
public final static int ERROR = 20001;
/**
* 用户名或密码错误
**/
public final static int LOGIN_ERROR = 20002;
/**
* 权限不足
**/
public final static int ACCESS_ERROR = 20003;
/**
* 远程调用失败
**/
public final static int REMOTE_ERROR = 20004;
/**
* 重复操作
**/
public final static int REPEAT_ERROR = 20005;
}
2. 创建结果集类
@Data
@ApiModel(value = "全局统一返回结果")
public class R implements Serializable {
public final static String OK_MSG = "请求成功";
public final static String FAIL_MSG = "请求失败";
@ApiModelProperty(value = "是否成功")
private boolean success;
@ApiModelProperty(value = "返回码")
private Integer code;
@ApiModelProperty(value = "返回消息")
private String message;
@ApiModelProperty(value = "返回数据")
private Object data;
@ApiModelProperty(value = "总条数")
private Long total;
@ApiModelProperty(value = "分页信息")
private PageInfo pageInfo;
@Data
public static class PageInfo {
@ApiModelProperty("当前页")
protected int currentPage;
@ApiModelProperty("页大小")
protected int pageSize;
@ApiModelProperty("总记录数")
protected long totalCount;
@ApiModelProperty("总页数")
protected long totalPage;
public PageInfo() {
}
@ConstructorProperties({"currentPage", "pageSize", "totalCount", "totalPage"})
public PageInfo(int currentPage, int pageSize, long totalCount, long totalPage) {
this.currentPage = currentPage;
this.pageSize = pageSize;
this.totalCount = totalCount;
this.totalPage = totalPage;
}
}
private R(){}
private R(int code, String msg, Object data) {
this.code = code;
this.message = msg;
if (data instanceof Page<?>) {
Page<?> page = (Page<?>) data;
this.total = page.getTotal();
this.data = page.getRecords();
this.pageInfo = new PageInfo((int)page.getCurrent(), (int)page.getSize(), page.getTotal(), page.getPages());
} else {
this.data = data;
}
}
public static R ok(){
R r = new R();
r.setSuccess(true);
r.setCode(ResultCode.OK);
r.setMessage("成功");
return r;
}
public static R ok(Object data) {
return new R(ResultCode.OK, OK_MSG, data);
}
public static R ok(String msg, Object data) {
return new R(ResultCode.OK, msg, data);
}
public static R error(){
R r = new R();
r.setSuccess(false);
r.setCode(ResultCode.ERROR);
r.setMessage("失败");
return r;
}
public static R error(String msg) {
return new R(ResultCode.ERROR, msg, null);
}
public static R error(int errorCode, String msg) {
return new R(errorCode, msg, null);
}
public R message(String message){
this.setMessage(message);
return this;
}
public R code(Integer code){
this.setCode(code);
return this;
}
public R data(Object data){
this.setData(data);
return this;
}
}
复制代码
三、编写分页接口
1. 先编写查询类
代码如下:
@Data
public class MemberQueryVo extends BasePageEntity{
@ApiModelProperty(value = "用户名")
private String userName;
}
2. service层
先定义一个查询分页的接口,在实现类里做相关处理
@Service
public class MemberServiceImpl extends ServiceImpl<MemberMapper, Member> implements MemberService {
@Override
public IPage<Member> listMemberPage(MemberQueryVo queryVo) {
IPage<Member> page = new Page<>(queryVo.getCurrentPage(),queryVo.getCurrentPage());
//条件查询
LambdaQueryWrapper<Member> queryWrapper = new LambdaQueryWrapper<Member>();
if (StringUtils.isNotBlank(queryVo.getUserName())) {
queryWrapper.like(Member::getUserName, queryVo.getUserName());
}
return baseMapper.selectPage(page,queryWrapper);
}
}
3. controller层
编写分页接口,代码如下:
@ApiOperation(value = "分页用户列表")
@GetMapping(value = "/getPage")
public R listPage(MemberQueryVo queryVo){
IPage<Member> page = memberService.listMemberPage(queryVo);
return R.ok(page);
}
4. 接口测试
直接通过swagger生成的api接口页面进行测试,当前页、每页参数传1时,返回的分页信息里,总数是两条,只返回了一条数据。说明分页成功。
再进行条件查询的时候,也成功查询对应数据。
再进行条件查询的时候,也成功查询对应数据。
来源:https://juejin.cn/post/7005191804710551565


猜你喜欢
- 一、实现方式@ConfigurationProperties 注解(最好加上前缀prefix=“person”,标明是和配置文件中哪个开头的
- C#实现多态主要有3种方法,虚方法,抽象类,接口1 虚方法在父类的方法前面加关键字virtual, 子类重写该方法时在方法名前面加上over
- 本文实例讲述了Java使用原型模式展现每日生活。分享给大家供大家参考,具体如下:一、模式定义用原型实例指定创建对象的种类,并且通过复制这些原
- 继承(加上封装和多态性)是面向对象的编程的三个主要特性(也称为“支柱”)之一。 继承用于创建可重用、扩展和修改在其他类中定义的行为的新类。其
- DES一共就有4个参数参与运作:明文、密文、密钥、向量。为了初学者容易理解,可以把4个参数的关系写成:密文=明文+密钥+向量;明文=密文-密
- DAO层测试难点可重复性,每次运行单元测试,得到的数据是重复的独立性,测试数据与实际数据相互独立数据库中脏数据预处理不能给数据库中数据带来变
- 在Java中如果一个类同时继承接口A与B,并且这两个接口中具有同名方法,会怎么样?动手做实验:interface A{ void
- 一个简单的网格布局activity_main.xml<?xml version="1.0" encoding=&q
- 1.前言在Mybatis中需要创建的配置文件有sqlMapconfig.xml,映射文件xxxMapper.xml,而这些文件在idea中并
- 一、MVVM 和 MVVMLight介绍MVVM是Model-View-ViewModel的简写。类似于目前比较流行的MVC、MVP设计模式
- JPA的加锁机制有两种,乐观锁和悲观锁。乐观锁:乐观锁的特点在于认为数据冲突或者更新丢失等情况是很少发生的.当发生的时候,抛出异常和回滚就足
- MyBatis的前身叫iBatis,本是apache的一个开源项目, 2010年这个项目由apache software foundatio
- 译文链接: https://www.infoworld.com/art...AutoMapper 是一个非常流行的 object-to-ob
- 相似处  C++作为C的进阶版,可以调用C的库函数。C++标准库包括了C标准库,C++头文件cctype
- 这篇文章主要介绍了Spring Cache手动清理Redis缓存,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值
- 返回值转成JSONString的处理主要需求描述有些返回值中的null需要转换成“”或[],另外有些
- 前言今天遇到一个需求,需要对word模板进行替换制定的变量在网上找了很多方案,做了很多的demo,下面就把我觉得比较简单的一种分享给大家本次
- 本文实例讲述了java设计模式之工厂模式。分享给大家供大家参考,具体如下:工厂模式(factory)涉及到4个角色:抽象工厂类角色,具体工厂
- Flutter 是 Google 开源的 UI 工具包,帮助开发者通过一套代码库高效构建多平台精美应用,支持移动、Web、桌面和嵌入式平台。
- 前言碎语今天博主安利一个国产开源的无服务器容器云平台,关注它已经有一年多了,虽然其迭代到现在很多功能还是一直处于测试验证中,但是其设计理念以