MyBatis常见报错问题记录汇总(例:org. apache. ibatis.binding.BindingException_ Invalid bound statement (not found

2022-11-28 18:44:17 浏览数 (1)

文章目录
  • dao接口与mapper配置文件在做映射绑定的时候出现问题
  • BaseResultMap 重复定义
  • jdbcType 写错了
  • 结果集 ID 写错了
  • 找不到类中的set属性

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对应情况:

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

如果没有说明对应的.xml文件没有被扫描到,这时候我们需要检查配置文件mybatis-plus.mapper-locations的配置是否配置了正确的mapper.xml文件路径。我遇到需要加载多个其他包里面的mapper.xml配置文件的情况,需要把mybatis-plus.mapper-locations按照如下配置:

代码语言:javascript复制
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属性报错处理类似。

本文内容到此结束了, 如有收获欢迎点赞

0 人点赞