解决MyBatis报错:TypeException: Could not set parameters for mapping
解决了SpringBoot项目中的MyBatis数据库映射变量类型冲突问题。
·
项目场景:
基于Vue+Spring Boot+MyBatis框架的菜品管理系统,商家在前端修改菜品状态(“可点”改为“售罄”,或“售罄”改为“可点”)。
问题描述
当菜品在数据库中只有一个主键name(菜名)时,系统可以正常实现菜品状态修改功能;相关Dao中的代码:
/**
* 修改菜品状态
*
*/
@Update("UPDATE dishes SET status=#{status} WHERE name=#{name}")
boolean updateStatus(String name, String status);
当菜品在数据库中有两个键name(菜名)和size(规格)时(相关Dao、Service、ServiceImpl、Controller已同步更改),菜品状态修改功能无效,相关Dao中的代码和SpringBoot后台报错如下所示:
/**
* 修改菜品状态
*
*/
@Update("UPDATE dishes SET status=#{status} WHERE name=#{name} AND size=#{size}")
boolean updateStatus(String name, String status, String size);
报错信息主要为两条:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.
TypeException: Could not set parameters for mapping: ParameterMapping{property='size', mode=IN, javaType=int, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}.
Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #3 with JdbcType null .
Try setting a different JdbcType for this parameter or a different configuration property.
Cause: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:77)
下面这条和上面基本一样:
Caused by: org.apache.ibatis.type.
TypeException: Could not set parameters for mapping: ParameterMapping{property='size', mode=IN, javaType=int, jdbcType=null, numericScale=null, resultMapId='null', jdbcTypeName='null', expression='null'}.
Cause: org.apache.ibatis.type.TypeException: Error setting non null for parameter #3 with JdbcType null . Try setting a different JdbcType for this parameter or a different configuration property.
Cause: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
可以看到是MyBatis数据库映射的变量发生类型冲突。
原因分析:
name | size | |
---|---|---|
数据库 | VARCHAR | VARCHAR |
实体类 | String | String |
Controller | String | String |
Service | String | String |
ServiceImpl | String | String |
MyBatis中的javaType | String | int |
MyBatis中的jdbcType | String | null |
由该表得知,size发生了数据类型冲突。
解决方案:
搜了很多解决方案都是改什么MyBatis的xml配置文件(笑哭,我根本找不到),还改什么pom.xml的依赖(试过了没用),快要把代码改回来的时候终于找到了解决方法,也没那么复杂,直接在Dao中相应的SQL中指明javaType和jdbcType就好了,猜测是不指明的话前者默认为int后者默认为null了,但是为什么name不需要而size需要我就不知道了。
指明数据类型后的Dao中的代码:
/**
* 修改菜品状态
*
*/
@Update("UPDATE dishes SET status=#{status} WHERE name=#{name} AND size=#{size,javaType=String,jdbcType=VARCHAR}")
boolean updateStatus(String name, String status, String size);
前端正常响应了,后端也运行正常:
参考:Could not set parameters for mapping错误与mybatis源码追踪
更多推荐
已为社区贡献5条内容
所有评论(0)