第一種是按照結果嵌套查詢
- 其實也就是先查詢出把兩個表結合一塊的那種,然後對結果集在進行嵌套
- 自定義resultMap結果集,然後在這個結果集中再去把另一張表進行關聯進去,通過的是兩個表的外鍵的那個列名,最後是把另一張表的那個主鍵id(這裡是teacher),給映射到另一個表的外鍵id(這裡是student的和teacher的外鍵tid)
- 然後把這個mapper的xml檔案映射給mybatis的全局配置檔案中的mapper中
- 就是直接測試了
<select id="getStudent" resultMap="StudentTeacher">
SELECT s.id sid , s.name sname ,s.tid stid , t.id tid, t.name tname
FROM student s ,teacher t WHERE s.tid=t.id
</select>
<!--這個id就是能找到是你哪個SQL語句的resultType的值,而type就是你最終想得到的結果的映射類型-->
<resultMap id="StudentTeacher" type="Student">
<!--這個id就是自己定義的列名-->
<id column="sid" property="id"/>
<result column="sname" property="name"/>
<!--關聯對象-->
<association property="teacher" javaType="Teacher">
<id column="tid" property="id"/>
<result column="tname" property="name"/>
</association>
</resultMap>
測試主函數
package test;
import beans.Student;
import dao.StudentDao;
import java.io.IOException;
import java.util.List;
public class TestOneToMany {
public static void main(String[] args) throws IOException {
StudentDao studentDao = new StudentDao();
List<Student> list = studentDao.getAll();
for (Student student : list) {
System.out.println("學生的姓名是>>>>"+student.getName()+"學生的老師的姓名>>>>"
+student.getTeacher().getName());
}
}
}
第二種就是 按結果查詢處理
- 先查詢student的表,然後在這個傳回自定義的resultMap集中再去關聯另外一個外鍵的表(這裡指teacher表)
- 然後通過外鍵的那個列把兩個表給關聯起來
- 再去查詢另外一個teacher表(可以建立一個mapper的xml配置檔案)
<!--這個是按查詢的嵌套進行處理的-->
<select id="getStudent" resultMap="StudentTeacher">
SELECT * FROM user
</select>
<resultMap id="StudentTeacher" type="Student">
<!--然後這個關聯的是另外一個查詢另一張的teacher的表,也就是說需要建兩個mapper的SQL語句的xml檔案-->
<association property="teacher" column="tid"
javaType="Teacher" select="TeacherMapper.getTeacher">
</association>
</resultMap>
<!--這個就是查詢另一張teacher的表的映射SQL(下面這個映射如果想更加規範的話也可以放在另外一個mapper的xml中去)-->
<!--<select id="getTeacher" resultType="Teacher">
SELECT * FROM teacher WHERE id = #{id}
</select>-->
這個測試的檔案和上一個一樣