中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題

發布時間:2021-07-30 18:16:21 來源:億速云 閱讀:339 作者:chen 欄目:開發技術

這篇文章主要講解了“如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題”吧!

MyBatis DAO層定義接口返回類型泛型無效

今天很偶然的因為一次粗心而發現的一個mybatis問題,這里就寫出來與大家分享一下。

如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題

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

如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題

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

如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題

調用接口,返回的是search對象集合,沒有報錯,泛型沒起到作用。

仔細一想,泛型是在編譯階段將我們的返回值類型匹配到一具體類型,而DAO層的接口卻沒有具體的返回值信息,所以在編譯階段它是可以通過的,這也就是說我們在DAO層定義的接口返回值泛型是不起作用的,具體的類型還是得依靠mapper.xml文件中定義的返回值類型為準。

那如果我們定義了泛型,并根據泛型來操作數據是不是會報錯呢?

我特地實驗了一番。mapper.xml查詢實際返回的是Person對象,而我使用的Animal對象集合去接收,并對集合進行了遍歷操作

如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題

如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題

如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題

如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題

最后報了ClassCastException,所以得出結論,DAO層接口定義的返回值泛型是沒有用的,實際返回需要根據具體的mapper.xml文件對應的方法返回值來確定。

但是我們卻可以根據泛型類型來進行數據的操作,這也不算是bug,只是泛型和mybatis沒有很好的融合吧,個人理解。

注意:

mybatis的DAO層接口與mapper.xml文件的對應是通過代理類來實現的,有兩種方式,一種是通過namespace來對應,一種是放在同一路徑下,但是要確保接口文件和xml文件名字相同。

MyBatis返回類型

分類及返回值類型

對應的分類為

1、resultMap

2、resultType

對應返回值類型

1、resultMap:結果集

2、resultType:int,string ,long ,class

要點

在MyBatis進行查詢映射時,其實查詢出來的每一個屬性都是放在一個對應的Map里面的,其中鍵是屬性名,值則是其對應的值。

1、當提供的返回類型屬性是resultType時,MyBatis會將Map里面的鍵值對取出賦給resultType所指定的對象對應的屬性。所以其實MyBatis的每一個查詢映射的返回類型都是ResultMap,只是當提供的返回類型屬性是resultType的時候,MyBatis對自動的給把對應的值賦給resultType所指定對象的屬性。

2、當提供的返回類型是resultMap時,因為Map不能很好表示領域模型,就需要自己再進一步的把它轉化為對應的對象,這常常在復雜查詢中很有作用。

示例

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案例:查詢結果對應類中的屬性值

<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>

感謝各位的閱讀,以上就是“如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題”的內容了,經過本文的學習后,相信大家對如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

正蓝旗| 乌苏市| 四川省| 临高县| 永春县| 奉新县| 泰宁县| 建宁县| 萝北县| 巴彦淖尔市| 察雅县| 陆良县| 谷城县| 丰城市| 慈溪市| 屏边| 巫溪县| 安国市| 咸宁市| 大安市| 观塘区| 承德市| 利津县| 邵阳市| 富源县| 宣汉县| 昌宁县| 通江县| 南宁市| 宝丰县| 东阳市| 平阳县| 固阳县| 鲜城| 吴忠市| 屯留县| 贵德县| 聂拉木县| 武山县| 宣恩县| 姜堰市|