MyBatis场景题,球解答

问题遇到的现象和发生背景

求问mybatis场景题
现有A,B,C三表,A为主表,B为中间表,C为副表,A和C为1对多的关系,在实体类中,c为a的List型变量 , 现在要对A进行分页查询,求问mybatis能不能实现一条sql完成这种查询? 先查主表,再遍历数据循环查副表,这种方式是不是效率很低,有没有优化的方式?

用代码块功能插入代码,请勿粘贴截图

可以的,你可以使用collection,关联属性

<?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">
  <!-- namespace是指要处理哪一个接口类下的方法,所以必须要改为ClassDao -->
  <mapper namespace="com.xx.Dao.ClassDao">
      <!-- 先去数据库中执行,成功执行之后再去写resultMap -->
      <select id="getClassStudent" resultMap="classStudents">
         select 
         c.*,
         stu.id sid,
         stu.stu_name,
         stu.stu_age,
         stu.stu_class_id 
         from 
         com_class c 
         left join 
         com_student stu 
         on 
         c.id = stu.stu_class_id 
         where 
         c.id=#{id};
     </select>
     
     <!-- type是对班级类定义的封装规则,该规则的唯一标识是classStudents -->
     <resultMap type="com.xx.Bean.Class" id="classStudents">
         <!-- 
             collection:定义集合元素的封装
                 property:指定实体类的哪一个属性是集合属性,MyBatis会将查询出来的集合封装到这里。
                 javaType:指定对象的类型,和ofType区分。
                 ofType:指定集合里面元素的类型。
          -->
          <id property="id" column="id"/>
          <result property="className" column="class_name"/>
          <result property="classNum" column="class_num"/>
          <collection property="students" ofType="com.xx.Bean.Student">
              <result property="id" column="sid"/>
              <result property="stuName" column="stu_name"/>
              <result property="stuAge" column="stu_age"/>
              <result property="stuClassId" column="stu_class_id"/>
          </collection>
     </resultMap>
  </mapper>

可以参考我这篇文章,http://t.csdn.cn/F0fMZ

个人认为 如果是实体里面包含list的话 ,并且是分页查询的话 ,可以采用代码层面实现,效率不会低。只会占用一些内存。
思路:
首先分页查询主表记录 一般都是10条
然后再写一个查询用主表和副表关联的字段查询分页需要的所有需要副表的记录 一般都是 in 方式查询
然后循环遍历主表 给副表的list赋值 可以使用stream 方式过滤 。
这样效率不会比一个sql效率低 。尤其是数据量非常大的情况下。因为分页后数据量10条左右的主表 ,再查询明细数据量会少很多

先主表附表关联,然后一起查
参考链接

public class User implements Serializable {
    private Integer userId;
    private String userName;
    private String userAddress;
    private String userSex;
    private Date userBirthday;
    //一对多关系映射:主表实体应该包含从表实体的集合引用
    private List<Account> accounts;
}

<resultMap id="userAccountMap" type="user">
    <!-- 主键字段的对应 -->
    <id property="userId" column="id"></id>
    <!--非主键字段的对应-->
    <result property="userName" column="username"></result>
    <result property="userAddress" column="address"></result>
    <result property="userSex" column="sex"></result>
    <result property="userBirthday" column="birthday"></result>
    <!-- 配置user对象中accounts集合的映射 -->
    <collection property="accounts" ofType="account">
        <id property="aid" column="aid"></id>
        <result property="uid" column="uid"></result>
        <result property="money" column="money"></result>
    </collection>
</resultMap>

<!-- 查询所有 user的一对多的信息 -->
<select id="findUserAccount" resultMap="userAccountMap">
    select * from user u left outer join account a on U.ID = a.uid
</select>

这种方式是可以一次性查询出来的。

参考这个
https://blog.csdn.net/weixin_40040107/article/details/122587442