一文理清Mybatis中resultType與resultMap之間的關係和使用場景
1.概要
Mybatis ORM半自動對映框架對java開發工程師來說應該是必會的框架之一。它的好處這裡不是我們討論的重點。令很多剛剛入行的java開發小夥伴迷茫的是 resultType
與resultMap
的使用。今天來探討一下這個問題。
2.resultType與rsultMap
接下來我們就來講一下Mybatis中resultType與resultMap之間的關係和使用場景。
2.1 resultType
從select
語句中返回的期望型別的類的完全限定名或別名。 注意如果返回的是集合,那應該設定為集合包含的型別,而不是集合本身。可以使用 resultType 或 resultMap,但不能同時使用。
2.2 resultMap
從這條語句中返回的期望型別的類的完全限定名或別名。 注意如果返回的是集合,那應該設定為集合包含的型別,而不是集合本身。可以使用 resultType 或 resultMap,但不能同時使用。
2.3 共同點
resultType
與resultMap
首先都是用來歸納查詢型別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.總結
本文主要通過簡單分析resultType
與resultMap
的相同點與不同點來闡明它們各自的使用場景。更多詳盡的使用方法可以去Mybatis的官方文件檢視。希望通過本文的講解讓你在實際開發工作中不再困惑更加明瞭。
多多關注我的公眾號,可以得到更加及時的資訊和反饋。
</girlstudent></boystuden