/在使用Mybatis时,不同的xml配置文件,有的会提示:无效的列类型: 1111
情况一
通过观察,如果是参数是Map类型或者Java Object类型,如果Map或者Object里面的属性类型不一致,如有些属性是String类型,有些属性是Integer类型,那么MyBatis解析的时候,就会出现问题,类型无法识别。
当然,如果传入参数不是Map或者Java Object,而是多个参数列表的形式,如果参数类型一致,那么不会出现问题,如果参数类型不一致,如既有String类型,也有Integer类型,那么解析的时候同样会出错。
最后,解决方案,如果有类型不一致的情况,在值后面加上类型
passWord = #{passWord,jdbcType=VARCHAR} enable = #{enable,jdbcType=NUMERIC}
这里passWord是String类型,enable是Integer类型
注:如果所有的类型都一致,则无需额外为字段加上类型
情况二
还有一种情况,就不是类型不类型的问题,是我这个值为 null,导致没办法自动区分类型,重点关注“#{fieldValue}”,因为这段 SQL 实现自动创建字段和对应的值,如果按照情况一的方式给它再来个动态的 jdbcType 就显得麻烦(不过也可以解决)
<insert id="insertValues" useGeneratedKeys="false"> INSERT ALL <foreach collection="fieldValuesList" item="fieldValues"> INTO ${tableName} <foreach collection="fieldNameList" item="fieldName" open="(" separator="," close=")"> ${fieldName} </foreach> VALUES <foreach collection="fieldValues" item="fieldValue" open="(" separator="," close=")"> #{fieldValue} </foreach> </foreach> SELECT 1 FROM DUAL </insert>
解决方案:因为是不知道 Java 里的 null 属于啥类型,Mybatis 会认为属于 Other 类型,所以报错,那其实做个特判就可以,代码如下
<if test="fieldValue == null"> #{fieldValue, jdbcType = VARCHAR} </if> <if test="fieldValue != null"> #{fieldValue} </if>