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

1.概要

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

2.resultType與resultMap

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

2.1 resultType

select語句中返回的指望類型的類的徹底限定名或別名。 注意若是返回的是集合,那應該設置爲集合包含的類型,而不是集合自己。可使用 resultType 或 resultMap,但不能同時使用。數據庫

2.2 resultMap

從這條語句中返回的指望類型的類的徹底限定名或別名。 注意若是返回的是集合,那應該設置爲集合包含的類型,而不是集合自己。可使用 resultType 或 resultMap,但不能同時使用。app

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>

固然你也能夠如上述所說使用resultMapcode

<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是否使用駝峯來進行規避。xml

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

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

@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的官方文檔查看。但願經過本文的講解讓你在實際開發工做中再也不困惑更加明瞭。

多多關注個人公衆號,能夠獲得更加及時的資訊和反饋。

相關文章
相關標籤/搜索