MyBatis關聯查詢、多條件查詢


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集合中

                                              

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM