主要是进行数据库字段到java对象属性映射时的问题。
这是模仿项目简单写的一个demo,为了复现BUG。数据库中有10列,但是查询结果映射时实体类中只有部分属性。
在低版本 3.1.0的时候,如果数据库多余的列值为null时是不会出BUG的,但是升级myBatis版本后,会出BUG。
低版本的映射逻辑代码:
高版本的映射逻辑代码:
applyPropertMappings方法中进行查询到的列的value映射到JAVA对象的属性。
metaObject.getSetterType(property).isPrimitive()这个我们返回的是非原始类型(username对应的是String,所以结果为fasle,!false值为true,所以会执行下面的setValue方法,然后就会抛错,未找到相应的set方法),所以同样查询到 username为null,高版本出错了,而低版本列值为null,不会进行映射操作,所以不会抛错。
总结:代码开发需要规范,保证dao映射实体类的属性字段和数据库的列保持一致。
Cause: org.apache.ibatis.reflection.ReflectionException: Could not set property 'userName' of 'class learn.User' with value '' Cause: org.apache.ibatis.reflection.ReflectionException: There is no setter for property named 'userName' in 'class learn.User'
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30)
at org.ap