您好,登錄后才能下訂單哦!
這篇文章主要講解了“如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題”吧!
今天很偶然的因為一次粗心而發(fā)現(xiàn)的一個mybatis問題,這里就寫出來與大家分享一下。
DAO層定義了一個接口,返回String集合,用于獲取最熱門的搜索信息。
mapper.xml文件接口返回的類型卻是search對象。
調(diào)用接口,返回的是search對象集合,沒有報錯,泛型沒起到作用。
仔細(xì)一想,泛型是在編譯階段將我們的返回值類型匹配到一具體類型,而DAO層的接口卻沒有具體的返回值信息,所以在編譯階段它是可以通過的,這也就是說我們在DAO層定義的接口返回值泛型是不起作用的,具體的類型還是得依靠mapper.xml文件中定義的返回值類型為準(zhǔn)。
我特地實驗了一番。mapper.xml查詢實際返回的是Person對象,而我使用的Animal對象集合去接收,并對集合進(jìn)行了遍歷操作
最后報了ClassCastException,所以得出結(jié)論,DAO層接口定義的返回值泛型是沒有用的,實際返回需要根據(jù)具體的mapper.xml文件對應(yīng)的方法返回值來確定。
但是我們卻可以根據(jù)泛型類型來進(jìn)行數(shù)據(jù)的操作,這也不算是bug,只是泛型和mybatis沒有很好的融合吧,個人理解。
mybatis的DAO層接口與mapper.xml文件的對應(yīng)是通過代理類來實現(xiàn)的,有兩種方式,一種是通過namespace來對應(yīng),一種是放在同一路徑下,但是要確保接口文件和xml文件名字相同。
對應(yīng)的分類為
1、resultMap
2、resultType
1、resultMap
:結(jié)果集
2、resultType
:int,string ,long ,class
在MyBatis進(jìn)行查詢映射時,其實查詢出來的每一個屬性都是放在一個對應(yīng)的Map里面的,其中鍵是屬性名,值則是其對應(yīng)的值。
1、當(dāng)提供的返回類型屬性是resultType時,MyBatis會將Map里面的鍵值對取出賦給resultType所指定的對象對應(yīng)的屬性。所以其實MyBatis的每一個查詢映射的返回類型都是ResultMap,只是當(dāng)提供的返回類型屬性是resultType的時候,MyBatis對自動的給把對應(yīng)的值賦給resultType所指定對象的屬性。
2、當(dāng)提供的返回類型是resultMap時,因為Map不能很好表示領(lǐng)域模型,就需要自己再進(jìn)一步的把它轉(zhuǎn)化為對應(yīng)的對象,這常常在復(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é)果對應(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>
感謝各位的閱讀,以上就是“如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對如何解決MyBatis在DAO層定義接口返回類型泛型無效的問題這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。