【Mybatis】Mybatis的小坑,xxMapper.java里的返回类型是编译期有效的,而xxMapper.xml的返回类型是运行期有效的,程序能够运作实际依赖的是resultType类型。

有一个EmpMapper.java,里面获取全部数据的fetchAll函数是这样写的:

@Mapper
public interface EmpMapper {
    List<Emp> fetchAll();
}

而对应的Empmapper.xml会是这样:

<mapper namespace="com.hy.dao.EmpMapper">
    <select id="fetchAll" resultType="com.hy.entity.Emp">
        select id,name,profile from emp430_1
    </select>
</mapper>

现在,函数的返回类型和resultType类型一致,运行自然没什么问题,但当函数的返回类型改变了,比如从Emp变成Emp2,而resultType忘记改变时,在编译期是不会出错的,也就是说idea不会报错。

但真正运行起来会出现ClassCastException,即类型转换异常。

由此可以知道,Mybatis以反射方式将resultType指定的类型实例化,塞入列表结构后,实际是以Object形式放进去的,用到的时候会根据函数定义进行强转,当函数的返回类型和resultType类型一致,强转自然没问题;当类型不一致,强转便会导致ClassCastException。

虽然是疏忽导致了错误,但因此窥见了MyBatis的背后运作也算歪打正着。

END

 

posted @   逆火狂飙  阅读(56)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
历史上的今天:
2020-04-30 agumaster 出现实际股票数据
2020-04-30 用Java爬虫爬取凤凰财经提供的沪深A股所有股票代号名称
2020-04-30 agumaster 分页方案
2020-04-30 在MyBatis中采用模糊查询变量的引用标志应当是$而不是#
2018-04-30 【Canvas与艺术】四陀螺结
2015-04-30 使用yum方式在centOS上安装mysql
2014-04-30 JList的基本操作
生当作人杰 死亦为鬼雄 至今思项羽 不肯过江东
点击右上角即可分享
微信分享提示