• Mybatis的collection三层嵌套查询(验证通过)


    在Mybatis中存在很多1对N查询的场景,比如在打开一个编辑页面时,需要带出对应的新增时添加的数据,如果页面有一些多个层级一对多的情况,那么在编辑时就需要查询出所有的层级。

    当然这种情况,先查询出最外面的情况,再循环查询数据库查询出里面的数据也是没问题的,但是这样性能会非常差。最好的方式就是直接在Mybatis中直接做好1对多的映射直接查询出来。

    一般情况下,我们都是两层的嵌套,类似这样的:

    1. @Data
    2. public class Class {
    3. private String classId;
    4. private String className;
    5. pirvate List studentList;
    6. }
    7. @Data
    8. public class Student {
    9. private String studentId;
    10. private String studentName;
    11. private String classId;
    12. }

     这种两层嵌套的查询比较好处理,网上的方案也比较多,大家可以自行百度。

    但是如果是三层,乃至于多层的嵌套就不太好处理了。

    找到一个方案:

    mybatis 多层级collection嵌套

    是否可行,没有尝试。

    下面是我自己的方案,在项目中亲测可行。

    实体类的映射关系

    1. # 一个班级有多个学生
    2. @Data
    3. public class Class {
    4. private String classId;
    5. private String className;
    6. pirvate List studentList;
    7. }
    8. # 一个学生有多个爱好
    9. @Data
    10. public class Student {
    11. private String studentId;
    12. private String studentName;
    13. private String classId;
    14. pirvate List hobbyList;
    15. }
    16. # 爱好
    17. @Data
    18. public class Hobby {
    19. private String hobbyId;
    20. private String hobbyName;
    21. private String studentId;
    22. }

     SQL映射关系如下:

    其中第一个resultMap是一种分开SQL查询的处理方式,第二个resultMap是一种单个SQL解决嵌套问题的写法。这里我把它们融合为一个了。

    如果是只有两层嵌套的话,基本上一个SQL的写法就可以搞定,或者说简洁明了的方式就使用两个SQL的写法。

    解析如下:

    classMap:

    查询class的信息,以及对应的学生列表,采用2个SQL的写法处理,其中select是查询这个studentList的SQL的id,即queryStudentInfo。传递的column是两张表关联的字段,也就是说将第一层的班级id传递到下一个SQL中作为参数。

    studentMap:

    查询学生的信息,以及爱好列表,采用单个SQL的查询方式,直接把爱好的字段直接放在了collection中。

    1. <resultMap id="classMap" type="com.xxx.Class">
    2. <id column="class_id" property="classId"/>
    3. <result column="class_name" property="className"/>
    4. <collection property="studentList" javaType="java.util.List"
    5. ofType="com.xxx.StudentPO"
    6. select="queryStudentInfo" column="class_id">
    7. collection>
    8. resultMap>
    9. <resultMap id="studentMap" type="com.xxx.Student">
    10. <id column="student_id" property="studentId"/>
    11. <result column="student_name" property="studentName"/>
    12. <collection property="hobbyList" javaType="java.util.List"
    13. ofType="com.xxx.Hobby">
    14. <id column="hobby_id" property="hobbyId"/>
    15. <result column="hobby_name" property="hobbyName"/>
    16. collection>
    17. resultMap>

    SQL如下:

    1. <select id="queryClassInfo" resultMap="classMap">
    2. SELECT
    3. class_id,
    4. class_name
    5. FROM
    6. class
    7. where
    8. class_id = #{classId}
    9. </select>
    10. <select id="queryStudentInfo" resultMap="studentMap">
    11. SELECT
    12. sutdent_id,
    13. sutdent_name,
    14. hobby_id,
    15. hobby_name
    16. FROM
    17. student t1
    18. LEFT JOIN
    19. hobby t2
    20. ON
    21. t1.sutdent_id = t2.sutdent_id
    22. where
    23. class_id = #{classId}
    24. </select>

  • 相关阅读:
    数据湖:海量日志采集引擎Flume
    用【mysql,vue,node】制作一个前后端分离小项目
    超详细反编译python打包的exe
    NumPy 中的排序方法(sort, argsort, lexsort, partition, argpartition, searchsorted)
    渗透测试-目录遍历漏洞
    适用于LLM的代理搜索增强事实评估器 (Search-Augmented Factuality Evaluator,SAFE)
    LeetCode二叉树OJ
    Centos7上安装MySQL8教程
    「百川智能」获22亿元融资,腾讯、阿里、小米等参投
    《C语言程序设计 第4版》笔记和代码 第十一章 指针和数组
  • 原文地址:https://blog.csdn.net/qq_42971035/article/details/126405556