MyBatis常见报错问题记录汇总(例:org. apache. ibatis.binding.BindingException

举报
共饮一杯无 发表于 2023/01/29 17:30:32 2023/01/29
【摘要】 dao接口与mapper配置文件在做映射绑定的时候出现问题最常见的报错就是这个了:org. apache. ibatis.binding.BindingException: Invalid bound statement (not found): 找不到绑定的statement。简单说,就是接口与xml要么是找不到,要么是找到了却匹配不到对应的方法id。请按照如下步骤检查:在xxxMapp...

dao接口与mapper配置文件在做映射绑定的时候出现问题

最常见的报错就是这个了:
org. apache. ibatis.binding.BindingException: Invalid bound statement (not found): 找不到绑定的statement。
简单说,就是接口与xml要么是找不到,要么是找到了却匹配不到对应的方法id。
请按照如下步骤检查:

  1. xxxMapper.java文件上是否使用了注解@Mapper
  2. 在启动类上是否添加了扫描了Mapper接口集的注解: @MapperScan("com.zjq.**.mappers") 【注意扫描的包名是否正确】
  3. 注意xxxMapper.xml文件中的namespace是否正确指向到Mapper.java类的位置,例:<mapper namespace="com.zjq.xxxMapper">
  4. 注意被调用的方法名在xxxMapper.java中的方法和xxxMapper.xml中的id保持一致。
  5. 注意mapper.xml方法的parameterType尽量指定全路径的类名。
  6. 注意xxxMapper.java在被调用的地方需要注入@Autowired。

如果有使用mybatis-plus,且安装了MyBatisX插件,比较直观的看到xxxMapper.java中的方法和xxxMapper.xml中的id对应情况:
image.png

如果上述检查昨晚还是没有找到问题的点,这时候我们就需要检查对应的代码编译后的结果里面是否有对应的xxxMapper.xml文件了。
image.png

如果没有说明对应的.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

解决方法:

  1. 检查 resultMap 节点中的 jdbcType 属性是否写错了,例如:jdbcType=“DECIMAL”
  2. 检查取值表达式中的 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属性报错处理类似。

本文内容到此结束了,
如有收获欢迎点赞👍收藏💖关注✔️,您的鼓励是我最大的动力。
如有错误❌疑问💬欢迎各位大佬指出。
保持热爱,奔赴下一场山海。🏃🏃🏃

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。