Mybatis學習筆記--一對多關係的處理
阿新 • • 發佈:2021-02-10
文章目錄
本文章涉及環境版本:
- mysql 5.7
- Mybatis 3.5.x
- Maven 3.6.x
- JDK 1.8
專案程式碼倉庫:
https://github.com/Gang-bb/Study-Record/tree/main/bzhan-mybatis-study
需要clone整個bzhan-mybatis-study專案
(整體是一個maven多module工程)
該文章對應:《bzhan-mybatis-study06 》module專案
1. 測試環境搭建
主要關鍵類程式碼修改:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private Integer id;
private String name;
private Integer tid;
}
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Teacher {
private Integer id;
private String name;
private List<Student> students;
}
2. 例項測試
查詢教師及其所有學生
方式一:按照結果巢狀處理
- TeacherMapper
Teacher getTeacher();
- TeacherMapper.xml
<!--按結果巢狀查詢-->
<select id="getTeacher" resultMap="TeacherStudent">
select s.id sid, s.name sname, t.name tname,t.id tid
from student s,teacher t
where s.tid = t.id and t.id = #{tid}
</ select>
<resultMap id="TeacherStudent" type="Teacher">
<result property="id" column="tid"/>
<result property="name" column="tname"/>
<!--複雜的屬性,我們需要單獨處理 物件: association 集合: collection
javaType="" 指定屬性的型別!
集合中的泛型資訊,我們使用ofType獲取
-->
<collection property="students" ofType="Student">
<result property="id" column="sid"/>
<result property="name" column="sname"/>
<result property="tid" column="tid"/>
</collection>
</resultMap>
- 測試類
@Test
public void getTeacher(){
SqlSession sqlSession = null;
try {
sqlSession = MybatisUtil.openSession();
TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class);
System.out.println(teacherMapper.getTeacher(1));
} finally {
sqlSession.close();
}
}
- 結果
方式二:按照查詢巢狀處理
- TeacherMapper
Teacher getTeacher2();
- TeacherMapper.xml
<!-- 一對多模型 按照查詢巢狀處理-->
<select id="getTeacher2" resultMap="TeacherStudent2">
select id, name from teacher where id = #{id}
</select>
<resultMap id="TeacherStudent2" type="Teacher">
<result property="id" column="id"/>
<result property="name" column="name"/>
<collection property="students" javaType="ArrayList" ofType="Student" select="getStudentByTeacherId" column="id"/>
</resultMap>
<select id="getStudentByTeacherId" resultType="Student">
select * from student where tid = #{tid}
</select>
- 測試類
@Test
public void getTeacher(){
SqlSession sqlSession = null;
try {
sqlSession = MybatisUtil.openSession();
TeacherMapper teacherMapper = sqlSession.getMapper(TeacherMapper.class);
System.out.println(teacherMapper.getTeacher2(1));
} finally {
sqlSession.close();
}
}
- 結果
注意點:
- 保證SQL的可讀性,儘量保證通俗易懂
- 注意一對多和多對一中,屬性名和欄位的問題!