欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

MyBatis標(biāo)簽之Select?resultType和resultMap詳解

 更新時(shí)間:2022年09月20日 10:06:19   作者:樓蘭胡楊  
這篇文章主要介紹了MyBatis標(biāo)簽之Select?resultType和resultMap,在MyBatis中有一個(gè)ResultMap標(biāo)簽,它是為了映射select標(biāo)簽查詢(xún)出來(lái)的結(jié)果集,下面使用一個(gè)簡(jiǎn)單的例子,來(lái)介紹 resultMap 的使用方法,需要的朋友可以參考下

摘要:介紹MyBatis 中Select標(biāo)簽的兩個(gè)屬性resultType和resultMap及其區(qū)別。

MyBatis常用動(dòng)態(tài)標(biāo)簽大全見(jiàn)上述URL,它們大概分為如下四類(lèi):

標(biāo)簽作用使用場(chǎng)景
foreach循環(huán)語(yǔ)句批量添加或者批量查詢(xún)
if條件判斷語(yǔ)句單條件分支判斷
choose、when、otherwise類(lèi)似 Java 中的 switch、case、default 語(yǔ)句多條件分支判斷
trim、where、set輔助標(biāo)簽用于處理一些條件查詢(xún)

在MyBatis中有一個(gè)ResultMap標(biāo)簽,它是為了映射select標(biāo)簽查詢(xún)出來(lái)的結(jié)果集,其主要作用是將實(shí)體類(lèi)中的字段與數(shù)據(jù)庫(kù)表中的字段進(jìn)行關(guān)聯(lián)映射。

前言

Mybatis 中 select 標(biāo)簽有兩個(gè)屬性 resultType 和 resultMap,用于在mapper.xml文件中配置返回結(jié)果類(lèi)型,工作中經(jīng)常使用到它們。那么在日常開(kāi)發(fā)中,應(yīng)該如何正確的選擇呢?下面我們對(duì)這兩個(gè)屬性分別進(jìn)行講解和演示。

結(jié)果類(lèi)型resultType

resultType直譯就是結(jié)果的類(lèi)型,可以設(shè)置為期望從select 語(yǔ)句中返回結(jié)果的類(lèi)的全限定名或別名。resultType使用場(chǎng)景如下:

如果查詢(xún)結(jié)果只是返回一個(gè)值,比如返回String、map或int,那么可以使用resultType指定簡(jiǎn)單類(lèi)型作為輸出結(jié)果。

我們先了解一個(gè)resultType的簡(jiǎn)單映射語(yǔ)句示例,它沒(méi)有顯式地指定 resultMap。比如:

<sql id="resultTypeColumn">
    id, username, hashedPassword
</sql>
<select id="selectUsers" resultType="map">
  select 
  	<include refid="resultTypeColumn"/>
  from some_table
  where id = #{id}
</select>

上述語(yǔ)句只是簡(jiǎn)單地將所有的列映射到 HashMap 的鍵上,這由 resultType 屬性指定。此處對(duì)查詢(xún)字段用了一個(gè) sql 標(biāo)簽進(jìn)行封裝,該sql 片段可復(fù)用。

還有一種情況就是如果數(shù)據(jù)庫(kù)表的字段名和實(shí)體bean對(duì)象的屬性名一樣。 雖然在大部分情況下都?jí)蛴茫?HashMap 并不是一個(gè)很好的領(lǐng)域模型;你的程序更可能會(huì)使用 JavaBean 或 POJO(普通老式 Java 對(duì)象)作為領(lǐng)域模型,MyBatis 對(duì)兩者都提供了支持??纯聪旅孢@個(gè) JavaBean:

package com.someapp.model;
public class User {
  private int id;
  private String username;
  private String hashedPassword;

 // omit getter,setter and toString
}

基于 JavaBean 的規(guī)范,上面這個(gè)類(lèi)有 3 個(gè)屬性:id,username 和 hashedPassword,它們會(huì)對(duì)應(yīng)到 select 語(yǔ)句中的列名。這樣的一個(gè) JavaBean 可以被映射到 ResultSet,就像映射到 HashMap 一樣簡(jiǎn)單。

<select id="selectUsers" resultType="com.someapp.model.User">
  select 
  <include refid="resultTypeColumn"/>
  from some_table
  where id = #{id}
</select>

類(lèi)型別名是你的好幫手,關(guān)于如何設(shè)置類(lèi)型別名,請(qǐng)移步《Spring Boot MyBatis使用type-aliases-package自定義類(lèi)別名》。使用別名后就可以不用輸入類(lèi)的全限定名了。譬如:

<select id="selectUsers" resultType="User">
  select 
  <include refid="resultTypeColumn"/>
  from some_table
  where id = #{id}
</select>

在此情況下,MyBatis 會(huì)在幕后自動(dòng)創(chuàng)建一個(gè) resultMap,再根據(jù)屬性名來(lái)映射列到 JavaBean 的屬性上。如果列名和屬性名不能匹配上,可以在 SELECT 語(yǔ)句中設(shè)置列別名(這是一個(gè)基本的 SQL 特性)來(lái)完成匹配。例如:

<sql id="resultTypeColumn">
    user_id             as "id",
    user_name           as "userName",
    hashed_password     as "hashedPassword"
</sql>
<select id="selectUsers" resultType="map">
  select 
  	<include refid="resultTypeColumn"/>
  from some_table
  where id = #{id}
</select>

注意,如果返回的是集合,那應(yīng)該設(shè)置為集合包含的類(lèi)型,而不是集合本身的類(lèi)型。

結(jié)果映射resultMap

resultMap 直譯就是結(jié)果映射,該元素是 MyBatis 中最重要最強(qiáng)大的元素。與 resultType 相比,resultMap就要強(qiáng)大許多,它不僅能夠用于簡(jiǎn)單查詢(xún),還能用于級(jí)聯(lián)查詢(xún)以及設(shè)置緩存,功能可謂是十分的強(qiáng)大。它可以讓你從 90% 的 JDBC ResultSets 數(shù)據(jù)提取代碼中解放出來(lái),并在一些情形下允許你進(jìn)行一些 JDBC 不支持的操作。實(shí)際上,在為一些比如連接的復(fù)雜語(yǔ)句編寫(xiě)映射代碼的時(shí)候,一份 resultMap 能夠代替實(shí)現(xiàn)同等功能的數(shù)千行代碼。ResultMap 的設(shè)計(jì)思想是,對(duì)簡(jiǎn)單的語(yǔ)句做到零配置,對(duì)于復(fù)雜一點(diǎn)的語(yǔ)句,只需要描述語(yǔ)句之間的關(guān)系就行了。溫馨提示:resultType 和 resultMap 之間只能同時(shí)使用一個(gè)。

resultMap標(biāo)簽屬性

resultMap 標(biāo)簽的屬性值包括兩個(gè):

  • id 屬性:唯一標(biāo)識(shí),此 id 值用于 select 標(biāo)簽 resultMap 屬性的引用。
  • type 屬性:表示該 resultMap 的映射結(jié)果類(lèi)型,可以為類(lèi)的全限定名或者別名。

resultMap子標(biāo)簽包括如下幾個(gè) :

子標(biāo)簽功能備注
id指定查詢(xún)列中的唯一標(biāo)識(shí),如果有多個(gè)列組成唯一標(biāo)識(shí),配置多個(gè)id可以不用
result用于標(biāo)識(shí)一些簡(jiǎn)單屬性,包括column和property兩個(gè)屬性常用
association在主表的pojo中嵌套另一個(gè)表的pojo不推薦使用
collection把查詢(xún)到的多條記錄映射到集合對(duì)象不推薦使用

result標(biāo)簽的屬性包括兩個(gè):

  • column:數(shù)據(jù)庫(kù)字段名或別名。
  • property:實(shí)體類(lèi)中的屬性,和column屬性一一對(duì)應(yīng)。

resultMap使用示例

下面使用一個(gè)簡(jiǎn)單的例子,來(lái)介紹 resultMap 的使用方法。雖然上一節(jié)中的例子不用顯式配置 resultMap,但為了講解,我們來(lái)看看如果顯式使用外部的 resultMap 會(huì)怎樣;這也是解決列名和bean名不匹配的另外一種方式。定義一個(gè)resultMap:

<resultMap id="userResultMap" type="User">
  <id property="id" column="user_id" />
  <result property="username" column="user_name"/>
  <result property="password" column="hashed_password"/>
</resultMap>

然后在引用它的語(yǔ)句中設(shè)置 resultMap 屬性就行了(注意我們?nèi)サ袅?resultType 屬性)。比如:

<select id="selectUsers" resultMap="userResultMap">
  select user_id, user_name, hashed_password
  from some_table
  where id = #{id}
</select>

resultType和resultMap的區(qū)別

下面了解一下MyBatis中數(shù)據(jù)轉(zhuǎn)換機(jī)制:在進(jìn)行查詢(xún)映射的時(shí)候,其實(shí)查詢(xún)出來(lái)的每一個(gè)屬性都是放在一個(gè)對(duì)應(yīng)的Map里面,其中鍵是屬性名,值則是其對(duì)應(yīng)的值。當(dāng)提供的返回類(lèi)型屬性是resultType的時(shí)候,MyBatis會(huì)將Map里面的鍵值對(duì)取出賦給resultType所指定的對(duì)象對(duì)應(yīng)的屬性。所以,其實(shí)MyBatis的每一個(gè)查詢(xún)映射的返回類(lèi)型都是ResultMap,只是當(dāng)我們提供的返回類(lèi)型屬性是resultType的時(shí)候,MyBatis自動(dòng)的把對(duì)應(yīng)的值賦給resultType所指定對(duì)象的屬性,而當(dāng)提供的返回類(lèi)型是resultMap的時(shí)候,因?yàn)镸ap不能很好表示領(lǐng)域模型,我們就需要自己把它轉(zhuǎn)化為對(duì)應(yīng)的對(duì)象,這常常在復(fù)雜查詢(xún)中很有作用。

言歸正傳,resultType和resultMap到底有什么區(qū)別呢?

resultType不需要配置,但是resultMap要配置一下。resultType是直接指定返回類(lèi)型的,而使用resultMap時(shí),需要在外部ResultMap標(biāo)簽中,設(shè)置數(shù)據(jù)庫(kù)表的字段名和實(shí)體bean對(duì)象類(lèi)的屬性的一一對(duì)應(yīng)關(guān)系。設(shè)置后,就算數(shù)據(jù)庫(kù)的字段名和實(shí)體類(lèi)的屬性名不一樣也沒(méi)有關(guān)系,mybatis依然會(huì)給映射出來(lái),所以resultMap要更強(qiáng)大一些。

就像上面說(shuō)的那樣,如果查詢(xún)出來(lái)數(shù)據(jù)庫(kù)字段名(包括字段別名)和要封裝的實(shí)體bean對(duì)象屬性值不相同時(shí),只能使用resultMap來(lái)返回結(jié)果。

還有一個(gè)區(qū)別是resultMap可以用在復(fù)雜聯(lián)合查詢(xún)上,而resultType不可以。關(guān)于這一點(diǎn),大家可以去Mybatis官網(wǎng)了解一下,這里點(diǎn)到為止。

結(jié)束語(yǔ)

至此,大家已經(jīng)了解了resultType和resultMap的基本用法,在日常業(yè)務(wù)開(kāi)發(fā)中已經(jīng)可以游刃有余了。如果想更上一層樓,掌握更多關(guān)于resultMap的高級(jí)用法,請(qǐng)移步Mybatis官網(wǎng)。

當(dāng)你遇到這個(gè)話(huà)題的時(shí)候,你通常怎么理解呢?你碰到過(guò)特別精彩、讓人印象深刻的回答嗎?歡迎大家積極留言交流。

Reference

https://mybatis.org/mybatis-3/zh/sqlmap-xml.html

https://baijiahao.baidu.com/s?id=1696473444790362129&wfr=spider&for=pc

到此這篇關(guān)于MyBatis標(biāo)簽之Select resultType和resultMap的文章就介紹到這了,更多相關(guān)MyBatis Select resultType和resultMap內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java SSM框架如何配置靜態(tài)資源加載

    Java SSM框架如何配置靜態(tài)資源加載

    這篇文章主要介紹了Java SSM框架如何配置靜態(tài)資源加載,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-04-04
  • Java/Web調(diào)用Hadoop進(jìn)行MapReduce示例代碼

    Java/Web調(diào)用Hadoop進(jìn)行MapReduce示例代碼

    本篇文章主要介紹了Java/Web調(diào)用Hadoop進(jìn)行MapReduce示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-11-11
  • SpringBoot整合JWT框架,解決Token跨域驗(yàn)證問(wèn)題

    SpringBoot整合JWT框架,解決Token跨域驗(yàn)證問(wèn)題

    Json web token (JWT), 是為了在網(wǎng)絡(luò)應(yīng)用環(huán)境間傳遞聲明而執(zhí)行的一種基于JSON的開(kāi)放標(biāo)準(zhǔn)((RFC 7519).定義了一種簡(jiǎn)潔的,自包含的方法用于通信雙方之間以JSON對(duì)象的形式安全的傳遞信息。
    2021-06-06
  • Java Math.round(),Math.ceil(),Math.floor()的區(qū)別詳解

    Java Math.round(),Math.ceil(),Math.floor()的區(qū)別詳解

    這篇文章主要介紹了Java Math.round(),Math.ceil(),Math.floor()的區(qū)別詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Idea創(chuàng)建Jsp項(xiàng)目完整版教程

    Idea創(chuàng)建Jsp項(xiàng)目完整版教程

    一直在使用eclipse,對(duì)idea嗤之以鼻,前些日子換成了idea以后覺(jué)得太香了,這篇文章主要給大家介紹了關(guān)于Idea創(chuàng)建Jsp項(xiàng)目的相關(guān)資料,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2024-04-04
  • java遞歸實(shí)現(xiàn)拼裝多個(gè)api的結(jié)果操作方法

    java遞歸實(shí)現(xiàn)拼裝多個(gè)api的結(jié)果操作方法

    本文給大家分享java遞歸實(shí)現(xiàn)拼裝多個(gè)api的結(jié)果的方法,說(shuō)白了就是好幾個(gè)API結(jié)果拼裝成的,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2021-09-09
  • 解決SpringBoot的@DeleteMapping注解的方法不被調(diào)用問(wèn)題

    解決SpringBoot的@DeleteMapping注解的方法不被調(diào)用問(wèn)題

    這篇文章主要介紹了解決SpringBoot的@DeleteMapping注解的方法不被調(diào)用問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-01-01
  • 使用C3P0改造JDBC對(duì)數(shù)據(jù)庫(kù)的連接

    使用C3P0改造JDBC對(duì)數(shù)據(jù)庫(kù)的連接

    這篇文章主要為大家詳細(xì)介紹了使用C3P0改造JDBC對(duì)數(shù)據(jù)庫(kù)的連接,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • Java Spring IOC圖文詳解

    Java Spring IOC圖文詳解

    IoC是一種讓服務(wù)消費(fèi)者不直接依賴(lài)于服務(wù)提供者的組件設(shè)計(jì)方式,是一種減少類(lèi)與類(lèi)之間依賴(lài)的設(shè)計(jì)原則。下面通過(guò)本文給大家分享spring中ioc的概念,感興趣的朋友一起看看吧
    2021-09-09
  • Java中for與foreach的區(qū)別

    Java中for與foreach的區(qū)別

    本文主要介紹了Java中for與foreach的區(qū)別,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05

最新評(píng)論