1. 程式人生 > 其它 >Mybatis學習筆記--一對多關係的處理

Mybatis學習筆記--一對多關係的處理

技術標籤:Mybatismysqlsqljava

文章目錄

本文章涉及環境版本:

  • 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. 例項測試

查詢教師及其所有學生

方式一:按照結果巢狀處理

  1. TeacherMapper
Teacher getTeacher();
  1. 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>
  1. 測試類
@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();
    }
}
  1. 結果
image-20210209105313073

方式二:按照查詢巢狀處理

  1. TeacherMapper
Teacher getTeacher2();
  1. 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>
  1. 測試類
@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();
    }
}
  1. 結果
image-20210209113935466

注意點:

  • 保證SQL的可讀性,儘量保證通俗易懂
  • 注意一對多和多對一中,屬性名和欄位的問題!