Mybatis-plus配置分页插件返回统一结果集


Posted in Java/Android onJune 21, 2022

一、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的处理完成分页操作。

Mybatis-plus配置分页插件返回统一结果集

二、统一结果集

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时,返回的分页信息里,总数是两条,只返回了一条数据。说明分页成功。

再进行条件查询的时候,也成功查询对应数据。

Mybatis-plus配置分页插件返回统一结果集

再进行条件查询的时候,也成功查询对应数据。

Mybatis-plus配置分页插件返回统一结果集

总结

感谢大家的阅读,上就是今天要讲的内容,本文简单介绍了如何配置分页插件、以及分页的原理。如有不足之处,纯属能力有限,还请多多包涵。

到此这篇关于Mybatis-plus配置分页插件返回统一结果集的文章就介绍到这了,更多相关Mybatis-plus分页返回统一结果集内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!


Tags in this post...

Java/Android 相关文章推荐
Spring Boot 启动、停止、重启、状态脚本
Jun 26 Java/Android
SpringBoot整合JWT的入门指南
Jun 29 Java/Android
聊聊Lombok中的@Builder注解使用教程
Nov 17 Java/Android
Java9新特性对HTTP2协议支持与非阻塞HTTP API
Mar 16 Java/Android
java后台调用接口及处理跨域问题的解决
Mar 24 Java/Android
Java实战之课程信息管理系统的实现
Apr 01 Java/Android
Java 通过手写分布式雪花SnowFlake生成ID方法详解
Apr 07 Java/Android
零基础学java之带返回值的方法的定义和调用
Apr 10 Java/Android
Java 使用类型为Object的变量指向任意类型的对象
Apr 13 Java/Android
Java存储没有重复元素的数组
Apr 29 Java/Android
MyBatis在注解上使用动态SQL方式(@select使用if)
Jul 07 Java/Android
Java结构型设计模式之组合模式详解
Sep 23 Java/Android
SpringCloud超详细讲解Feign声明式服务调用
Jun 21 #Java/Android
使用Postman测试需要授权的接口问题
Jun 21 #Java/Android
springboot集成redis存对象乱码的问题及解决
Jun 16 #Java/Android
SpringBoot使用AOP实现统计全局接口访问次数详解
Jun 16 #Java/Android
Java中的Kotlin 内部类原理
Jun 16 #Java/Android
Spring Security动态权限的实现方法详解
Java实现注册登录跳转
Jun 16 #Java/Android
You might like
用PHP读注册表
2006/10/09 PHP
站长助手-网站web在线管理程序 v1.0 下载
2007/05/12 PHP
ie与session丢失(新窗口cookie丢失)实测及解决方案
2013/07/15 PHP
PHP保留两位小数并且四舍五入及不四舍五入的方法
2013/09/22 PHP
jquery随机展示头像代码
2011/12/21 Javascript
eval的两组性能测试数据
2012/08/17 Javascript
Javascript代码在页面加载时的执行顺序介绍
2013/05/03 Javascript
最精简的JavaScript实现鼠标拖动效果的方法
2015/05/11 Javascript
讲解JavaScript中for...in语句的使用方法
2015/06/03 Javascript
JavaScript通过使用onerror设置默认图像显示代替alt
2016/03/01 Javascript
js实现四舍五入完全保留两位小数的方法
2016/08/02 Javascript
一个简单的JavaScript Map实例(分享)
2016/08/03 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
JavaScript设计模式之单例模式原理与用法实例分析
2018/07/26 Javascript
vue2.0 使用element-ui里的upload组件实现图片预览效果方法
2018/09/04 Javascript
微信小程序如何获取手机验证码
2018/11/04 Javascript
Vue+Element-UI实现上传图片并压缩
2019/11/26 Javascript
vue 解决IOS10低版本白屏的问题
2020/11/17 Javascript
vue下拉刷新组件的开发及slot的使用详解
2020/12/23 Vue.js
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
[01:00:14]DOTA2-DPC中国联赛 正赛 Ehome vs Elephant BO3 第二场 2月28日
2021/03/11 DOTA
Python编写的com组件发生R6034错误的原因与解决办法
2013/04/01 Python
python提示No module named images的解决方法
2014/09/29 Python
Pandas 缺失数据处理的实现
2019/11/04 Python
解决import tensorflow导致jupyter内核死亡的问题
2021/02/06 Python
CSS3 滤镜 webkit-filter详细介绍及使用方法
2012/12/27 HTML / CSS
css3 仿写阿里云水纹效果的示例代码
2018/02/10 HTML / CSS
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
教师自我鉴定范文
2013/11/10 职场文书
学生期末评语大全
2014/04/30 职场文书
希特勒经典演讲稿
2014/05/19 职场文书
试用期转正后的自我评价
2014/09/21 职场文书
民主评议党员自我鉴定
2014/10/21 职场文书
音乐教师个人工作总结
2015/02/06 职场文书
解决WINDOWS电脑开机后桌面没有任何图标
2022/04/09 数码科技
Python使用Beautiful Soup(BS4)库解析HTML和XML
2022/06/05 Python