MyBatis Plus 实现多表分页查询

MyBatis Plus 实现多表分页查询在MybatisPlus中,虽然IService<T>接口帮我们定义了很多常用的方法,但这些都是T对象有用,如果涉及到多表的查询,还是需要自定义Vo对象和自己编写sql语句,MybatisPlus提供了一个Page对象,查询是需要设置其中的size字段和current字段的值一、分页配置 可以直接使用selectPage这样的分页,但返回的数据确实…

大家好,又见面了,我是你们的朋友全栈君。

在Mybatis Plus 中,虽然IService 接口帮我们定义了很多常用的方法,但这些都是 T 对象有用,如果涉及到 多表的查询,还是需要自定义Vo 对象和自己编写sql 语句,Mybatis Plus提供了一个Page 对象,查询是需要设置其中的 size 字段 和 current 字段的值

一、分页配置

可以直接使用selectPage这样的分页,但返回的数据确实是分页后的数据,但在控制台打印的SQL语句其实并没有真正的物理分页,而是通过缓存来获得全部数据中再进行的分页,这样对于大数据量操作时是不可取的,那么接下来就叙述一下,真正实现物理分页的方法。
官方在分页插件上如是描述:自定义查询语句分页(自己写sql/mapper),也就是针对自己在Mapper中写的方法,但经过测试,如果不配置分页插件,其默认采用的分页为RowBounds的分页即逻辑分页,也就是先把数据记录全部查询出来,然在再根据offset和limit截断记录返回(数据量大的时候会造成内存溢出),故而不可取,而通过分页插件的配置即可达到物理分页效果。

新建一个MybatisPlusConfig配置类文件,代码如下所示:

import com.baomidou.mybatisplus.plugins.PaginationInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
 
@Configuration
@EnableTransactionManagement(proxyTargetClass = true)
public class MybatisPlusConfig {
 
    /**
     * mybatis-plus分页插件<br>
     */
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
        return paginationInterceptor;
    }
}

二、使用分页进行单表的查询

对于单表的分页查询,ServiceImpl 类已经为我们提供了对应的方法 selectPage(),并将结果封装到Page 对象中:
在这里插入图片描述
在项目开发当中,都会将分页的一些参数封装成一个类 PageReq(不要在意这个Req 为什么不是全大写)->import java.io.Serializable;

public class PageReq  implements Serializable {

    /**
     * 每页显示大小
     */
    private long  size;

    /**
     * 当前页码
     */
    private  long current;

    /**
     * 最大页数
     */
    private  long maxCurrent;

    /**
     * 数据总条数
     */
    private  long total;

    public long getSize() {
        return size;
    }

    public void setSize(long size) {
        this.size = size;
    }

    public long getCurrent() {
        return current;
    }

    public void setCurrent(long current) {
        this.current = current;
    }

    public long getMaxCurrent() {
        return maxCurrent;
    }

    public void setMaxCurrent(long maxCurrent) {
        this.maxCurrent = maxCurrent;
    }

    public long getTotal() {
        return total;
    }

    public void setTotal(long total) {
        if(size != 0){
            if(total % size != 0){
                maxCurrent = total / size + 1;
            }else {
                maxCurrent = total / size;
            }
        }
    }

    public PageReq() {

    }

    public PageReq(long size, long current, long total) {
        this.size = size;
        this.current = current;
        this.total = total;
        setTotal(total);
    }
}

功能编写:

在这里插入图片描述
在这里插入图片描述
执行完之后,会将查询的接口封装到我们 Page的 对象中:
在这里插入图片描述

三、多表关联分页查询

对于多表关联的查询时,还是需要编写 VO 类和 手动的在Mapper.xml 中编写sql,虽然是可以不用创建VO,用Map 的方式接受返回的结果,但这样只会更麻烦,甚至VO 是很有可能在其他地方使用的
先准备个VO类:
在这里插入图片描述
编写Mapper接口,添加一个分页查询的方法
package com.eiot.e_view.mapper;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.eiot.e_view.model.req.RoomPageReq;
import com.eiot.e_view.model.vo.RoomVO;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface RoomMapper extends BaseMapper<Room> {

    List<RoomVO> getRoomPageList(Page page, @Param("roomPageReq")RoomPageReq roomPageReq);
}

编写sql,和我们使用Mybatis 没有区别:
在这里插入图片描述
在这里插入图片描述

编写Server :

在这里插入图片描述

执行结果:

在这里插入图片描述

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

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/133686.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Jenkins(4)docker容器内部修改jenkins容器时间「建议收藏」

    Jenkins(4)docker容器内部修改jenkins容器时间「建议收藏」前言用docker搭建的Jenkins环境时间显示和我们本地时间相差8个小时,需修改容器内部的系统时间查看时间查看系统时间date-R进入docker容器内部,查看容器时间dockere

    2022年7月28日
    7
  • 已知圆心及半径,通过MATLAB画圆「建议收藏」

    已知圆心及半径,通过MATLAB画圆「建议收藏」已知圆心及半径,使用MATLAB画圆文章目录已知圆心及半径,使用MATLAB画圆一、原理简介二、转换过程三、结果展示一、原理简介条件中已知圆的半径可以等价于极坐标系中的ρ,所以能根据已知的半径转换为直角坐标系中点的坐标来画圆。转换的原理是使用极坐标与直角坐标之间的转换公式来实现,公式如下:x=ρcosθy=ρsinθ二、转换过程主要分一下几步完成1.设置圆的一周由多少个点组成;2.设置圆周上点与点之间的间隔角度;3.设置圆心的坐标;4.读取半径值;5.求取X、Y轴坐标;6.画

    2022年6月19日
    37
  • 一个经典例子让你彻彻底底理解java回调机制是什么_java实现回调函数

    一个经典例子让你彻彻底底理解java回调机制是什么_java实现回调函数以前不理解什么叫回调,天天听人家说加一个回调方法啥的,心里想我草,什么叫回调方法啊?然后自己就在网上找啊找啊找,找了很多也不是很明白,现在知道了,所谓回调:就是A类中调用B类中的某个方法C,然后B类中反过来调用A类中的方法D,D这个方法就叫回调方法,这样子说你是不是有点晕晕的,其实我刚开始也是这样不理解,看了人家说比较经典的回调方式:ClassA实现接口CallBackcallback

    2025年6月3日
    0
  • jedis连接池:JedisPool[通俗易懂]

    jedis连接池:JedisPool[通俗易懂]jedis连接池:JedisPool使用:1.创建JedisPool连接池对象2.调用方法getResource()方法获取Jedis连接//0.创建一个配置对象JedisPoolConfigconfig=newJedisPoolConfig();config.setMaxTotal(50);config.setMaxIdle(10);//1.创建Jedis连接池对象JedisPooljedisPool=newJe

    2022年9月5日
    2
  • JAVA 实习面试题大全必看

    JAVA实习面试题大全必看JavaSE88基础语法9Q1:简单说说Java有哪些数据类型答:①分为基本数据类型和引用数据类型。②基本数据类型包括:数值型(byte、short、int、long、float、double),字符型(char)以及布尔型(boolean)。除了基本类型外,其他数据类型都属于引用类型,包括类、接口、数组等。Q2:floatnumber=3.4;有没有问…

    2022年4月6日
    35
  • 使用moment格式化日期

    使用moment格式化日期案例:本例是在react-native中格式化日期1,引入moment2,使用moment例如:letstartDate=moment(‘2018-09-27’).format(YYYY-MM-DD);moment使用详解:格式化日期当前时间:moment().format(‘YYYY-MM-DDHH:mm:ss’);//2014-09-2423:…

    2022年6月11日
    51

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号