Mybatis中resultType與resultMap之間的關(guān)系和使用場(chǎng)景

本篇內(nèi)容介紹了“Mybatis中resultType與resultMap之間的關(guān)系和使用場(chǎng)景”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)公司專(zhuān)注于射陽(yáng)企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站設(shè)計(jì),商城開(kāi)發(fā)。射陽(yáng)網(wǎng)站建設(shè)公司,為射陽(yáng)等地區(qū)提供建站服務(wù)。全流程按需規(guī)劃網(wǎng)站,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)

1.概要

Mybatis ORM半自動(dòng)映射框架對(duì)java開(kāi)發(fā)工程師來(lái)說(shuō)應(yīng)該是必會(huì)的框架之一。它的好處這里不是我們討論的重點(diǎn)。令很多剛剛?cè)胄械膉ava開(kāi)發(fā)小伙伴迷茫的是 resultTyperesultMap的使用。今天來(lái)探討一下這個(gè)問(wèn)題。

2.resultType與resultMap

接下來(lái)我們就來(lái)講一下Mybatis中resultType與resultMap之間的關(guān)系和使用場(chǎng)景。

2.1 resultType

select語(yǔ)句中返回的期望類(lèi)型的類(lèi)的完全限定名或別名。 注意如果返回的是集合,那應(yīng)該設(shè)置為集合包含的類(lèi)型,而不是集合本身??梢允褂?resultType 或 resultMap,但不能同時(shí)使用。

2.2 resultMap

從這條語(yǔ)句中返回的期望類(lèi)型的類(lèi)的完全限定名或別名。 注意如果返回的是集合,那應(yīng)該設(shè)置為集合包含的類(lèi)型,而不是集合本身??梢允褂?resultType 或 resultMap,但不能同時(shí)使用。

2.3 共同點(diǎn)

resultTyperesultMap首先都是用來(lái)歸納查詢(xún)類(lèi)型sql的結(jié)果集,對(duì)查詢(xún)結(jié)果進(jìn)行你需要的結(jié)構(gòu)描述。對(duì)于同一個(gè)select標(biāo)簽中二者不能共存。這一點(diǎn)對(duì)很多人來(lái)說(shuō)很好理解。重要的是不同點(diǎn)和對(duì)應(yīng)的使用場(chǎng)景。

2.4 二者分別的使用場(chǎng)景

對(duì)于查詢(xún)結(jié)構(gòu)需要返回的簡(jiǎn)單pojo,結(jié)果都可以映射到一致的hashMap上,換句話來(lái)說(shuō)就是數(shù)據(jù)庫(kù)列名可以精確匹配到pojo屬性的。一般都用resultType。其實(shí)這里有一個(gè)隱含的構(gòu)建機(jī)制。映射到resultType的結(jié)果都是MyBatis在幕后自動(dòng)創(chuàng)建了一個(gè)resultMap來(lái)處理的。簡(jiǎn)而言之,只要resultType能干的事情resultMap都能干。二者定位是:

  • resultType用來(lái)處理非常簡(jiǎn)單的結(jié)果集,就是列名能夠與pojo屬性匹配的的結(jié)果集。如果你只需要查詢(xún)一個(gè)班級(jí)的簡(jiǎn)單情況,那么用這個(gè)再合適不過(guò)了。

 @Data
 public class Grade{
   private String gradeId
   private String gradeName;
   private Integer studentCount;
 }

我們很簡(jiǎn)單就可以使用下列操作:

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

當(dāng)然你也可以如上述所說(shuō)使用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轉(zhuǎn)換為resultMap即可,請(qǐng)注意我上面兩種需要處理字段的駝峰風(fēng)格,當(dāng)然你可以設(shè)置Mybatis是否使用駝峰來(lái)進(jìn)行規(guī)避。

  • resultMap更擅長(zhǎng)來(lái)處理復(fù)雜映射的結(jié)果集。比如一對(duì)一、一對(duì)多的復(fù)雜關(guān)系。如果你不但要查詢(xún)一個(gè)班級(jí)的情況,附帶需要查詢(xún)班級(jí)所在的學(xué)校,班級(jí)學(xué)生的詳細(xì)情況,甚至是班級(jí)男女學(xué)生概況。就必須使用resultMap來(lái)描述這些映射關(guān)系了。這個(gè)例子我們來(lái)寫(xiě)一下:

我們定義一個(gè)對(duì)上面關(guān)系描述的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;
    
 }

對(duì)應(yīng)的映射處理:

<resultmap id="ComplexResultMap" type="GradeDTO">
       <!--   班級(jí)情況   -->
      <id property="gradeId" column="grade_id" />
      <result property="gradeName" column="grade_name" />
      <result property="studentCount" column="student_count" />
       <!--   班級(jí)對(duì)應(yīng)的學(xué)校   -->
      <association property="school" javatype="School">
          <id property="schoolId" column="school_id" />
          <result property="schoolName" column="school_name" />
      </association>
       <!--   班級(jí)的老師們   -->
      <collection property="teachers" oftype="Teacher">
          <id property="teacherId" column="teacher_id" />
          <result property="teacherName" column="teacher_name" />
      </collection>
      <!--   根據(jù)性別來(lái)區(qū)分男女學(xué)生  注意這里的語(yǔ)法未經(jīng)過(guò)驗(yàn)證 有興趣可找文檔學(xué)習(xí)   -->
      <discriminator javatype="int" column="gender">
          <case value="0" resultType="GirlStudent" />
          <case value="1" resultType="BoyStudent" />
      </discriminator>
  </resultmap>

當(dāng)然resultMap還可以像java類(lèi)一樣繼承??傊灰阆?,這玩意兒你可以玩出花來(lái)。但是注意性能問(wèn)題,盡量不要過(guò)多的嵌套。盡量配置延遲加載lazyLoadingEnabled以達(dá)到按需加載。

3.總結(jié)

本文主要通過(guò)簡(jiǎn)單分析resultTyperesultMap的相同點(diǎn)與不同點(diǎn)來(lái)闡明它們各自的使用場(chǎng)景。更多詳盡的使用方法可以去Mybatis的官方文檔查看。希望通過(guò)本文的講解讓你在實(shí)際開(kāi)發(fā)工作中不再困惑更加明了。

“Mybatis中resultType與resultMap之間的關(guān)系和使用場(chǎng)景”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

網(wǎng)站題目:Mybatis中resultType與resultMap之間的關(guān)系和使用場(chǎng)景
分享網(wǎng)址:http://bm7419.com/article38/geissp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供用戶(hù)體驗(yàn)企業(yè)網(wǎng)站制作、網(wǎng)站改版、Google、域名注冊(cè)、ChatGPT

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

手機(jī)網(wǎng)站建設(shè)