一、序言

在日常一线开发过程中,多表连接查询不可或缺,基于MybatisPlus多表连接查询究竟该如何实现,本文将带你找到答案。

在多表连接查询中,既有查询单条记录的情况,又有列表查询,还有分页查询,这些需求与多表连接是什么关系,又该如何实现,这是本文讨论的中心内容。

二、实战编码

1、两个关联DO

部门DO

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. @TableName(value = "tb_dept")
  5. public class Dept {
  6. private static final long serialVersionUID = 1L;
  7. @TableId(type = IdType.AUTO)
  8. private Long deptId;
  9. private String deptName;
  10. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  11. private LocalDateTime gmtCreate;
  12. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  13. private LocalDateTime gmtModified;
  14. private String tel;
  15. public Dept(Dept dept) {
  16. if (Objects.nonNull(dept)) {
  17. this.deptId = dept.deptId;
  18. this.deptName = dept.deptName;
  19. this.gmtCreate = dept.gmtCreate;
  20. this.gmtModified = dept.gmtModified;
  21. this.tel = dept.tel;
  22. }
  23. }
  24. }

用户DO

  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. @TableName(value = "tb_user")
  5. public class User {
  6. private static final long serialVersionUID = 1L;
  7. private Integer age;
  8. private Long deptId;
  9. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  10. private LocalDateTime gmtCreate;
  11. @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
  12. private LocalDateTime gmtModified;
  13. @TableId(type = IdType.AUTO)
  14. private Long userId;
  15. private String userName;
  16. public User(User user) {
  17. if (Objects.nonNull(user)) {
  18. this.age = user.age;
  19. this.deptId = user.deptId;
  20. this.gmtCreate = user.gmtCreate;
  21. this.gmtModified = user.gmtModified;
  22. this.userId = user.userId;
  23. this.userName = user.userName;
  24. }
  25. }
  26. }
2、部门VO
  1. @Data
  2. @NoArgsConstructor
  3. @AllArgsConstructor
  4. public class DeptVo extends Dept {
  5. private List<User> userList;
  6. /**
  7. * 实现部门DO 转 部门VO
  8. * @param dept
  9. */
  10. public DeptVo(Dept dept) {
  11. super(dept);
  12. }
  13. }
3、普通编码查询数据
  1. public IPage<DeptVo> selectDeptPage3() {
  2. LambdaQueryWrapper<Dept> wrapper = Wrappers.lambdaQuery(Dept.class);
  3. Page<Dept> deptPage = this.page(new Page<>(1, 3), wrapper);
  4. IPage<DeptVo> deptVoPage = EntityUtils.toPage(deptPage, DeptVo::new);
  5. // 完成userList字段属性注入
  6. Set<Long> deptIds = EntityUtils.toSet(deptVoPage.getRecords(), DeptVo::getDeptId);
  7. if (deptIds.size() > 0) {
  8. List<User> userList = userMapper.selectList(Wrappers.lambdaQuery(User.class)
  9. .in(User::getDeptId, deptIds));
  10. Map<Long, List<User>> map = EntityUtils.groupBy(userList, User::getDeptId);
  11. for (DeptVo deptVo : deptVoPage.getRecords()) {
  12. deptVo.setUserList(map.get(deptVo.getDeptId()));
  13. }
  14. }
  15. return deptVoPage;
  16. }
4、使用工具类查询数据

优化版 一行代码完成userList属性注入

  1. /**
  2. * 优化版 一行代码完成userList属性注入
  3. */
  4. @Override
  5. public IPage<DeptVo> selectDeptPage4() {
  6. LambdaQueryWrapper<Dept> wrapper = Wrappers.lambdaQuery(Dept.class);
  7. Page<Dept> deptPage = this.page(new Page<>(1, 3), wrapper);
  8. IPage<DeptVo> deptVoPage = EntityUtils.toPage(deptPage, DeptVo::new);
  9. // 一行代码完成userList属性注入
  10. FieldInjectUtils.injectListField(deptVoPage, DeptVo::getDeptId, UserServiceImpl.class, User::getDeptId, DeptVo::getUserList);
  11. return deptVoPage;
  12. }

需要指出的是FieldInjectUtils在工具包下

  1. <dependency>
  2. <groupId>xin.altitude.cms</groupId>
  3. <artifactId>ucode-cms-common</artifactId>
  4. <version>1.5.9.2</version>
  5. </dependency>

学习源码的朋友,源码直通车

5、演示数据
  1. {
  2. "code": 200,
  3. "msg": "操作成功",
  4. "data": {
  5. "records": [
  6. {
  7. "deptId": "10",
  8. "deptName": "Java",
  9. "gmtCreate": "2020-10-30 11:48:19",
  10. "gmtModified": "2021-05-24 15:11:17",
  11. "tel": "88886666",
  12. "userList": [
  13. {
  14. "age": 12,
  15. "deptId": "10",
  16. "gmtCreate": null,
  17. "gmtModified": "2022-11-05 16:44:22",
  18. "userId": "1",
  19. "userName": "Jone"
  20. }
  21. ]
  22. },
  23. {
  24. "deptId": "11",
  25. "deptName": "Mysql",
  26. "gmtCreate": "2020-10-30 11:48:44",
  27. "gmtModified": "2021-05-24 15:11:20",
  28. "tel": "80802121",
  29. "userList": [
  30. {
  31. "age": 23,
  32. "deptId": "11",
  33. "gmtCreate": null,
  34. "gmtModified": "2022-11-05 16:44:24",
  35. "userId": "2",
  36. "userName": "Jack"
  37. },
  38. {
  39. "age": 21,
  40. "deptId": "11",
  41. "gmtCreate": "2022-11-05 16:09:42",
  42. "gmtModified": "2022-11-05 16:11:28",
  43. "userId": "5",
  44. "userName": "滴滴"
  45. }
  46. ]
  47. },
  48. {
  49. "deptId": "12",
  50. "deptName": "Tomcat",
  51. "gmtCreate": "2020-10-30 11:48:44",
  52. "gmtModified": "2021-05-24 15:11:23",
  53. "tel": "23231212",
  54. "userList": [
  55. {
  56. "age": 22,
  57. "deptId": "12",
  58. "gmtCreate": null,
  59. "gmtModified": "2022-11-05 16:44:27",
  60. "userId": "3",
  61. "userName": "Billie"
  62. },
  63. {
  64. "age": 12,
  65. "deptId": "12",
  66. "gmtCreate": "2021-06-05 19:22:46",
  67. "gmtModified": "2021-10-21 14:38:26",
  68. "userId": "4",
  69. "userName": "didi"
  70. },
  71. {
  72. "age": 18,
  73. "deptId": "12",
  74. "gmtCreate": "2022-11-05 16:10:48",
  75. "gmtModified": "2022-11-05 16:11:36",
  76. "userId": "6",
  77. "userName": "嗒嗒"
  78. }
  79. ]
  80. }
  81. ],
  82. "total": 4,
  83. "size": 3,
  84. "current": 1,
  85. "orders": [],
  86. "optimizeCountSql": true,
  87. "searchCount": true,
  88. "countId": null,
  89. "maxLimit": null,
  90. "pages": 2
  91. }
  92. }

三、小结

本文完成了MybatisPlus一对多分页查询数据的开发需求,更多细节内容,视频直通车。

MybatisPlus多表连接查询一对多分页查询数据的更多相关文章

  1. 【mysql】 mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件 【mybatis】count 统计+JSON查询

    mybatis实现 主从表 left join  1:n 一对多 分页查询   主表从表都有查询条件+count 需求: ======================================= ...

  2. 分页查询信息(使用jdbc连接mysql数据库实现分页查询任务)

             分页查询信息       使用jdbc连接mysql数据库实现分页查询任务 通过mysql数据库提供的分页机制,实现商品信息的分页查询功能,将查询到的信息显示到jsp页面上. 本项目 ...

  3. MybatisPlus多表连接查询

    一.序言 (一)背景内容 软件应用技术架构中DAO层最常见的选型组件为MyBatis,熟悉MyBatis的朋友都清楚,曾几何时MyBatis是多么的风光,使用XML文件解决了复杂的数据库访问的难题.时 ...

  4. 【mybatis】在mybatis分页查询时,主表对关联表 一对多 分页查询怎么实现

    现在有这样一个需求: 1.积分商品分页查询 2.一个积分商品会有多张商品图片在商品图片表  1:n的关系 这样在积分商品分页查询的时候,想要顺便把每个积分商品对应的商品图片信息也带出来 实现如下: 1 ...

  5. JPA分页查询与条件分页查询

    情有独钟的JPA 平时在写一些小项目时,比较喜欢引用 Spring Data Jpa,其实还是图他写代码快~在日常的开发工作中,分页列表查询基本是随处可见,下面一起看一下如何使用 jpa 进行多条件查 ...

  6. MySQL的分页查询及Oracle分页查询

    MySQL: Select ... from ...where ...order by...limit start,pageNum 例:比如从 取 个数据 , String sql = )*pageR ...

  7. Oracle 数据库分页查询与排序分页查询

    一.分页查询 原始查询语句 SELECT * FROM NASLE_WFSHH 修改为分页查询语句,加上 ROWNUM 列.此处为查询第 1 页,每页 9 条数据 SELECT * FROM ( SE ...

  8. DQL分组查询和DQL分页查询

    分组查询: 1.语法:group by 分组字段: 2.注意: 分组之后查询的字符按:分组字段.聚合函数 where 和having 的区别 where再分组前进行限定,如果不满足条件则不参与分组.h ...

  9. oracle 一对多数据分页查询筛选

    今天项目测试运行的时候,遇到了一个奇怪的问题,这个问题说起来按sql语法的话是没有错误的 但是呢按照我们的业务来做区分就有些逻辑上的错误了, 下面请听我慢慢道来,在数据库中有两个数据, 先来看下第一次 ...

  10. linq查询集合并分页展示数据

    private void Bind() { if (Request.QueryString["QuestionNo"] != null) { string QuestionNo = ...

随机推荐

  1. 5.第四篇 Etcd存储组件高可用部署

    文章转载自:https://mp.weixin.qq.com/s?__biz=MzI1MDgwNzQ1MQ==&mid=2247483792&idx=1&sn=b991443c ...

  2. 查找Linux下的大目录或文件

    目录 du -h --max-depth=1 du -h --max-depth=2 | sort -n du -hm --max-depth=2 | sort -n du -hm --max-dep ...

  3. 授予用户/用户组访问 Kubernetes 的一个名称空间

    转载地址:https://www.kuboard.cn/learning/k8s-advanced/sec/rbac/auth-namespace.html 前提条件 已安装 Kuboard v3,版 ...

  4. 在k8s中将nginx.conf文件内容创建为ConfigMap挂载到pod容器中

    将nginx.conf文件内容创建为ConfigMap user nginx; worker_processes auto; error_log /var/log/nginx/error.log er ...

  5. k8s中yaml文件常见参数含义

    apiVersion: apps/v1 #与k8s集群版本有关,使用 kubectl api-versions 即可查看当前集群支持的版本 kind: Deployment #该配置的类型,我们使用的 ...

  6. Qemu/Limbo/KVM镜像 Ubuntu 22.04 精简版,可运行Windows软件,内存占用不到200M

    镜像特征: Ubuntu 22.04系统 内置Wine 7.8,可运行大量Windows 软件 高度精简,内存占用仅200M不到. 自制UI,Windows3.1风格. 完全开源 镜像说明: 用户名为 ...

  7. Upscayl,免费开源的 AI 图像增强软件

    有的时候我们找遍了全网却难以找到一张模糊图片的原图,这时候我们想如果能够一键将图片变成高清的就好了.其实这正是计算机视觉的一大研究反向--图形增强,通过AI计算将模糊的图片增强,将几百kb的低像素图片 ...

  8. 将Java代码打包成jar文件转换为.exe可执行程序方法

    ​ 做完学生管理系统后我想将代码打包成一个可执行程序,那样就可以直接点击在Windows下运行了,下面就跟大家分享下打包方法. 将Java的代码转换成 .exe 文件需要先把代码打包成 jar 文件然 ...

  9. numba jit加速python程序

    numba numba加速循环.numpy的一些运算,大概是将python和numpy的一些代码转化为机器代码,速度飞快! 加速耗时很长的循环时: from numba import jit # 在函 ...

  10. VS2022连接Oracle数据库所需包和连接字符串

    VS连接ORACLE数据库 l  VS2022连接ORACLE数据库时,需要引入Oracle.ManagedDataAccess.Core包. l  引入方式:打开VS2022==>项目==&g ...