MyBatis在DAO层定义接口返回类型泛型无效的解决

这篇文章主要介绍了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>  

以上为个人经验,希望能给大家一个参考,也希望大家多多支持趣讯吧。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 55@qq.com 举报,一经查实,本站将立刻删除。转转请注明出处:https://www.szhjjp.com/n/8665.html

(0)
nan
上一篇 2021-07-30
下一篇 2021-07-30

相关推荐

  • 2021年最新公务员法(国家公务员管理条例)

    编者按:为深入贯彻新修订后的《公务员法》,中组部相继印发了《公务员职务与职级并行规定》《公务员培训规定》《公务员平时考核办法(试行)》等配套法规,公开发布了《公务员考核规定》《公务员奖励规定》《公务员回避规定》《公务员辞去公职规定》《公务员

    2021-12-14
    0
  • 乔布斯指定库克(乔布斯为什么选择库克)

    如果说4月21日的AirTag只是开胃菜。6月8日带来的iOS也让人小小的惊讶了一下。如果说9月15日加量不加价的iPhone13让大家的钱包回血了一次。那么。10月19日凌晨上线的AirPods3…

    2021-12-01 随笔
    0
  • oppo无线充电手机有哪几款(无线充电手机大全)

    众所周知智能手机的竞争是相当激烈的,特别是下半年的这个时候,iPhone13系列席卷了整个高端市场,成为不少人考虑旗舰机的唯一选择,那么安卓阵营这边没有新机发布怎么办呢,只能在已有的产品中降价来提高自身竞争力,今天我们就来聊聊一款降至新低价的安卓旗舰

    2021-10-18 用户投稿
    0
  • 淘宝对比拼多多哪个信誉好(拼多多和淘宝哪个好)

    1.拼多多和淘宝哪个更好用?购物体验:在我看来,淘宝用起来更舒服:原因一、拼多多抽奖返现的弹屏太多了,界面眼花缭乱,视觉疲劳;原因二、拼多多是拼团形式,没有购物车,拼一次付一次款,麻烦;原因三、拼多多…

    2022-02-17
    0
  • 社会保障卡每月交费(社会保障卡每月多少钱)

    大家是不是都有保障卡呢,现在社会保障卡可以说对人们起着重大的作用。那么你知道社会保障卡,有什么作用吗?大家是不是都有保障卡呢,现在社会保障卡可以说对人们起着重大的作用。那么你知道社会保障卡有什么用途吗?提到社会保障卡有什么用途,我们首先

    2021-12-13
    0
  • 一斤等于多少两(一克是多少克)

    秦统一之后统一度量衡,秦“半两钱”成为中国最早在全国通行的统一青铜货币;至汉武帝元狩五年(公元前118年)改铸“五铢钱”,开创了“五铢钱”长达739年铸行历史,从秦“半两”到武帝“五铢”,成为中国古代“铢两制”铸币的主流。“秦半两”的“两”,“汉五铢…

    2022-01-15 随笔
    0

发表回复

登录后才能评论