在学习多对一的处理时,我们是站在学生的角度(多个学生对应一个老师)看待问题,但如果站在老师角度,就应该是一对多(一个老师对应多个学习)。
Student Bean
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private int id;
private String name;
//学生需要关联一个老师
private int tid;
}
Teacher Bean
@Data
public class Teacher {
private int id;
private String name;
//老师包含多个学生
private List<Student> students;
}
TeacherMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="org.johngea.mapper.TeacherMapper">
<select id="getTeacher" resultMap="getTeacher">
select t.id tid,t.name tname,s.id sid,s.name sname,s.tid stid
from teacher t, student s
where t.id = s.tid and t.id = #{id}
</select>
<resultMap id="getTeacher" type="Teacher">
<result column="tid" property="id"/>
<result column="tname" property="name"/>
<!--collection表示集合关系--ofType取集合的泛型类型-->
<collection property="students" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="stid"/>
</collection>
</resultMap>
</mapper>
这种方式和之前多对一中的按结果嵌套处理方式一样,属于联表的查询方式。
运行结果
Teacher(
id=1,
name=秦老师,
students=[
Student(id=1,
name=小明,
tid=1),
Student(id=2,
name=小红,
tid=1),
Student(id=3,
name=小张,
tid=1),
Student(id=4,
name=小李,
tid=1),
Student(id=5,
name=小王,
tid=1)]
)
当然还有嵌套查询的方式,只不过不建议使用
<select id="getTeacher2" resultMap="getTeacher2">
select * from teacher where id = #{id}
</select>
<resultMap id="getTeacher2" type="Teacher">
<!--嵌套的子查询语句中,返回的结果为多条数据,在Teacher类中对应的List<Student> 因此查询结果对象应该指定List类型(我自己测试如果指定了ofType可以不写javaType)-->
<collection property="students" column="id" javaType="ArrayList" ofType="Student" select="getStudentByTid"/>
</resultMap>
<select id="getStudentByTid" resultType="Student">
select * from student where tid = #{tid}
</select>
10 - 11小结、
-
id 一个 ID 结果;标记出作为 ID 的结果可以帮助提高整体性能(一般用于主键)
-
result 注入到字段或 JavaBean 属性的普通结果
-
association 【多对一】
-
一个复杂类型的关联;许多结果将包装成这种类型
-
嵌套结果映射 – 关联可以是
resultMap
元素,或是对其它结果映射的引用
-
-
collection 【一对多】
-
一个复杂类型的集合
-
嵌套结果映射 – 集合可以是
resultMap
元素,或是对其它结果映射的引用javaType & ofType
-
javaType 用来指定实体类中类型的属性;
-
ofType 用来指定映射到List或者集合中的Bean类型,或者说就是泛型的约束类型;
-
注意点:
- 保证SQL的可读性,尽量保证通俗易懂;
- 注意一对多多对一中,属性名和字段的问题;
- 如果问题不好排查,可以使用日志,建议使用LOG4J;