mybatis分页实现原理(sql实现分页查询)

一、MyBatisPlusConfig中配置分页插件 /** *配置分页插件 *@returnpage */ @Bean publicPaginationInterceptorpaginationInterceptor(){ PaginationInterceptorpaginationInterceptor=newPaginationInterceptor(); //开启count的join优化…

一、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分页插件,返回统一结果集

总结

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年5月13日 下午3:34
下一篇 2022年5月13日 下午3:35

相关推荐

  • spice仿真例题(spice仿真软件教程)

    仿真电路如下图所示,电路中的模型,一部分是从网络上找的,剩下的使用LTspice自带的模型。 此仿真电路使用比较常见的输出电压反馈的方式,采样输出电压与基准5V电压比较,得到的误差电压经过PI调节与U6的三角波比较得到脉冲方波。开关频率见Tclock=10u,为100kHz;SR触发器输出的驱动波形,用一个Bsouce(B1),来实现Buck电路的隔离驱动。 实际的仿真效果如下: 输出5V电压还是…

    2022年5月13日
    930
  • 微博营销方法有哪些,微博营销的思路与手法

    在互联网发展的今天,网络营销的发展越来越快,其中微博营销也是热门的网络营销的方式之一。那么微博营销有哪些方法和技巧呢?现在就跟随北京达内网络营销培训机构一起去了解一下吧。 微博是微型博客的简称,人们也称微博为即时博客,更被称为是“微博营销元年”,中国微博用户规模已突破3亿。以微博为代表的社会化媒体正改变着网民的生活及消费习惯,整个互联网的形态都发生了变化,并逐渐衍生出一条完整的微博生态链。如今,无…

    2022年8月16日
    610
  • 如何优化好一个网站,五个网站优化技巧

    告诉你如何优化好一个网站 到底怎样才能做出来一个浏览量的网站呢?小编看了好多的优化视频和4年的优化的实践经验,今天说下优化好一个网站应该怎么做,希望能帮助那些初学的优化者。 1.选择一个好的域名,选好了一个域名就等于成功了一般,容易让读者记住。什么样的域名算是好域名呢?小编觉得好记的域名、时间比较老的域名就是一个好的域名,因为好记得域名很容易被读者记住,老的域名会被搜索引擎优先收录,在优化方面会达…

    2022年7月4日
    520
  • 怎么恢复微信删除的记录,教你一招快速恢复微信记录

    微信聊天记录已经删除了怎么恢复?微信现在已经成为一种普遍交流的聊天工具了,很多时候我们联系客户也会用微信交流,所以微信上是存在了很多的重要的信息的,有的时候我们不小心删除了微信的聊天记录该怎么办呢?其实微信丢失的聊天记录是可以找回的,找回微信聊天记录最好使用互盾苹果恢复大师,这款软件的操作步骤很简单,下面我就把操作步骤分享给大家。 准备工具: 1、互盾苹果恢复大师 2、需要恢复微信聊天记录的苹果手…

    2022年8月4日
    650
  • 找工作都有哪些网站,推荐10个正规又靠谱的求职网站

    现在的大学生找工作再也不像前几年那样,得通过现实中的人才招聘市场去找,更多的是通过网上的招聘网站去找工作,因此,大学生就必须知道有哪些招聘网站,下面就给大家介绍一些常见的招聘网站。 1高校的就业服务网 高校就业服务网是我们在校大学生关注比较多的网站,每年的双选会招聘信息都会在上面发布,信息也是绝对真实有效,除此在外,学校平时的各种校园招聘信息也会在最新的时间在上面发布。这些招聘单位在一定程度上与高…

    2022年10月2日
    3.3K0
  • b2b平台推广策略有哪些,B2B网站推广4个技巧

    许多B2B企业(包括B2C企业)常常在社交媒体上言之无物,发布着重复的内容和图片。其实这些企业仍不明白在社交媒体上到底应该说些什么,做些什么。 其实,无论是B2B,还是B2C,最终都是P2P——注意,P2P指的是peopletopeople(人对人),而不是peertopeer(点对点式非法下载)。所以无论我们是什么商业模式,无论我们的客户是谁,无论是在线上还是线下,我们其实都是在和人打交道。所以…

    2022年6月7日
    680
  • 2020股票市值排行榜前十名推荐,哪个企业的市值最高呢

    年中成绩单披露接近尾声,河南上市公司在市值方面也有了新的排行。8月30晚,随着洛阳玻璃、大有能源等企业2019年半年度报告的出炉,80家豫股已经全部公布了今年上半年的主要营收情况,那么从市值层面来看,哪些企业的表现算得上可圈可点? 13家豫股市值超百亿 大河报·大河财立方记者梳理发现,截至2019年8月30日收盘,80家河南A股上市公司总市值达到了9132亿元,13家公司市值超过百亿,其中3家公司…

    2022年9月6日
    3330
  • 医药b2b平台有哪些,十大医药批发平台排行

    医药行业在保障人民健康、救灾防疫、军需战备、社会安定等方面起着重要的作用,是国民经济的重要组成部分。我国拥有庞大的医药消费市场,全国医药生产一直处于持续、稳定、快速的发展阶段。 2017年全国药品销售总额为20016亿元,同比增长了8.8%。进入2018年,全国药品销售规模稳步增长,但增速持续回落。 随着“互联网+”的政策、技术、平台、服务的不断发展,“互联网+”的模式不断创新,在互联网的持续影响…

    2022年6月6日
    6540
  • 关于thinkpad介绍,thinkpad适合什么人用

    本文由什么值得买用户原创:一只小萌熊 创作立场声明:本文不涉及任何机型的评测,仅仅是谈谈关于X系列的发展现状,欢迎指正文章中的错误,此外,文末有YOGA折叠屏的演示视频。 前段时间,我在值得买上发了篇关于 ThinkPadX390LTE版的文章,其中提到了X系列首次采用13寸屏幕的机型X300以及它的衍生机型 X301,后者曾是轻薄全内置笔记本的代表作之一,本文我们就来看看X系列从IBM时代到Le…

    2022年5月30日
    960
  • pdf如何去水印,两个免费pdf去水印好方法

    如今PDF格式的文档使用越来越普遍,那么如何给PDF文档添加上水印防止内容被抄袭或盗用呢?其实操作很简单,您只需要几个步骤利用相关软件就能轻松搞定,下面就让我们一起看看如何给PDF文档添加水印吧! 一、制作PDF格式的水印 1、从极速office官网下载极速office后,新建一个Word文档,开始设计水印 输入文字并根据需求调整字体大小或颜色等(注:文字在Word中的位置就是之后PDF文档中水印…

    2022年7月18日
    460

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

工作时间:周一至周五,9:30-18:30,节假日休息

关注微信