MyBatis關聯查詢、多條件查詢
1、一對一查詢
任務需求;
根據班級的信息查詢出教師的相關信息
1、數據庫表的設計
班級表:

教師表:

2、實體類的設計
班級表:
| public class Classes { 9 //定義實體類的屬性,與class表中的字段對應 10 private int id; //id===>c_id 11 private String name; //name===>c_name 13 /** 14 * class表中有一個teacher_id字段,所以在Classes類中定義一個teacher屬性, 15 * 用於維護teacher和class之間的一對一關系,通過這個teacher屬性就可以知道這個班級是由哪個老師負責的 16 */ 17 private Teacher teacher; |
教師表:
public class Teacher { 9 //定義實體類的屬性,與teacher表中的字段對應 10 private int id; //id===>t_id 11 private String name; //name===>t_name |
3、定義mapper接口
| package com.ipcopyright.dao.read; public interface TeacherDaoR { // 級聯查詢班級信息帶教師信息 public Classes fintClassJoinTeacher(int id); //嵌套查詢 public Classes findclassjointeacher2(int id); } |
4、定義mappe.xml接口
方式一:嵌套結果——聯表查詢
sql查詢語句:SELECT * FROM class c,teacher t WHERE c.teacher_id=t.t_id AND c.c_id=1;
- 使用嵌套結果來處理重復的聯合結果的子集
- 封裝聯表查詢的數據(去除重復的數據)
| <!-- 嵌套結果 --> <!-- 聯表查詢,封裝結果子集 --> <select id="fintClassJoinTeacher" resultMap="baseresultMap" parameterType="int"> select * from class c ,teacher t where c.teacher_id = t.t_id and c.c_id = #{id} </select> <!-- 結果集封裝 --> <!-- 使用resultMap映射實體類和字段之間的一一對應關系 --> <resultMap type="com.ipcopyright.domain.Classes" id="baseresultMap"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" javaType="com.ipcopyright.domain.Teacher"> <id property="id" column="t_id"/> <result property="name" column="t_name"/> </association> </resultMap> |
resultMap:是將結果信息進行映射,保證查詢的數據和PO類的數據所對應
association:表示進行一對一關聯查詢映射
property:表示關聯查詢的結果存儲在classes類下面的teacher對象中
javaType:表示關聯查詢的映射結果類型
方式二:嵌套查詢——執行兩次查詢
sql語句:
SELECT * FROM class WHERE c_id=1;
SELECT * FROM teacher WHERE t_id=1 //1 是上一個查詢得到的teacher_id的值
- 通過執行另外一個SQL映射語句來返回預期的發雜類型
| <!-- 嵌套查詢 --> <select id="findclassjointeacher2" parameterType="int" resultMap="find2"> SELECT * FROM class WHERE c_id = #{id}; </select> <!-- 使用resultMap映射實體類和字段之間的一一對應關系 --> <resultMap type="com.ipcopyright.domain.Classes" id="find2"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <association property="teacher" column="teacher_id" select="getTeacher"/> </resultMap> <select id="getTeacher" resultType="com.ipcopyright.domain.Teacher" parameterType="int"> SELECT t_id id,t_name name FROM teacher WHERE t_id = #{id}; </select> |
resultMap:是將結果信息進行映射,保證查詢的數據和PO類的數據所對應
association:表示進行一對一關聯查詢映射
property : 查詢的結果放入到pojo類中的哪一個屬性當中
column : 向下一個查詢壓入的參數
select: 將查詢到的column中的id壓入到select為getTeacher的參數當中
注意:
select="getTeacher" 為<select id="getTeacher"的參數中可以隨便給任意名稱,只要是輸入參數與壓入進去的值類型相同就行。
不管輸入的參數名是什么,mybatis最終會執行為
效果:select t_id id , t_name name from teacher where t_id = resultSet.getInt(teacher_id)
5、Mybatsis一對一關聯查詢總結
Mybatis中使用association標簽來解決一對一的關聯查詢,association標簽可用的屬性如下:
- property:對象屬性的名稱
- javaType:對象屬性的類型
- column:所對應的外間字段名稱
- select:使用另一個查詢封裝的結果
2、一對多查詢
一對多查詢:只能使用resultMap來完成結果映射:
以[主信息]為主對象,[從信息]映射為集合或者對象,然后封裝到主對象當中
任務需求 ; 根據班級id查詢對應的班級信息(包括學生,老師信息)
1、數據庫表的設計
班級表:

教師表:

學生表:

2、實體類的設計
班級表:
| public class Classes { 9 //定義實體類的屬性,與class表中的字段對應 10 private int id; //id===>c_id 11 private String name; //name===>c_name 12 private Teacher teacher; //表中的teacher_id來進行一對一的維護 13 private List<Student> students;// 使用一個List<Student>集合屬性表示班級擁有的學生 |
教師表:
public class Teacher { 9 //定義實體類的屬性,與teacher表中的字段對應 10 private int id; //id===>t_id 11 private String name; //name===>t_name |
學生表
| public class Student { //定義屬性 private int id; private String name; |
3、定義mapper接口
| public interface TeacherDaoR { // 一對一查詢班級,教師信息(嵌套結果) public Classes fintClassJoinTeacher(int id); // 一對一查詢班級,教師信息(嵌套查詢) public Classes findclassjointeacher2(int id); //一對多查詢出班級、學生、教師信息 public Classes findclassjoints(int id); //一對多查詢出班級、學生、教師信息 public Classes findclassjoints2(int id); } |
4、定義mapper.xml
方式一:嵌套結果——聯表查詢
根據班級ID查詢對應的班級信息,包括學生信息,教師信息
sql語句:
SELECT * FROM class c, teacher t,student s
WHERE c.teacher_id=t.t_id AND c.C_id=s.class_id AND c.c_id=1
- 使用嵌套結果映射來處理重復的聯合結果的子集
| <resultMap type="com.ipcopyright.domain.Classes" id="resultClasses"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <!--一對一查詢出教師信息--> <association property="teacher" javaType="com.ipcopyright.domain.Teacher"> <id property="id" column="t_id"/> <result property="name" column="t_name"/> </association> <!-- 一對多查詢出學生信息 --> <collection property="students" ofType="com.ipcopyright.domain.Student"> <id property="id" column="s_id"/> <result property="name" column="s_name"/> </collection> </resultMap> |
Collection標簽:定義了一對多關聯的結果映射。
property:關聯查詢的結果集存儲在POJO類的哪個屬性。
ofType:指定關聯查詢的結果集中的對象類型即List中的對象類型。此處可以使用別名,也可以使用全限定名。
方式二:嵌套查詢——執行多次查詢
sql語句:
SELECT * FROM class WHERE c_id=1;
SELECT * FROM teacher WHERE t_id=1 //1 是上一個查詢得到的teacher_id的值
SELECT * FROM student WHERE class_id=1 //1是第一個查詢得到的c_id字段的值
首先:
查詢到班級的信息,通過班級的教師id查詢到教師的信息,通過班級的id查詢到學生的信息
| <!-- 通過執行另外一個映射語句返回預期的復雜類型 --> <select id="findclassjoints2" parameterType="int" resultMap="Classresult4"> select * from class where c_id = #{id}; </select> <resultMap type="com.ipcopyright.domain.Classes" id="Classresult4"> <id property="id" column="c_id"/> <result property="name" column="c_name"/> <!-- 一對一查詢教師信息 --> <association property="teacher" column="teacher_id" select="getTeacher1" /> <!-- 一對多查詢學生的信息 --> <collection property="students" column="c_id" select="getstudent1" /> </resultMap> <!-- 查詢教師的信息 --> <select id="getTeacher1" resultType="com.ipcopyright.domain.Teacher" parameterType="int"> select t_id as id,t_name as name from teacher where t_id = #{id}; </select> <!-- 查詢學生的信息 --> <select id="getstudent1" resultType="com.ipcopyright.domain.Student" parameterType="int"> select s_id as id,s_name as name from student where class_id = #{id}; </select> |
resultMap:是將結果信息進行映射,保證查詢的數據和PO類的數據所對應
<一對一>
association:表示進行一對一關聯查詢映射
property:關聯查詢的結果集存儲在POJO類的哪個屬性。
column : 向下一個查詢壓入的參數
select: 將查詢到的column中的id壓入到select為getTeacher的參數當中
<一對多>
Collection標簽:定義了一對多關聯的結果映射。
property:關聯查詢的結果集存儲在POJO類的哪個屬性。
column:傳入的id
select: 將查詢到的column中的id壓入到select為getTeacher的參數當中
注意:
另外查詢中不管輸入的參數名是什么,mybatis最終會將column中的值傳入進去,類型保證一致即可
效果:select t_id id , t_name name from teacher where t_id = resultSet.getInt(teacher_id)
3、關聯查詢總結resultType和resultMap
1、resultType
介紹:
如果沒有查詢結果的特殊要求,將查詢結果都映射成一個pojo的簡單類型屬性,建議使用resultType。
作用:
將查詢結果按照sql列名pojo屬性名一致性映射到pojo中。
適用:
一對一查詢中,無特殊要求,定義專門的POJO類作為輸出類型,其中定義了sql查詢結果集的所有字段(企業使用普遍)
場合:
常見一些明細記錄的展示,比如用戶購買商品明細,將關聯查詢信息全部展示在頁面時,此時可直接使用resultType將每一條記錄映射到pojo中,在前端頁面遍歷list(list中是pojo)即可
2、resultMap
介紹:
如果查詢結果有特殊要求,對映射結果需要進行高級映射,簡易使用resultMap
作用:
通過resultMap對查詢結果進行與pojo類屬性的映射設置
適用:
一對多查詢中,存在特殊要求,通過使用association和collection完成一對一和一對多高級映射
association:將關聯查詢信息映射到一個pojo對象中
collection:將關聯查詢信息映射到一個list集合中。
方便關聯查詢信息,將關聯信息映射到對象的pojo屬性中,或者list集合中
