【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
分类:
Java.Mybatis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需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的基本操作