1. 程式人生 > >一文理清Mybatis中resultType與resultMap之間的關係和使用場景

一文理清Mybatis中resultType與resultMap之間的關係和使用場景

1.概要

Mybatis ORM半自動對映框架對java開發工程師來說應該是必會的框架之一。它的好處這裡不是我們討論的重點。令很多剛剛入行的java開發小夥伴迷茫的是 resultTyperesultMap的使用。今天來探討一下這個問題。

2.resultType與rsultMap

接下來我們就來講一下Mybatis中resultType與resultMap之間的關係和使用場景。

2.1 resultType

select語句中返回的期望型別的類的完全限定名或別名。 注意如果返回的是集合,那應該設定為集合包含的型別,而不是集合本身。可以使用 resultType 或 resultMap,但不能同時使用。

2.2 resultMap

從這條語句中返回的期望型別的類的完全限定名或別名。 注意如果返回的是集合,那應該設定為集合包含的型別,而不是集合本身。可以使用 resultType 或 resultMap,但不能同時使用。

2.3 共同點

resultTyperesultMap首先都是用來歸納查詢型別sql的結果集,對查詢結果進行你需要的結構描述。對於同一個select標籤中二者不能共存。這一點對很多人來說很好理解。重要的是不同點和對應的使用場景。

2.4 二者分別的使用場景

對於查詢結構需要返回的簡單pojo,結果都可以對映到一致的hashMap上,換句話來說就是資料庫列名可以精確匹配到pojo屬性的。一般都用resultType

。其實這裡有一個隱含的構建機制。對映到resultType的結果都是MyBatis在幕後自動建立了一個resultMap來處理的。簡而言之,只要resultType能幹的事情resultMap都能幹。二者定位是:

  • resultType用來處理非常簡單的結果集,就是列名能夠與pojo屬性匹配的的結果集。如果你只需要查詢一個班級的簡單情況,那麼用這個再合適不過了。
 @Data
 public class Grade{
   private String gradeId
   private String gradeName;
   private Integer studentCount;
 }

我們很簡單就可以使用下列操作:

<select id="selectGrades" resulttype="com.someapp.model.Grade">
  select gradeId,gradeName, studentCount
  from grade
  where gradeId = #{gradeId}
</select>

當然你也可以如上述所說使用resultMap

<resultmap id="GradeResultMap" type="com.someapp.entity.Grade">
  <id property="gradeId" column="grade_id" />
  <result property="gradeName" column="grade_name" />
  <result property="studentCount" column="student_count" />
</resultmap>

然後將上面的resultType轉換為resultMap即可,請注意我上面兩種需要處理欄位的駝峰風格,當然你可以設定Mybatis是否使用駝峰來進行規避。

  • resultMap更擅長來處理複雜對映的結果集。比如一對一、一對多的複雜關係。如果你不但要查詢一個班級的情況,附帶需要查詢班級所在的學校,班級學生的詳細情況,甚至是班級男女學生概況。就必須使用resultMap來描述這些對映關係了。這個例子我們來寫一下:

我們定義一個對上面關係描述的DTO:


 @Data
 public class GradeDTO {
    private String gradeId
    private String gradeName;
    private Integer studentCount;
    private School school;
    private List<teacher> teachers
    private List<boystudent> boyStudents;  
    private List<girlstudent> girlStudents;
    
 }
 

對應的對映處理:

<resultmap id="ComplexResultMap" type="GradeDTO">
       <!--   班級情況   -->
      <id property="gradeId" column="grade_id" />
      <result property="gradeName" column="grade_name" />
      <result property="studentCount" column="student_count" />
       <!--   班級對應的學校   -->
      <association property="school" javatype="School">
          <id property="schoolId" column="school_id" />
          <result property="schoolName" column="school_name" />
      </association>
       <!--   班級的老師們   -->
      <collection property="teachers" oftype="Teacher">
          <id property="teacherId" column="teacher_id" />
          <result property="teacherName" column="teacher_name" />
      </collection>
      <!--   根據性別來區分男女學生  注意這裡的語法未經過驗證 有興趣可找文件學習   -->
      <discriminator javatype="int" column="gender">
          <case value="0" resultType="GirlStudent" />
          <case value="1" resultType="BoyStudent" />
      </discriminator>
  </resultmap>

當然resultMap還可以像java類一樣繼承。總之,只要你想,這玩意兒你可以玩出花來。但是注意效能問題,儘量不要過多的巢狀。儘量配置延遲載入lazyLoadingEnabled以達到按需載入。

3.總結

本文主要通過簡單分析resultTyperesultMap的相同點與不同點來闡明它們各自的使用場景。更多詳盡的使用方法可以去Mybatis的官方文件檢視。希望通過本文的講解讓你在實際開發工作中不再困惑更加明瞭。

多多關注我的公眾號,可以得到更加及時的資訊和反饋。

在這裡插入圖片描述

</girlstudent></boystuden