您好,登錄后才能下訂單哦!
本篇內容介紹了“Mybatis中resultType與resultMap之間的關系和使用場景”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!
Mybatis ORM半自動映射框架對java開發工程師來說應該是必會的框架之一。它的好處這里不是我們討論的重點。令很多剛剛入行的java開發小伙伴迷茫的是 resultType
與resultMap
的使用。今天來探討一下這個問題。
接下來我們就來講一下Mybatis中resultType與resultMap之間的關系和使用場景。
從select
語句中返回的期望類型的類的完全限定名或別名。 注意如果返回的是集合,那應該設置為集合包含的類型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同時使用。
從這條語句中返回的期望類型的類的完全限定名或別名。 注意如果返回的是集合,那應該設置為集合包含的類型,而不是集合本身。可以使用 resultType 或 resultMap,但不能同時使用。
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
:
<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
以達到按需加載。
本文主要通過簡單分析resultType
與resultMap
的相同點與不同點來闡明它們各自的使用場景。更多詳盡的使用方法可以去Mybatis的官方文檔查看。希望通過本文的講解讓你在實際開發工作中不再困惑更加明了。
“Mybatis中resultType與resultMap之間的關系和使用場景”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。