项目场景:

基于Vue+Spring Boot+MyBatis框架的菜品管理系统,商家在前端修改菜品状态(“可点”改为“售罄”,或“售罄”改为“可点”)。


问题描述

当菜品在数据库中只有一个主键name(菜名)时,系统可以正常实现菜品状态修改功能;相关Dao中的代码:

    /**
     * 修改菜品状态
     *
     */
    @Update("UPDATE dishes SET status=#{status} WHERE name=#{name}")
    boolean updateStatus(String name, String status);

当菜品在数据库中有两个键name(菜名)和size(规格)时(相关DaoServiceServiceImplController已同步更改),菜品状态修改功能无效,相关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数据库映射的变量发生类型冲突。


原因分析:

namesize
数据库VARCHARVARCHAR
实体类StringString
ControllerStringString
ServiceStringString
ServiceImplStringString
MyBatis中的javaTypeStringint
MyBatis中的jdbcTypeStringnull

由该表得知,size发生了数据类型冲突。


解决方案:

搜了很多解决方案都是改什么MyBatisxml配置文件(笑哭,我根本找不到),还改什么pom.xml的依赖(试过了没用),快要把代码改回来的时候终于找到了解决方法,也没那么复杂,直接在Dao中相应的SQL中指明javaTypejdbcType就好了,猜测是不指明的话前者默认为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源码追踪

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐