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

目录
  • 一、MyBatisPlusConfig中配置分页插件
    • 1. 分页实现的原理
  • 二、统一结果集
    • 1. 创建返回码定义类
    • 2. 创建结果集类
  • 三、编写分页接口
    • 1. 先编写查询类
    • 2. service层
    • 3. controller层
    • 4. 接口测试
  • 总结

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

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

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

总结

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

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

(0)

相关推荐

  • mybatis调用mysql存储过程(返回参数,单结果集,多结果集)

    目录 一.接收一个返回值 注意事项: 存储过程主要分成三类: 二.接收list结果集 三.返回多个结果集 四.第二种配置也可以 一.接收一个返回值 使用Map接收返回参数,output参数放在传入的param中 创建表 DROP TABLE IF EXISTS `demo`; CREATE TABLE `demo` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`

  • mybatis调用sqlserver存储过程返回结果集的方法

    第一种:返回值通过out输出 sqlserver存储 testMapper.xml 两种都能接收到数据的, 因为我的实体类字段与数据库的不一致,上面图片是按照数据库字段定义的,下图是按照实体类定义的,接收输出参数是按照你定义的名称返回 serviceImpl Map<String,String> objectsMap = new HashMap<>(); objectsMap.put("sno","123"); objectsMap.put(

  • mybatis返回map结果集@MapKey使用的场景分析

    目录 mybatis返回map结果集@MapKey使用场景 使用id作为map的ke Map的value为Map,一条记录对应一个Map 使用name作为map的key mybatis使用@MapKey注解 背景和含义 具体示例 mybatis返回map结果集@MapKey使用场景 select的 resultType属性为map时: 通过MapKey指定map的key值 使用id作为map的ke @MapKey("id") Map<Long, UserInfo> getU

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

    目录 一.MyBatisPlusConfig中配置分页插件 1. 分页实现的原理 二.统一结果集 1. 创建返回码定义类 2. 创建结果集类 三.编写分页接口 1. 先编写查询类 2. service层 3. controller层 4. 接口测试 总结 一.MyBatisPlusConfig中配置分页插件 /** * 配置分页插件 * @return page */ @Bean public PaginationInterceptor paginationInterceptor(){ Pagi

  • Mybatis第三方PageHelper分页插件的使用与原理

    目录 ​用法 ​原理 PageHelper.startPage做了什么 Page分页信息在哪使用 拦截器 插件 拦截器链 加载&调用拦截器 @Intercepts注解 通过PageHelper创建代理对象 拦截器的调用源头-动态代理 分页逻辑 ​总结 ​用法 ​ 此时commentAnalyses为Page对象(PageHelper插件包内定义的) ​ 而Page对象继承自JDK中的ArrayList,扩展并封装了一些page相关的字段,如页码,每页大小,总记录数,总页数等. ​原理 我们就加了

  • Mybatis图文并茂讲解分页插件

    目录 1. Mybatis分页插件 1.1 分页插件介绍 1.2 分页插件的使用 1.3 分页插件的参数获取 1.4 分页插件知识小结 1. Mybatis分页插件 1.1 分页插件介绍 分页可以将很多条结果进行分页显示. 如果当前在第一页,则没有上一页.如果当前在最后一页,则没有下一页. 需要明确当前是第几页,这一页中显示多少条结果. MyBatis分页插件总结 在企业级开发中,分页也是一种常见的技术.而目前使用的 MyBatis 是不带分页功能的,如果想实现分页的 功能,需要我们手动编写 L

  • Mybatis分页插件PageHelper配置及使用方法详解

    环境 框架:spring+springmvc+mybatis pom.xml <!-- 引入mybatis的 pagehelper 分页插件 --> <dependency> <groupId>com.github.pagehelper</groupId> <artifactId>pagehelper</artifactId> <version>5.1.2</version> </dependency&g

  • SpringBoot使用Mybatis注解实现分页动态sql开发教程

    目录 一.环境配置 二.Mybatis注解 三.方法参数读取 1.普通参数读取 2.对象参数读取 四.分页插件的使用 五.动态标签 六.完整示例 一.环境配置 1.引入mybatis依赖 compile( //SpringMVC 'org.springframework.boot:spring-boot-starter-web', "com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.9.3", //Mybatis依赖及分页

  • mybatis plus实现分页逻辑删除

    一.分页 通过mybatis-plus实现分页,也是很简单,插件大法. 1.配置分页插件 把分页的插件也配置到统一的配置类里: @Configuration // 配置扫描mapper的路径 @MapperScan("com.pingguo.mpdemo.mapper") public class MpConfig { // 乐观锁插件 @Bean public OptimisticLockerInterceptor optimisticLockerInterceptor() { re

  • MyBatis-Plus分页插件不生效的解决方法

    描述 项目中用到boot 整合 mybatis-plus , 个人在使用分页条件查询的时候一直查不出 total, pages, 终于找到原因了. 环境 <springboot.version>2.1.5.RELEASE</springboot.version> <mybatisplus.version>3.1.1</mybatisplus.version> 配置 1.自定义MybatisPlusConfig 配置分页插件 package com.eyela

  • 解决mybatis-plus3.4.1分页插件PaginationInterceptor和防止全表更新与删除插件SqlExplainInterceptor过时失效问题

    前言 在Mybatis Plus 3.4.0版本之后PaginationInterceptor插件就失效,新增Mybatis Plus 3.4.0的新内置插件 提示:以下是本篇文章正文内容,下面案例可供参考 分页插件 一.之前的配置 在sqlSessionFactoryBean中配置插件 <property name="plugins"> <array> <bean class="com.baomidou.mybatisplus.extensio

  • Mybatis分页插件PageHelper的配置和简单使用方法(推荐)

    前言 在web开发过程中涉及到表格时,例如dataTable,就会产生分页的需求,通常我们将分页方式分为两种:前端分页和后端分页. 前端分页 一次性请求数据表格中的所有记录(ajax),然后在前端缓存并且计算count和分页逻辑,一般前端组件(例如dataTable)会提供分页动作. 特点是:简单,很适合小规模的web平台:当数据量大的时候会产生性能问题,在查询和网络传输的时间会很长. 后端分页 在ajax请求中指定页码(pageNum)和每页的大小(pageSize),后端查询出当页的数据返回

  • Spring mvc整合mybatis(crud+分页插件)操作mysql

    一.web.xml配置 我们都知道java ee的项目启动的第一件事就是读取web.xml,spring mvc 的web.xml我在上一篇文章中也做了详细讲解,不懂的可以回头看看,讲解的这个项目源码我也会放到github上,也可以去那里看看,这里就不做介绍了. web.xml 配置 <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:/c

随机推荐