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

相关推荐

  • 链接下载器哪个好(实用链接下载工具推荐)

    一、前言 平时我们在访问一些国外网站的时候难免会出现访问延迟甚至是下载到一半就无法下载的尴尬,比如我用360浏览器下载docker,如图: 看到这感人的速度,不禁让我流下了悔恨的泪水,如果当初我能知道几个下载神器中的一种,我也不会那么焦急地等待着。好在现在小编接触的软件比以前的多了,所以现在下载很多工具也就效率高了不少,下面小编就把自己曾经用过的觉得非常棒棒哒的下载工具分享给大家吧,记得点赞关注加…

    2022年5月11日
    860
  • 苹果平板电脑能打电话吗怎么打(性价比高的平板电脑推荐)

    刚好手上有一台IPADmini3当时ID是在闲鱼买的,被骗了放在家好几年了,发现可以绕ID,拿出来试一下。 爱思截图 机器状态系统iOS12.4.8 一、绕ID准备工作需要的工具 1.iPhone或iPad苹果数据线(没有绕个得儿) 2.电脑一台Windows或MAC(没有的话把朋友打一顿就有了) 3.U盘一个8G以上(再打一顿) 4.需要的工具 五合一Linux镜像checkra1n(这是越狱工…

    2022年5月13日
    1130
  • 理财排行榜人人贷怎么样,揭秘人人贷排名高的原因

    回首2018,人民币整体呈一个贬值趋势,因此为了避免我们的财富也随之缩水,越来越多的人选择通过理财,来实现自己的资金保值和增值。同时,正如俗话所说“君子不立危墙之下”,理财的安全问题,向来是大家所担心的,可是安全问题,往往要综合多个方面进行分析,面对数量繁多的平台,很多人都没有这样的时间和精力。 基于这个原因,小编对2018年主流的几个理财平台,进行了综合梳理,并给出了安全评级,希望可以助力大家安…

    2022年7月23日
    730
  • 童装店经营技巧有哪些,三大经营技巧让你的生意好到爆

    近几年服装行业的行情不容乐观,但是童装行业发展势头却较为良好,很多人服装从业者都转型做起了童装生意。虽然童装也属于服装行业,可是童装店的经营和成年人服装店还是有所不同的,那么童装店经营策略有哪些呢? 相比于普通的服装,童装对布料的材质要求更加苛刻,只有健康又舒适的童装才是合格的童装。相比于普通的服装店,开童装店面对的顾客大部分情况下都是父母和他们的孩子,因此面对的顾客较多,在销售童装的时候,要让他…

    2022年9月9日
    450
  • 淘宝购物如何更省钱,淘宝优惠购物攻略

    在淘宝里找到你想买的东西,先别急着直接点立即购买,可以通过淘宝联盟里面的链接购买,如果这件商品所在店家有加入淘宝联盟,就能返利。 复制商品标题到下图的搜索栏里,就会出现推广这件商品的信息,如果商家没有加入淘客联盟就搜不到。拿这件838元的衣服来说,推广佣金有50.28,到时候交易成功,就会有50.28的佣金打到淘包联盟的账户里,提现即可。 —————————————————————————————…

    2022年6月3日
    850
  • 海报文案怎么写,海报的格式和范文参考

    海报文案几乎成为了每一个新媒体人必备的技能。不妨打开你的朋友圈,就可以看到各式各样的海报,有的可以1秒抓住你的眼球,有的直接被人忽视。是什么原因呢?海报文案就是关键所在。 海报文案的使用场景非常广阔,例如售卖产品的销售文案;推广个人品牌的品牌文案,不仅如此,海报文案还可以充当文案标题以及广告语。 在写海报文案之前,你需要搞清楚三件事情。 你要写给谁看?也就是你的服务对象是哪类人群。学生党、职场白领…

    2022年7月31日
    620
  • 固定资产管理软件哪个好(资产管理软件品牌)

    固定资产管理系统越来越受到企业IT、行政、财务、固定资产管理员的欢迎。因为它能让固定资产管理和盘点更加高效和智能。一款好用的固定资产管理系统能协助企业更快更高效地达到管理人员满意的目标,从而降低企业运营成本,有效提高企业的市场竞争力。在选择固定资产管理系统的时候,我们首先要分析企业内所存在的固定资产管理方面的问题和需求,然后经过测试和体验系统后,符合企业需要,再进行采购。 临近年终固定资产大盘点,…

    2022年5月9日
    1620
  • 直播频频翻车:追风口的人,变成风口杀手

    如今直播带货这股风吹起来,哪怕人人都对水分心知肚明,却还是迫不及待的上了这辆车。但盲目的去跟风,最后也只能撞得头破血流。

    2022年9月5日
    480
  • 电脑白板怎么打开(电子白板软件app推荐)

    虚拟白板是MicrosoftTeams和Zoom会议中经常被忽视的功能。大多数办公室工作人员在进行视频会议时,通常会将屏幕共享等功能融入到他们的工作流程中,但可能会忽视会议平台中内置的虚拟白板功能。 事实是:虚拟白板易于使用且易于访问,即使对于视频新手也是如此。许多人都是视觉学习者,通常,在虚拟白板上快速绘制草图可以更好地描绘想法和信息。虽然独立的虚拟白板应用程序可用于更高级的构思需求,但有些人在…

    2022年5月13日
    1110
  • 网络营销师课程及证书含金量,怎么报名网络营销师考试

    @纯原创,转载注明出处 自从李克强总理在今年提出了“互联网+”在仅仅几天的时间,“互联网+”这个词儿占据了今日头条,搜狐自媒体平台,网易,百度百家等各大媒体,同时随之而来的,网络营销也成了最近的火热词,网络营销师逐渐成了热门的职业,甚至有媒体报道:十大高薪职业里网络营销师高居榜首。而各路自媒体大神也都在试想着阐述“网络营销师”这一新词儿的含义及内涵,并试着普及给广大观众。 相信很多人听说过网络营销…

    2022年5月18日
    840

发表回复

登录后才能评论

联系我们

400-800-8888

在线咨询: QQ交谈

邮件:admin@example.com

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

关注微信