mybatis-plus多表分页查询最佳实现方法(非常简单)

 更新时间:2023年08月19日 11:00:06   作者:单筱风  
这篇文章主要给大家介绍了关于mybatis-plus多表分页查询最佳实现方法,文中介绍的方法非常简单,MyBatis-Plus中分页查询是比较方便的,这个功能在网站中也是非常常用的,这方面的知识点是必备的知识点,需要的朋友可以参考下

1.简介

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

mybatis-plus的单表分页就不必多说了,那多表联查的分页该如何实现呢?其实也很简单,你只需要自己写好关联查询的sql再结合mybatis-plus提供的分页对象,就可以实现了。但是如何才能优雅的将分页参数和查询条件提供给mybatis-plus呢?我选择使用
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;这个对象来实现。直接继承baomidou提供的类可以省去每次手动再new对象,因为在获取参数时就已经自动构建了

2.实现

2.1版本

    <mybatis-plus.version>3.5.1</mybatis-plus.version>
    <connector.version>8.0.18</connector.version>
            <!--    ================mybatis-plus==================        -->
            <!--mybatis-plus 持久层-->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-boot-starter</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>
            <!-- mybatis plus 代码生成器依赖 -->
            <dependency>
                <groupId>com.baomidou</groupId>
                <artifactId>mybatis-plus-generator</artifactId>
                <version>${mybatis-plus.version}</version>
            </dependency>
            <!--    ================mybatis-plus==================        -->
            <!--mysql-->
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>${connector.version}</version>
            </dependency>

2.2分页插件

@MapperScan(“。。。”)这些基本配置我就不多说了

@Configuration
public class MPConfig {
    /**
     * 分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        //乐观锁
        //interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        //分页锁
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

2.3 分页参数 继承 自 Page

直接继承baomidou提供的类可以省去每次手动再new对象,因为在获取参数时就已经自动构建了

package com.dxf.common.utils;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import io.swagger.annotations.ApiModelProperty;
import io.swagger.annotations.ApiParam;
import springfox.documentation.annotations.ApiIgnore;
import java.util.List;
public class PageParam<T> extends Page<T> {
    /**
     * 查询数据列表
     */
    @ApiParam(hidden = true)
    private List<T> records;
    /**
     * 总数
     */
    @ApiParam(hidden = true)
    private long total = 0;
    /**
     * 每页显示条数,默认 10
     */
    @ApiParam(value = "每页大小,默认10",required = false, defaultValue = "10")
    private long size = 10;
    /**
     * 当前页
     */
    @ApiParam(value = "当前页,默认1",required = false,defaultValue = "1")
    private long current = 1;
    /**
     * 是否进行 count 查询
     */
    @ApiParam(hidden = true)
    private boolean isSearchCount = true;
    @Override
    @ApiParam(hidden = true)
    public List<T> getRecords() {
        return this.records;
    }
    @Override
    public Page<T> setRecords(List<T> records) {
        this.records = records;
        return this;
    }
    @Override
    public long getTotal() {
        return this.total;
    }
    @Override
    public Page<T> setTotal(long total) {
        this.total = total;
        return this;
    }
    @ApiParam(hidden = true)
    public boolean getSearchCount() {
        if (total < 0) {
            return false;
        }
        return isSearchCount;
    }
    @Override
    @ApiParam(hidden = true)
    public boolean isSearchCount() {
        if (total < 0) {
            return false;
        }
        return isSearchCount;
    }
    @Override
    public Page<T> setSearchCount(boolean isSearchCount) {
        this.isSearchCount = isSearchCount;
        return this;
    }
    @Override
    public long getSize() {
        return this.size;
    }
    @Override
    public Page<T> setSize(long size) {
        this.size = size;
        return this;
    }
    @Override
    public long getCurrent() {
        return this.current;
    }
    @Override
    public Page<T> setCurrent(long current) {
        this.current = current;
        return this;
    }
}

2.4 实现的重点mapper

import org.apache.ibatis.annotations.Param;
public interface SysRoleMapper extends BaseMapper<SysRole> {
    IPage<SysRole> searchPage(PageParam<SysRole> pageParam, @Param("name") String name);
}

关联的是角色表和用户表

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.dxf.data.mapper.SysRoleMapper">
    <select id="searchPage" resultType="com.dxf.data.entity.SysRole">
        SELECT r.id,r.name,r.status,r.role_sort, a.name create_by ,r.create_time,r.update_time,r.remark
        FROM sys_role r left join sys_user a on r.create_by=a.id
        <where>
            <if test="name != null and name != ''">
                r.name like concat(#{name},'%')
            </if>
        </where>
        order by r.role_sort
    </select>
</mapper>

2.5 其他层就是传下参数

@RestController
@RequestMapping("/admin/role")
@Api(tags  = "SysRoleControllr|角色控制器")
public class SysRoleController {
    @Autowired
    SysRoleService roleService;
    @GetMapping("/page")
    @ApiOperation("角色列表分页查询")
    public ResultJson page(PageParam<SysRole> pageParam,String likeKey) {
        IPage<SysRole> iPage = roleService.searchPage(pageParam,likeKey);
        Map<String, Object> map = new HashMap<>();
        map.put("rows",iPage.getRecords());
        map.put("total",iPage.getTotal());
        return ResultJson.ok().data(map);
    }
public interface SysRole
}
Service extends IService<SysRole> {
    /**
     * 分页查询角色
     */
    IPage<SysRole> searchPage(PageParam<SysRole> pageParam,String name);
}
@Service
public class SysRoleServiceImpl extends ServiceImpl<SysRoleMapper, SysRole> implements SysRoleService {
    @Override
    public IPage<SysRole> searchPage(PageParam<SysRole> pageParam,String name) {
        return baseMapper.searchPage(pageParam,name);
    }
}

总结 

到此这篇关于mybatis-plus多表分页查询最佳实现方法的文章就介绍到这了,更多相关mybatis-plus多表分页查询内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring java 动态获取consul K/V的方法

    spring java 动态获取consul K/V的方法

    这篇文章主要介绍了spring java 动态获取consul K/V的相关资料,主要包括springConsul配置kv路径以及自动注入consulKV到服务中,本文给大家介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • WebSocket无法注入属性的问题及解决方案

    WebSocket无法注入属性的问题及解决方案

    这篇文章主要介绍了WebSocket无法注入属性的问题及解决方法,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-09-09
  • JavaEE实现前后台交互的文件上传与下载

    JavaEE实现前后台交互的文件上传与下载

    这篇文章主要介绍了JavaEE实现前后台交互的文件上传与下载,分享相关技术,实现文件上传下载功能,需要的朋友可以参考下
    2015-11-11
  • SpringBoot上传文件大小受限问题的解决办法

    SpringBoot上传文件大小受限问题的解决办法

    最近有一次由于项目升级发现了一个上传方面的问题,下面这篇文章主要给大家介绍了关于SpringBoot上传文件大小受限问题的解决办法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-05-05
  • Spring-Boot 访问外部接口的方案总结

    Spring-Boot 访问外部接口的方案总结

    在Spring-Boot项目开发中,存在着本模块的代码需要访问外面模块接口,或外部url链接的需求,针对这一需求目前存在着三种解决方案,下面将对这三种方案进行整理和说明,对Spring-Boot 访问外部接口方案感兴趣的朋友跟随小编一起看看吧
    2022-12-12
  • java批量解析微信dat文件

    java批量解析微信dat文件

    这篇文章主要为大家详细介绍了java批量解析微信dat文件,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-08-08
  • java时间戳转换为日期格式的多种方式

    java时间戳转换为日期格式的多种方式

    本文介绍了五种将Java时间戳转换为日期格式的方法,包括使用Date类、LocalDateTime类、Instant类、DateUtils类以及自定义时区,每种方法都有其适用场景,可以根据具体需求选择合适的方法,感兴趣的朋友跟随小编一起看看吧
    2025-01-01
  • Java MAVEN 工程pom配置报错解决方案

    Java MAVEN 工程pom配置报错解决方案

    这篇文章主要介绍了Java MAVEN 工程pom配置报错解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-10-10
  • SpringSecurity rememberme功能实现过程解析

    SpringSecurity rememberme功能实现过程解析

    这篇文章主要介绍了SpringSecurity rememberme功能实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-03-03
  • javaweb文件打包批量下载代码

    javaweb文件打包批量下载代码

    这篇文章主要为大家详细介绍了javaweb文件打包批量下载代码,批量下载未批改作业,感兴趣的小伙伴们可以参考一下
    2016-06-06

最新评论