最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MyBatis在DAO層定義接口返回類(lèi)型泛型無(wú)效的解決

 更新時(shí)間:2021年07月30日 15:44:32   作者:程序員阿坤  
這篇文章主要介紹了MyBatis在DAO層定義接口返回類(lèi)型泛型無(wú)效的解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

MyBatis DAO層定義接口返回類(lèi)型泛型無(wú)效

今天很偶然的因?yàn)橐淮未中亩l(fā)現(xiàn)的一個(gè)mybatis問(wèn)題,這里就寫(xiě)出來(lái)與大家分享一下。

DAO層定義了一個(gè)接口,返回String集合,用于獲取最熱門(mén)的搜索信息。

mapper.xml文件接口返回的類(lèi)型卻是search對(duì)象。

調(diào)用接口,返回的是search對(duì)象集合,沒(méi)有報(bào)錯(cuò),泛型沒(méi)起到作用。

仔細(xì)一想,泛型是在編譯階段將我們的返回值類(lèi)型匹配到一具體類(lèi)型,而DAO層的接口卻沒(méi)有具體的返回值信息,所以在編譯階段它是可以通過(guò)的,這也就是說(shuō)我們?cè)贒AO層定義的接口返回值泛型是不起作用的,具體的類(lèi)型還是得依靠mapper.xml文件中定義的返回值類(lèi)型為準(zhǔn)。

那如果我們定義了泛型,并根據(jù)泛型來(lái)操作數(shù)據(jù)是不是會(huì)報(bào)錯(cuò)呢?

我特地實(shí)驗(yàn)了一番。mapper.xml查詢(xún)實(shí)際返回的是Person對(duì)象,而我使用的Animal對(duì)象集合去接收,并對(duì)集合進(jìn)行了遍歷操作

最后報(bào)了ClassCastException,所以得出結(jié)論,DAO層接口定義的返回值泛型是沒(méi)有用的,實(shí)際返回需要根據(jù)具體的mapper.xml文件對(duì)應(yīng)的方法返回值來(lái)確定。

但是我們卻可以根據(jù)泛型類(lèi)型來(lái)進(jìn)行數(shù)據(jù)的操作,這也不算是bug,只是泛型和mybatis沒(méi)有很好的融合吧,個(gè)人理解。

注意:

mybatis的DAO層接口與mapper.xml文件的對(duì)應(yīng)是通過(guò)代理類(lèi)來(lái)實(shí)現(xiàn)的,有兩種方式,一種是通過(guò)namespace來(lái)對(duì)應(yīng),一種是放在同一路徑下,但是要確保接口文件和xml文件名字相同。

MyBatis返回類(lèi)型

分類(lèi)及返回值類(lèi)型

對(duì)應(yīng)的分類(lèi)為

1、resultMap

2、resultType

對(duì)應(yīng)返回值類(lèi)型

1、resultMap:結(jié)果集

2、resultType:int,string ,long ,class

要點(diǎn)

在MyBatis進(jìn)行查詢(xún)映射時(shí),其實(shí)查詢(xún)出來(lái)的每一個(gè)屬性都是放在一個(gè)對(duì)應(yīng)的Map里面的,其中鍵是屬性名,值則是其對(duì)應(yīng)的值。

1、當(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對(duì)自動(dòng)的給把對(duì)應(yīng)的值賦給resultType所指定對(duì)象的屬性。

2、當(dāng)提供的返回類(lèi)型是resultMap時(shí),因?yàn)镸ap不能很好表示領(lǐng)域模型,就需要自己再進(jìn)一步的把它轉(zhuǎn)化為對(duì)應(yīng)的對(duì)象,這常常在復(fù)雜查詢(xún)中很有作用。

示例

resultMap案例

<select id="selectByPrimaryKey" resultMap="BaseResultMap" parameterType="java.lang.Long" > 
    select   
    <include refid="Base_Column_List" />  
    from common_car_make  
    where id = #{id,jdbcType=BIGINT}  
</select>  

resultType--long案例

<select id="queryCarTypeByModelIdCount" resultType="java.lang.Long" parameterType="java.util.Map">  
     select count(*)  from common_car_type cm  
     where 1=1  
     <if test="carModelId != null">  
         and  cm.car_model_id = #{carModelId,jdbcType=DECIMAL}  
     </if>  
</select>  

resultType--int案例

<select id="queryCategoryBrandCount" resultType="java.lang.Integer" parameterType="java.util.HashMap" >  
      select count(1)  
      from common_category_brand  
      where 1=1  
      <if test="categoryId != null" >  
          and category_id = #{categoryId,jdbcType=BIGINT}  
      </if>  
      <if test="brandId != null" >  
          and brand_id = #{brandId,jdbcType=BIGINT}  
      </if>  
</select>  

resultType--class案例:查詢(xún)結(jié)果對(duì)應(yīng)類(lèi)中的屬性值

<select id="selectCommonBrand" resultType="com.epeit.api.model.CommonBrandPo" parameterType="java.lang.Long" >  
    select id, brand_name brandName, brand_type brandType, icon, delete_flag deleteFlag  
    from common_brand  
    where id = #{id,jdbcType=BIGINT}  
</select>  

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 在java中 利用匿名內(nèi)部類(lèi)進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法

    在java中 利用匿名內(nèi)部類(lèi)進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法

    本篇文章小編將為大家介紹,關(guān)于在java中 利用匿名內(nèi)部類(lèi)進(jìn)行較簡(jiǎn)潔的雙括弧初始化的方法,有需要的朋友可以參考一下
    2013-04-04
  • 基于springboot創(chuàng)建mybatis的完整步驟

    基于springboot創(chuàng)建mybatis的完整步驟

    MyBatis是一款優(yōu)秀的數(shù)據(jù)庫(kù)持久層框架,相比Hibernate我更喜歡使用MyBatis,看的到SQL還是讓人更安心點(diǎn),這篇文章主要給大家介紹了關(guān)于基于springboot創(chuàng)建mybatis的完整步驟,需要的朋友可以參考下
    2024-03-03
  • 將Maven鏡像源更改為阿里鏡像的操作步驟

    將Maven鏡像源更改為阿里鏡像的操作步驟

    在軟件開(kāi)發(fā)中,Maven是一個(gè)流行的項(xiàng)目管理工具,它允許你從Maven中央倉(cāng)庫(kù)下載所需的依賴(lài)包,然而,由于地理位置或網(wǎng)絡(luò)狀況的差異,從默認(rèn)的Maven中央倉(cāng)庫(kù)下載依賴(lài)包的速度可能會(huì)較慢,所
    2025-01-01
  • Java實(shí)現(xiàn)多層文件夾壓縮功能

    Java實(shí)現(xiàn)多層文件夾壓縮功能

    這篇文章主要為大家詳細(xì)介紹了如何利用Java語(yǔ)言進(jìn)行多層文件夾壓縮功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2022-08-08
  • java堆棧跟蹤工具jstack的使用教程

    java堆棧跟蹤工具jstack的使用教程

    jstack(stack?trace?for?java)是java虛擬機(jī)自帶的一種堆棧跟蹤工具,主要用于生成java虛擬機(jī)當(dāng)前時(shí)刻的線程快照,下面我們就來(lái)學(xué)習(xí)一下它的具體使用吧
    2023-11-11
  • Mybatis執(zhí)行SQL命令的流程分析

    Mybatis執(zhí)行SQL命令的流程分析

    這篇文章主要介紹了Mybatis執(zhí)行SQL命令的流程分析,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-04-04
  • Java字符串相關(guān)類(lèi)StringBuffer的用法詳解

    Java字符串相關(guān)類(lèi)StringBuffer的用法詳解

    java.lang包下的StringBuffer類(lèi),代表著可變的字符序列,可以用來(lái)對(duì)字符串內(nèi)容進(jìn)行增刪改操作。本文將通過(guò)示例詳細(xì)說(shuō)說(shuō)它的用法,感興趣的可以跟隨小編一起學(xué)習(xí)一下
    2022-10-10
  • SpringBoot中使用@Async實(shí)現(xiàn)異步任務(wù)調(diào)用詳解

    SpringBoot中使用@Async實(shí)現(xiàn)異步任務(wù)調(diào)用詳解

    這篇文章主要介紹了SpringBoot中使用@Async實(shí)現(xiàn)異步任務(wù)調(diào)用詳解,一個(gè)可以無(wú)需等待被調(diào)用函數(shù)的返回值就讓操作繼續(xù)進(jìn)行的方法(來(lái)自百度百科),即程序在順序執(zhí)行時(shí),不等待異步調(diào)用的語(yǔ)句返回結(jié)果就執(zhí)行后面的程序,需要的朋友可以參考下
    2023-12-12
  • 淺談在springboot中使用定時(shí)任務(wù)的方式

    淺談在springboot中使用定時(shí)任務(wù)的方式

    今天給大家?guī)?lái)的是關(guān)于Java的相關(guān)知識(shí),文章圍繞著在springboot中使用定時(shí)任務(wù)的方式展開(kāi),文中有非常詳細(xì)的介紹及代碼示例,需要的朋友可以參考下
    2021-06-06
  • Struts2學(xué)習(xí)手冊(cè)之文件上傳基礎(chǔ)教程

    Struts2學(xué)習(xí)手冊(cè)之文件上傳基礎(chǔ)教程

    Struts2提供的文件上傳下載機(jī)制十分簡(jiǎn)便,使得我們寫(xiě)很少的代碼,下面這篇文章主要給大家介紹了關(guān)于Struts2學(xué)習(xí)手冊(cè)之文件上傳的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-05-05

最新評(píng)論

小金县| 惠州市| 昭通市| 顺昌县| 祥云县| 嘉义县| 鄂伦春自治旗| 白沙| 大同市| 彰武县| 紫云| 阿瓦提县| 肇庆市| 明光市| 梅河口市| 南陵县| 武宁县| 蓬莱市| 惠来县| 怀宁县| 赤城县| 措勤县| 莎车县| 富宁县| 吴川市| 铜山县| 庆阳市| 新津县| 安吉县| 鄂托克旗| 普格县| 漳浦县| 秀山| 昆明市| 宁都县| 阿坝| 永修县| 察隅县| 扎鲁特旗| 资阳市| 唐海县|