Mybatis ORM半自動映射框架對java開發工程師來講應該是必會的框架之一。它的好處這裏不是咱們討論的重點。令不少剛剛入行的java開發小夥伴迷茫的是 resultType
與resultMap
的使用。今天來探討一下這個問題。java
接下來咱們就來說一下Mybatis中resultType與resultMap之間的關係和使用場景。sql
從select
語句中返回的指望類型的類的徹底限定名或別名。 注意若是返回的是集合,那應該設置爲集合包含的類型,而不是集合自己。可使用 resultType 或 resultMap,但不能同時使用。數據庫
從這條語句中返回的指望類型的類的徹底限定名或別名。 注意若是返回的是集合,那應該設置爲集合包含的類型,而不是集合自己。可使用 resultType 或 resultMap,但不能同時使用。app
resultType
與resultMap
首先都是用來概括查詢類型sql的結果集,對查詢結果進行你須要的結構描述。對於同一個select
標籤中兩者不能共存。這一點對不少人來講很好理解。重要的是不一樣點和對應的使用場景。框架
對於查詢結構須要返回的簡單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
:code
<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
以達到按需加載。
本文主要經過簡單分析resultType
與resultMap
的相同點與不一樣點來闡明它們各自的使用場景。更多詳盡的使用方法能夠去Mybatis的官方文檔查看。但願經過本文的講解讓你在實際開發工做中再也不困惑更加明瞭。
多多關注個人公衆號,能夠獲得更加及時的資訊和反饋。