MyBatis报错记录

记录一下工作中碰到的MyBatis报错。

Invalid bound statement (not found)原因分析

这是个经常见到的报错:

1
org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

原因分析

出现这个问题的原因一般是:

  1. Mapper interface和xml文件的定义对应不上(需要检查包名、namespace)

  2. 函数名称等能否对应不上(需要比较细致的对比,经常就写错了一两个字母搞的很长时间找不到错误)

解决方法

解决的思路一般是:

  1. 检查xml文件所在的package名称是否和interface对应的package名称一一对应

  2. 检查xml文件的namespace是否和xml文件的package名称一一对应

  3. 检查函数名称能否对应上

  4. 去掉xml文件中的中文注释

  5. 检查配置文件中的路径是否正确:

1
2
3
4
mybatis:
config-location: classpath:mybatis/mybatis-config.xml
mapper-locations: classpath*:mybatis/mapper/mysql/**/**.xml
type-aliases-package: com.example.hello

Cannot load connection class because of underlying exception com.mysql.cj.exceptions

部分错误日志

1
2
3
4
5
6
7
8
9
java.sql.SQLNonTransientConnectionException: Cannot load connection class because of underlying exception: com.mysql.cj.exceptions.WrongArgumentException: Malformed database URL, failed to parse the connection string near ';characterEncoding=UTF8&useSSL=true?autoReconnect=true'.
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:79)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:131)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:219)

原因分析

查阅了网上的资料,发现应该是MySQL8.0的驱动更新:

  • 驱动器更新为com.mysql.cj.jdbc.Driver

  • 数据库的URL由低版本的jdbc:mysql://localhost:3306/db_career?autoReconnect=true&useSSL=false&characterEncoding=utf-8修改为:jdbc:mysql://localhost:3306/db_career?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT

java.lang.UnsupportedOperationException

这个问题的原因一般是因为resultType代表的是list中的元素类型,而不是resultType指的集合本身

比如:dao的返回值类型是List<Long>,xml中的resultType="Long",而不是List。

resultType是SQL映射文件中定义返回值类型,返回值有基本类型,对象类型,List类型,Map类型等。resultType总结如下:

  1. 基本类型:resultType=基本类型
  2. List类型:resultType=List中元素的类型
  3. Map类型:resultType=map

Mybatis Result Maps collection does not contain value for java.util.List

  1. 自己调用的mapper中resultType误配成resultMap所导致
  2. 在调用方法时,报这个错误,不一定是自己所调用的方法相关的配置错误,其他的mapper中配置错误也会导致这个问题。因为在调用方法时,会检测所有mapper中的返回值,这时候查看一下别的mapper中配置就好了

Mapped Statements collection does not contain value for XXX

在项目中,跳出以上提示,注意以上提示的细节”Mapped”一词,它是被动语态的,是”在已经匹配(Mapped)的语句(Statements)中”的意思,说明JVM已经找到了一些Mapper的xml文件,但does not contain value for XXX,也就是JVM找到的xml文件中没有你想要使用的’XXX’这款

解决办法

网上的资料,大致分类如下:

  1. 命名空间配置错误: <mapper namespace="com.sitech.mapper.StudentMapper">,要写全到”StudentMapper”为止

  2. 如果使用Maven管理项目,则可能是Mapper的xml文件没有编译到target中(pom.xml的build配置项)

  3. 配置中没有引入Mapper的xml文件

参考


----------- 本文结束啦感谢您阅读 -----------

赞赏一杯咖啡

欢迎关注我的其它发布渠道