天天看點

Mybatis中多對一查詢的兩種方式

第一種是按照結果嵌套查詢

  1. 其實也就是先查詢出把兩個表結合一塊的那種,然後對結果集在進行嵌套
  2. 自定義resultMap結果集,然後在這個結果集中再去把另一張表進行關聯進去,通過的是兩個表的外鍵的那個列名,最後是把另一張表的那個主鍵id(這裡是teacher),給映射到另一個表的外鍵id(這裡是student的和teacher的外鍵tid)
  3. 然後把這個mapper的xml檔案映射給mybatis的全局配置檔案中的mapper中
  4. 就是直接測試了
<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());
        }
    }
}
           

第二種就是 按結果查詢處理

  1. 先查詢student的表,然後在這個傳回自定義的resultMap集中再去關聯另外一個外鍵的表(這裡指teacher表)
  2. 然後通過外鍵的那個列把兩個表給關聯起來
  3. 再去查詢另外一個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>-->
           

這個測試的檔案和上一個一樣

總結:用第一種的話思路會比較清晰,但是在書寫SQL語句的話會比較麻煩些,第二種的話邏輯有點多,但是SQL語句書寫比較簡單