springboot + mybatis plus实现多表联查分页

2022-07-26 14:46:11

(六)springboot + mybatis plus实现多表联查分页3.X版本

注明 : 上两篇文章我们讲解了springboot+mybatis-plus对于单表的CRUD和条件构造器的使用方法,但是对于我们的实战项目中多表联查也是经常会出现的。今天我们就来说下怎么在springboot+MP模式下实现多表联查并分页。

项目源码下载位置 | gitee

MP推荐使用的是一种苞米豆团队自己封装好的分页插件,也就是PaginationInterceptor分页拦截器,那么下面我们集成分页插件,如果在项目使用使用过程中出现任何问题,下载源码观看,可找到问题所在,如不能解决,可在下方博客留言,看到留言后会帮你解决问题。

1 配置分页插件

package com.lqf.multitable.config;import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;import com.baomidou.mybatisplus.extension.plugins.PerformanceInterceptor;import org.mybatis.spring.annotation.MapperScan;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.transaction.annotation.EnableTransactionManagement;@EnableTransactionManagement@Configuration@MapperScan("com.lqf.multitable.dao.*")publicclassMybatisPlusConfig{/**
     * mybatis-plus SQL执行效率插件【生产环境可以关闭】
     */@Beanpublic PerformanceInterceptorperformanceInterceptor(){returnnewPerformanceInterceptor();}/*
     * 分页插件,自动识别数据库类型 多租户,请参考官网【插件扩展】
     */@Beanpublic PaginationInterceptorpaginationInterceptor(){returnnewPaginationInterceptor();}}

分页插件配置好后,需要在项目中自动生成各个层级代码,在这里我就不阐述自动生成的过程了,如果有不知道的童鞋可观看我MP第三篇博文。

由于在多表联查的情况下可能会出现返回不同表的字段,当自动生成的表不能满足你的返回条件时,需要我们自动生成一个返回实体。下面实体是包括用户表和角色表的两张返回实体。

2 创建返回实体

package com.lqf.multitable.bean.crm;import com.sun.corba.se.spi.presentation.rmi.IDLNameTranslator;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import java.time.LocalDateTime;/**
 * @author : lqf
 * @Description :
 * @date : Create in 18:14 2018/10/3
 */@Data@AllArgsConstructor@NoArgsConstructorpublicclassUserRoleVo{private Long userId;/**
     * 创建时间
     */private LocalDateTime createTime;/**
     * 修改时间
     */private LocalDateTime updateTime;/**
     * 账号
     */private String username;/**
     * 密码
     */private String password;/**
     * 姓名
     */private String realname;/**
     * 性别(0为女 1为男)
     */private Integer sex;/**
     * 手机号
     */private String mobile;/**
     * 密码加密串
     */private String passwordMd5;/**
     * 开账号人
     */private Long parentId;/**
     * 是否禁用 0否 1是
     */private Integer status;/**
     * 授权大区
     */private String authArea;/**
     * 授权城市
     */private String authCity;private Integer role;/**
     * 用户剩余卡数
     */private Integer residueCardNumber;/**
     * 最后登录时间
     */private LocalDateTime lastLoginTime;/**
     * 最后登录ip地址
     */private String lastLoginIp;/**
     * 最后登录次数
     */private Integer lastLoginCount;/**
     * 渠道
     */private String authChannel;/**
     * 0 外网 1 内网
     */private Integer internet;/**
     * 金币
     */private Long goldCoin;private Long id;/**
     * 状态
     */private String statusId;/**
     * 角色名
     */private String roleName;/**
     * 角色值
     */private String roleValue;/**
     * 能添加的下属角色值
     */private String addibleValue;}

3 测试Test

package com.lqf.multitable;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.lqf.multitable.bean.crm.UserRoleVo;import com.lqf.multitable.service.crm.FyUserService;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)@SpringBootTestpublicclassSpringbootMybatisPlusMultiTableApplicationTests{@Autowiredprivate FyUserService service;/**
     * 联表查询并分页
     */@TestpublicvoidcontextLoads(){// 当前页,总条数 构造 page 对象
        Page<UserRoleVo> page=newPage<>(1,10);
        page.setRecords(service.selectUserListPage(page));
        System.out.println(page);}}

4 service层

package com.lqf.multitable.service.crm.impl;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.lqf.multitable.bean.crm.FyUser;import com.lqf.multitable.bean.crm.UserRoleVo;import com.lqf.multitable.dao.crm.FyUserMapper;import com.lqf.multitable.service.crm.FyUserService;import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;import org.springframework.stereotype.Service;import java.util.List;/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author lqf
 * @since 2018-10-02
 */@ServicepublicclassFyUserServiceImplextendsServiceImpl<FyUserMapper, FyUser>implementsFyUserService{@Overridepublic List<UserRoleVo>selectUserListPage(Page<UserRoleVo> page){returnthis.baseMapper.selectUserListPage(page);}}

注意这里的baseMapper不是你自己定义的,直接通过this.baseMapper调用就可以,这个是封装好的。

5mapper层

package com.lqf.multitable.dao.crm;import com.baomidou.mybatisplus.extension.plugins.pagination.Page;import com.lqf.multitable.bean.crm.FyUser;import com.baomidou.mybatisplus.core.mapper.BaseMapper;import com.lqf.multitable.bean.crm.UserRoleVo;import org.apache.ibatis.annotations.Select;import org.springframework.stereotype.Repository;import java.util.List;/**
 * <p>
 *  Mapper 接口
 * </p>
 *
 * @author lqf
 * @since 2018-10-02
 */@RepositorypublicinterfaceFyUserMapperextendsBaseMapper<FyUser>{@Select("SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id")
    List<UserRoleVo>selectUserListPage(Page<UserRoleVo> pagination);}

上方代码我直接通过注解进行了sql查询,你也可以通过mapper.xml进行,这里无需设置分页条件,会自动进行sql拼接,这里要注意sql的结尾不要用;否自自动拼接limit无法完成

6 测试结果

==>  Preparing: SELECT COUNT(1) FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id 
==> Parameters: 
<==    Columns: COUNT(1)
<==        Row: 391
==>  Preparing: SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id LIMIT 0,10 
==> Parameters: 
<==    Columns: user_id, create_time, update_time, username, password, realname, sex, mobile, password_md5, parent_id, status, auth_area, auth_city, role, residue_card_number, last_login_time, last_login_ip, last_login_count, auth_channel, internet, gold_coin, id, status_id, create_time, update_time, role_name, role_value, addible_value
********* 这里是查询到的信息,有隐私就不打印了
<==      Total: 10
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@63c12e52]
com.baomidou.mybatisplus.extension.plugins.pagination.Page@5d2828c9
 Time:61 ms - ID:com.lqf.multitable.dao.crm.FyUserMapper.selectUserListPage
Execute SQL:SELECT * FROM fy_user u LEFT JOIN fy_role r ON u.role = r.id LIMIT 0,10

上面的测试结果可以看出,总查询条数391条,分页后查询limit 0,10
查询耗时 61ms
到这里通过MP的分页插件进行多表联查并分页就演示完成了,诚心接受大家的指正。

作者:青蛙与大鹅
来源:CSDN
原文:https://blog.csdn.net/m0_37034294/article/details/82935436
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 作者:木村牧村
  • 原文链接:https://blog.csdn.net/a303549861/article/details/93467830
    更新时间:2022-07-26 14:46:11