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>
上一篇: poj 1284 求原根
下一篇: hibernate的一对多关系