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

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

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

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

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

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

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

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

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

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

我特地實(shí)驗(yàn)了一番。mapper.xml查詢實(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)進(jìn)行數(shù)據(jù)的操作,這也不算是bug,只是泛型和mybatis沒(méi)有很好的融合吧,個(gè)人理解。

注意:

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

MyBatis返回類型

分類及返回值類型

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

1、resultMap

2、resultType

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

1、resultMap:結(jié)果集

2、resultType:int,string ,long ,class

要點(diǎn)

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

1、當(dāng)提供的返回類型屬性是resultType時(shí),MyBatis會(huì)將Map里面的鍵值對(duì)取出賦給resultType所指定的對(duì)象對(duì)應(yīng)的屬性。所以其實(shí)MyBatis的每一個(gè)查詢映射的返回類型都是ResultMap,只是當(dāng)提供的返回類型屬性是resultType的時(shí)候,MyBatis對(duì)自動(dòng)的給把對(duì)應(yīng)的值賦給resultType所指定對(duì)象的屬性。

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

示例

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案例:查詢結(jié)果對(duì)應(yīng)類中的屬性值

<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)文章

  • Java8簡(jiǎn)單了解Lambda表達(dá)式與函數(shù)式接口

    Java8簡(jiǎn)單了解Lambda表達(dá)式與函數(shù)式接口

    這篇文章主要介紹了Java8簡(jiǎn)單了解Lambda表達(dá)式與函數(shù)式接口,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-11-11
  • Java開發(fā)中為什么要使用單例模式詳解

    Java開發(fā)中為什么要使用單例模式詳解

    單例對(duì)于大家來(lái)說(shuō)并不陌生,但是在什么時(shí)候用單例呢?為什么要用呢?本文就帶大家了解一下為什么要使用單例,文中有非常詳細(xì)的介紹,需要的朋友可以參考下
    2021-06-06
  • java實(shí)現(xiàn)簡(jiǎn)單美女拼圖游戲

    java實(shí)現(xiàn)簡(jiǎn)單美女拼圖游戲

    這篇文章主要介紹了java實(shí)現(xiàn)簡(jiǎn)單美女拼圖游戲的相關(guān)資料,需要的朋友可以參考下
    2015-03-03
  • Spring的Xml和JavaConfig 擴(kuò)展哪個(gè)好用

    Spring的Xml和JavaConfig 擴(kuò)展哪個(gè)好用

    今天給大家介紹基于注解的Spring擴(kuò)展,Spring的Xml和JavaConfig 擴(kuò)展的配置方法,關(guān)于Spring的Xml和JavaConfig 擴(kuò)展你會(huì)選哪個(gè)呢,帶著這個(gè)問(wèn)題一起通過(guò)本文學(xué)習(xí)下吧
    2021-05-05
  • Java調(diào)用打印機(jī)的2種方式舉例(無(wú)驅(qū)/有驅(qū))

    Java調(diào)用打印機(jī)的2種方式舉例(無(wú)驅(qū)/有驅(qū))

    我們平時(shí)使用某些軟件或者在超市購(gòu)物的時(shí)候都會(huì)發(fā)現(xiàn)可以使用打印機(jī)進(jìn)行打印,這篇文章主要給大家介紹了關(guān)于Java調(diào)用打印機(jī)的2種方式,分別是無(wú)驅(qū)/有驅(qū)的相關(guān)資料,需要的朋友可以參考下
    2023-11-11
  • SpringBoot?全局線程池配置及應(yīng)用小結(jié)

    SpringBoot?全局線程池配置及應(yīng)用小結(jié)

    為了提高應(yīng)用程序的性能和響應(yīng)速度,線程池是一個(gè)非常重要的工具,本文主要介紹了Spring?Boot?全局線程池配置及應(yīng)用,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-05-05
  • springboot默認(rèn)文件緩存(easy-captcha?驗(yàn)證碼)

    springboot默認(rèn)文件緩存(easy-captcha?驗(yàn)證碼)

    這篇文章主要介紹了springboot的文件緩存(easy-captcha?驗(yàn)證碼),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-06-06
  • spring中FactoryBean中的getObject()方法實(shí)例解析

    spring中FactoryBean中的getObject()方法實(shí)例解析

    這篇文章主要介紹了spring中FactoryBean中的getObject()方法實(shí)例解析,分享了相關(guān)代碼示例,小編覺(jué)得還是挺不錯(cuò)的,具有一定借鑒價(jià)值,需要的朋友可以參考下
    2018-02-02
  • SpringCloud?Nacos服務(wù)分級(jí)存儲(chǔ)模型詳解

    SpringCloud?Nacos服務(wù)分級(jí)存儲(chǔ)模型詳解

    Nacos服務(wù)分級(jí)存儲(chǔ)模型是Nacos存儲(chǔ)服務(wù)注冊(cè)信息和配置信息的核心模型之一,本文將對(duì)?Nacos?服務(wù)分級(jí)存儲(chǔ)模型進(jìn)行深入解析,感興趣的朋友一起看看吧
    2024-02-02
  • Spring事務(wù)&Spring整合MyBatis的兩種方式

    Spring事務(wù)&Spring整合MyBatis的兩種方式

    這篇文章主要介紹了Spring事務(wù)&Spring整合MyBatis的兩種方式,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-02-02

最新評(píng)論