MyBatis常见报错问题记录汇总(例:org. apache. ibatis.binding.BindingException
dao接口与mapper配置文件在做映射绑定的时候出现问题
最常见的报错就是这个了:
org. apache. ibatis.binding.BindingException: Invalid bound statement (not found): 找不到绑定的statement。
简单说,就是接口与xml要么是找不到,要么是找到了却匹配不到对应的方法id。
请按照如下步骤检查:
- 在
xxxMapper.java
文件上是否使用了注解@Mapper - 在启动类上是否添加了扫描了Mapper接口集的注解:
@MapperScan("com.zjq.**.mappers")
【注意扫描的包名是否正确】 - 注意
xxxMapper.xml
文件中的namespace是否正确指向到Mapper.java类的位置,例:<mapper namespace="com.zjq.xxxMapper">
- 注意被调用的方法名在xxxMapper.java中的方法和xxxMapper.xml中的id保持一致。
- 注意mapper.xml方法的parameterType尽量指定全路径的类名。
- 注意
xxxMapper.java
在被调用的地方需要注入@Autowired。
如果有使用mybatis-plus,且安装了MyBatisX
插件,比较直观的看到xxxMapper.java中的方法和xxxMapper.xml中的id对应情况:
如果上述检查昨晚还是没有找到问题的点,这时候我们就需要检查对应的代码编译后的结果里面是否有对应的xxxMapper.xml文件了。
如果没有说明对应的.xml文件没有被扫描到,这时候我们需要检查配置文件mybatis-plus.mapper-locations
的配置是否配置了正确的mapper.xml文件路径。我遇到需要加载多个其他包里面的mapper.xml配置文件的情况,需要把mybatis-plus.mapper-locations按照如下配置:
mybatis-plus:
mapper-locations: classpath*:mapper/*.xml
如果classpath不加*,那么只会加载第一个包中的mapper.xml。
BaseResultMap 重复定义
因为 mybatis 的代码生成插件,xml 文件是追加,如果你执行了两次生成的话,表的映射 xml 里的代码会生成两遍,会报如下错误:
Error parsing Mapper XML. Cause: java.lang.IllegalArgumentException: Result Maps collection already contains value for com.zjq.xxxMapper.BaseResultMap
jdbcType 写错了
会报如下错误:
Cause: org.apache.ibatis.builder.BuilderException: Error resolving JdbcType. Cause: java.lang.IllegalArgumentException: No enum constant org.apache.ibatis.type.JdbcType.xxxxx
解决方法:
- 检查 resultMap 节点中的 jdbcType 属性是否写错了,例如:jdbcType=“DECIMAL”
- 检查取值表达式中的 jdbcType 属性是否写错了,例如:#{cast,jdbcType=DECIMAL}
结果集 ID 写错了
结果集id写错会报如下错误:
org.apache.ibatis.builder.IncompleteElementException: Could not find result map com.zjq.xxxMapper.BaseResultMap
解决方法:
检查对应 resultMap 是否能找对应的实体。
找不到类中的set属性
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Could not set property ‘userName’ of ‘class com.zjq.xxx’ with value ‘10086’ Cause: org.apache.ibatis.reflection.ReflectionException: There is no setter for property named ‘userName’ in ‘class com.zjq.xxx’
解决方法:
检查 resultMap 节点中或者 result 节点中的 property 属性名是否跟实体的属性是否对应。PS:找不到get属性报错处理类似。
本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位大佬指出。
保持热爱,奔赴下一场山海。🏃🏃🏃
- 点赞
- 收藏
- 关注作者
评论(0)