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

版权声明:欢迎转载大宇的博客,转载请注明出处: https://blog.csdn.net/yanluandai1985/article/details/89228648

一、持有其它对象(最简单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>

猜你喜欢

转载自blog.csdn.net/yanluandai1985/article/details/89228648
今日推荐