欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Mybatis处理一对一 、 一对多关系

程序员文章站 2022-07-09 11:50:59
...

一、持有其它对象(最简单Bean处理法)

        例如   班级类ClassRoom类,这个类中有一个成员变量:班主任Teacher。班主任有一个name属性。

public class ClassRoom {
    //班级编号
    private Long id;
    //一个班级有一个班主任
    private Teacher teacher;
    //班主任的id
    private Long TeacherId;
    //get set

}

class Teacher {
    //班主任名称
    private String name;
    //get set  
}

        核心:映射到某个对象的某个属性中 

SELECT 
    c.id    c.id ,
    t.name  "teacher.name", //映射到某个对象的某个属性中
    t.id    teacherId
FROM T_CLASSROOM c  LEFT JOIN T_TEACHER  t  ON  c.tid = t.id; 

二、持有其它对象集合

        一个学生,他的住址可能会有多个。所以,在Student实体中,有一个List<Address> addressList集合。

        然后我们,在查询的时候,查到了这个学生的主键ID。再拿学生的主键ID去地址表里面查询。

         Mybatis处理文件如下:

<!-- (1)首先是一个查询所有学生的SQL-->
<!-- (2)然后映射学生的基本数据,再使用collection级联查询-->
<!-- (3)最后再通过相关查询条件,查询并封装List集合数据-->

<!-- (1)首先是一个查询所有学生的SQL-->
<select id="getAllStudent" resultMap="studentMaps">
       select
        ID ,
        STU_NAME ,
        STU_AGE
        from T_STUDENT
  </select>

<!-- (2)然后映射学生的基本数据,再使用collection级联查询-->
    <resultMap id="studentMaps" type="com.safesoft.elephant.domain.address.entity.Student">
        <id column="ID" property="id"/>
        <result column="STU_NAME" property="stuName"/>
        <result column="STU_AGE" property="stuAge"/>
        <!--
               property:Java中list的引用名
               ofType:List的泛型
               select:即将要查询的SQL语句的id
               column:传递过去的查询参数
        -->
        <collection property="addressesList" ofType="com.safesoft.elephant.domain.address.entity.Address"
                    select="getAddress" column="ID">
        </collection>
    </resultMap>

<!-- (3)最后再通过相关查询条件,查询并封装List集合数据-->
    <select id="getAddress" parameterType="int" resultType="com.safesoft.elephant.domain.address.entity.Address">
        SELECT
        ADDRESS_NAME addressName,
        ADDRESS_CODE addressCode
        FROM `T_ADDRESS` WHERE STU_ID = #{ID}
    </select>

 

@Getter
@Setter
public class Address {

    private Long id;

    private String addressName;

    private String addressCode;

    private String stuId;
}

@Getter
@Setter
public class Student {

    private Long id;

    private String stuName;

    private String stuAge;

    private List<Address> addressesList;
}

三、处理复杂一对一可使用

<!-- (1)先把所有属性都查询出来 -->
<!-- (2)为自己的属性装配,再通过association装配其它属性-->
 <!-- (1)先把所有属性都查询出来 -->
    <select id="getAllAddress" resultMap="baseMap">
       select
        address.ID addressId,
        address.ADDRESS_NAME addressName,
        address.ADDRESS_CODE addressCode,
        student.ID studentId,
        student.STU_NAME studentName,
        student.STU_AGE studentAge
        from T_ADDRESS address JOIN t_student student ON student.ID = address.STU_ID
  </select>

    <!-- (2)为自己的属性装配,再通过association装配其它属性-->
    <resultMap id="baseMap" type="com.safesoft.elephant.domain.address.entity.Address">
        <id property="id" column="addressId"/>
        <result property="addressName" column="addressName"/>
        <result property="addressCode" column="addressCode"/>

        <association property="student" javaType="com.safesoft.elephant.domain.address.entity.Student">
            <id property="id" column="studentId"/>
            <result property="stuName" column="studentName"/>
            <result property="stuAge" column="studentAge"/>
        </association>
    </resultMap>