Mybatis筆記(四):多對一的處理
阿新 • • 發佈:2021-10-14
時間:2021/10/14
一.目的
這次我們構建的資料庫表中存在多對一的關係,也就是多個學生對應一個老師。我們的目的是為了完成類似下面這種多表查詢的操作:
1 SELECT * FROM student s, teacher t WHERE s.tid = t.id;
查詢效果如下:
以下是為了完了完成這種多對一關係的多表查詢所需的準備工作和實際操作:
二.建立資料庫中相應的表
這裡我們在mybatis資料庫中新建了兩張表,分別是teacher表和student表,表中內容具體如下:
要注意student表中的tid列作為外來鍵與teacher表中的id列繫結。
三.編寫實體類
Teacher.class:
1 package bupt.machi.pojo; 2 3 public class Teacher { 4 5 private int id; 6 private String name; 7 8 public int getId() { 9 return id; 10 } 11 12 public String getName() { 13 return name; 14 } 15 16 public void setId(int id) { 17 this.id = id; 18 } 19 20 public void setName(String name) { 21 this.name = name; 22 } 23 24 @Override 25 public String toString() { 26 return "Teacher{" + 27 "id=" + id + 28 ", name='" + name + '\'' + 29 '}'; 30 } 31}
Student.class:
1 package bupt.machi.pojo; 2 3 public class Student { 4 5 private int id; 6 private String name; 7 //要注意這裡不要寫tid,要寫物件teacher,體現一對多,自己並不是很理解 8 //可能是為了簡化後面的操作 9 private Teacher teacher; 10 11 public int getId() { 12 return id; 13 } 14 15 public String getName() { 16 return name; 17 } 18 19 public Teacher getTeacher() { 20 return teacher; 21 } 22 23 public void setId(int id) { 24 this.id = id; 25 } 26 27 public void setName(String name) { 28 this.name = name; 29 } 30 31 public void setTeacher(Teacher teacher) { 32 this.teacher = teacher; 33 } 34 35 @Override 36 public String toString() { 37 return "Student{" + 38 "id=" + id + 39 ", name='" + name + '\'' + 40 ", teacher=" + teacher + 41 '}'; 42 } 43 }
要注意上面中屬性teacher是一個物件,而不是資料庫表中的tid,這位了更好的體現多對一的關係。
四.編寫介面
StudentMapper.xml:
1 package bupt.machi.dao; 2 3 import bupt.machi.pojo.Student; 4 5 import java.util.List; 6 7 public interface StudentMapper { 8 9 List<Student> getStudent(); 10 }
TeacherMapper.xml:
1 package bupt.machi.dao; 2 3 import bupt.machi.pojo.Teacher; 4 import org.apache.ibatis.annotations.Param; 5 import org.apache.ibatis.annotations.Select; 6 7 public interface TeacherMapper { 8 9 // @Select("select * from mybatis.teacher where id = #{tid}") 10 Teacher getTeacherById(@Param("tid") int id); 11 }
五.編寫Mapper配置檔案
之後我們會將Mapper配置檔案放在resouces資料夾中,這樣可以方便不同型別的檔案之間的分離,但是要注意該配置檔案的路徑要和對應介面的路徑一致,在resources中要用/,而不是Java包中的.來分隔。
1)首先寫一種結果不對的配置檔案寫法:
1 <?xml version="1.0" encoding="UTF8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <!--繫結介面--> 6 <mapper namespace="bupt.machi.dao.StudentMapper"> 7 <select id="getStudent" resultType="Student"> 8 select * from student 9 </select> 10 11 </mapper>
當使用上面這種寫法時,測試類執行出來的結果如下:
這是因為資料庫中查出來的tid與實體類中的Teacher屬性無法對應,導致了值為null情況的出現。
2)正確的配置檔案寫法
- 第一種方法:按照查詢巢狀處理,類似於子查詢
1 <?xml version="1.0" encoding="UTF8" ?> 2 <!DOCTYPE mapper 3 PUBLIC "-//mybatis.org//DTD Config 3.0//EN" 4 "http://mybatis.org/dtd/mybatis-3-mapper.dtd"> 5 <!--繫結介面--> 6 <mapper namespace="bupt.machi.dao.StudentMapper"> 7 <select id="getStudent" resultMap="student"> 8 select * from student 9 </select> 10 11 <!-- 這裡的type是來說明結果的型別,本質上還是Student型別的 --> 12 <resultMap id="student" type="Student"> 13 <!-- 複雜的屬性需要單獨處理 14 物件:association 15 集合:collection 16 --> 17 <!-- 由於屬性teacher是一個物件,需要用javaType說明他的類,使用select指定的查詢給他賦值 --> 18 <association property="teacher" column="tid" javaType="teacher" select="getTeacherById"/> 19 </resultMap> 20 21 <select id="getTeacherById" resultType="teacher"> 22 select * from teacher where id = #{tid} 23 </select> 24 </mapper>
具體講解見註釋,查詢結果如下:
- 第二種方法:按照結果巢狀處理,類似於聯表查詢
<select id="getStudent2" resultMap="student2"> select s.id sid, s.name sname, t.id tid, t.name tname from student s, teacher t where s.tid = t.id; </select> <resultMap id="student2" type="Student"> <result property="id" column="sid"/> <result property="name" column="sname"/> <association property="teacher" javaType="Teacher"> <result property="id" column="tid"/> <result property="name" column="tname"/> </association> </resultMap>
查詢結果如下:
努力,向上,自律