MyBatis 常见错误

简介: 为初学者准备的常见MyBatis 异常汇总 ,持续完善中
2.6 测试
PersistenceException 持久化异常…

BuilderException 构建异常 …

ReflectionException 反射异常…

BindingException(数据捆绑) 注入异常…

SQLSyntaxErrorException SQL 语句错误异常

ExpressionSyntaxException 表达式语法错误

2.6.1 Could not find resoure
资源未找到所导致的异常…

getResource时资源路径写错了 或者 是主配置文件 mapper 中的resource写错了
2.6.2 Cannot find class
没有找到class…

去看看你包导入了吗或者看看你类名是不是写错了。
2.6.3 …does not contain value for …
所指定的集(set、collection)中不包含指定内容(key、value) 使用getMepperStatement()方法来获取不存在的的statement id 时会报此类异常

去看看statement id 是否存在于配置文件
例: Mapped Statements collection does not contain value for 123.electAll

值 123.electAll 在 Mapped Statements collection(映射声明集) 中不存在
2.6.4 Type ${interface} is not known to the MapperRegistry.
所指定的接口类型在映射仓库中不存在 使用动态代理获取指定接口时会遇到这种异常

你写的mapper配置文件是否对应接口,去看看 mapper 的namespace
例: Type interface com.mybatis.dao.UserMapper is not known to the MapperRegistry.

接口类型 com.mybatis.dao.UserMapper 不存在于映射仓库
2.6.5 Type ${interface} is already known to the MapperRegistry.
所指定的接口类型在映射仓库中已存在

添加映射仓库中不存在的接口类型
2.6.6 Invalid bound statement (not found): …
非法范围声明(未找到) 使用动态代理执行接口方法时会遇到这种异常

检查 mapper 文件中CRUD id 是否与 接口方法名相同。
例: Invalid bound statement (not found): com.mybatis.dao.UserMapper.selectAll

指定的 com.mybatis.dao.UserMapper.selectAll 在 声明范围中不存在
2.6.7 Mapping is missing column attribute for property …
使用resultMap 在映射属性中找不到 column 属性 … 使用resultMap映射类时,未指定cloumn 会抛出此异常

写出 column 属性即可
例:

上面两种 都会抛出此异常

2.6.8 Cannot determine value type from string ' s t r ′ 无 法 从 字 符 串 {str}' 无法从字符串 str{str}中确定值类型

​ cloumn 映射至 POJO字段时,属性类型对不上。或者自动映射出现问题

手动指定类型/检查映射字段是否符合java类型要求
2.6.9 There is no setter for property named ‘${name}’ in ‘class ${class}’
c l a s s 类 中 找 不 到 属 性 为 {class} 类 中找不到属性为 class{name} 的set方法 使用resultMap 指定映射property值时 对不上pojo的set方法和字段

写出set方法 或者 将映射property的值设置为 pojo 拥有的set方法名
你知道吗? mybatis 会先去寻找 名称为 n a m e 的 s e t 方 法 。 找 不 到 时 会 去 寻 找 名 称 为 {name} 的set方法。找不到时会去寻找 名称为 nameset{name}的字段 如果还是找不到才会抛出这个异常。2.6.10同理
2.6.10 There is no getter for property named ‘ n a m e ′ i n ′ {name}' in ' namein{class}’
c l a s s 类 中 找 不 到 属 性 为 {class} 类 中找不到属性为 class{name} 的get方法

写出get 方法
2.6.11 java.lang.NoSuchMethodException: ${class01}.()
低版本的mybatis映射对象时 对象必须拥有无参构造方法

创建无参构造即可
课外知识:这个异常也存在于反射中 当getMethod(" m e t h o d N a m e " ) ; 没 有 权 限 访 问 或 者 {methodName}"); 没有权限访问或者 methodName");访{methodName}不存在时会抛出此异常
2.6.12 java.lang.ClassCastException: ${class0} cannot be cast to c l a s s 1 不 能 将 {class1} 不能将 class1{class0} 转化成 ${class1} 十分经典的运行时异常,例如不能将String 转换为Integer 一样。 一般出现在 CUD parameterType中

请检查你传入的参数类型 是否与 parameterType所指定的类型一致。
2.6.13 Parameter n a m e n o t f o u n d . A v a i l a b l e p a r a m e t e r s a r e [ {name} not found. Available parameters are [ namenotfound.Availableparametersare[{collection}]
你指定的${name}并不存在于 ${collection} 中

请确定你的name存在于${collection} 中
2.6.14 Invalid argument value: java.io.NotSerializableException
不可序列化异常 没有实现Serializable 接口??? implements Serializable

collection 指定为 list |map。 避免直接使用 list|map…
例:

INSERT INTO `user`(`name`,`role_id`) values (#{list},#{list}) INSERT INTO `user`(`name`,`role_id`) values (#{map},#{map}) 避免发生上面的错误即可 2.6.15 java.lang.UnsupportedOperationException 不支持的操作异常 操作Arrays 内部类 ArrayList也会抛出此异常 。

mybatis 动态sql 中 没有给list|map起别名 使用list|map会抛出此异常(list|map是整个集合。)

请指定别名并用别名来操作属性
例:

INSERT INTO `user`(`name`,`role_id`) values (#{list.name},#{list.role_id}) INSERT INTO `user`(`name`,`role_id`) values (#{map.name},#{map.role_id}) WoW , 能在mybatis中遇到这个异常,都不是一般人 。 为 foreach 指定 item 属性,并 使用item起的别名来 .方法 注: 如果你的collection 指定的是 array ,传入的实参也是array 那么则会抛出 2.6.10 There is no getter..异常,其实也很好理解,因为数组是对象,而数组对象并不存在 #{array.name}这种奇特的set方法或字段

2.6.16 The expression ‘${value}’ evaluated to a null value.
表达式 ${value} 计算结果为空值

foreach元素中的属性collection所指定的值不存在
2.6.17 Malformed OGNL expression: …
表达式语法错误…

请检查你的表达式是否正确
例:

AND name LIKE concat(’%’,#{name},’%’)
AND name LIKE concat(’%’,#{name},’%’)
了解
Mybatis高版本支持自动有参构造方法创建对象。参数类型顺序需要和数据库中数据一一对应)

注意:Mybatis自动使用有参构造方法构建对象后也会执行pojo的set方法 。就像Mybatis正常执行无参构造方法创建对象后会去寻找set方法为字段赋值时一样。
Mybatis自动使用有参构造方法是用来更灵活的创建对象的,并非是新增的一种映射对象的方式。
当然你不写set方法或者字段名跟数据库列对不上的时候,它默认也就按照有参构造形参的顺序来进行传参(这就可以实现你想象中的mybatis构造方法映射对象的方式)
注:如果传入实参不能被赋值给字段就会抛出 2.6.8 SQLDataException:Cannot determine value type from … 异常

你可能感兴趣的:(MyBatis 常见错误)