问题描述:
在使用mybatis对数据库执行更新操作时,parameterType为某个具体的bean,而bean中传入的参数为null时,抛出异常如下:
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.type.TypeException: Could not set parameters
for mapping: ParameterMapping{property=‘pxh‘, mode=IN, javaType=class java.lang.Long, jdbcType=null, numericScale=null, resultMapId=‘null‘,
jdbcTypeName=‘null‘, expression=‘null‘}.
Cause: org.apache.ibatis.type.TypeException: Error setting null for parameter #5 with JdbcType OTHER .
Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property.
Cause: java.sql.SQLException: 无效的列类型: 1111
at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:76)
mapper文件中代码如下:
<update id="update" parameterType="com.hsoft.mss.xtgl.model.Bean">
update table
<set>
pxh = #{pxh}, // 当pxh传入null时,抛出上述异常,pxh在bean中的类型为Long
time = sysdate
</set>
where id = #{id}
</update>
解决办法一:
经过对代码分析,是由于未指定传入参数pxh的类型,当mybatis接收到null时,无法将其正确的进行解析,进而导致上述异常。
将mapper中代码修改如下:
<update id="update" parameterType="com.hsoft.mss.xtgl.model.Bean">
update table
<set>
pxh = #{pxh,jdbcType=NUMERIC}, //将pxh的类型指定为NUMERIC即可
time = sysdate
</set>
where id = #{id,jdbcType=VARCHAR}
</update>
解决办法二:
在配置文件mybatis-config.xml中加入如下代码:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
...
<settings>
<setting name="jdbcTypeForNull" value="NULL" />
</settings>
...
</configuration>
这样,即使传入参数为null,mybatis也能够将其转换成正确的数据类型,并进行存储操作。
附:常见的Jdbc Type 与 Java Type之间的关系
|JDBC Type |Java Type|
| ------------- |:-------------:|
|CHAR |String|
|VARCHAR |String|
|LONGVARCHAR |String|
|NUMERIC |java.math.BigDecimal|
|DECIMAL |java.math.BigDecimal|
|BIT |boolean|
|BOOLEAN |boolean|
|TINYINT |byte|
|SMALLINT |short|
|INTEGER |int|
|BIGINT |long|
|REAL |float|
|FLOAT |double|
|DOUBLE |double|
|BINARY |byte[]|
|VARBINARY |byte[]|
|LONGVARBINARY |byte[]|
|DATE |java.sql.Date|
|TIME |java.sql.Time|
|TIMESTAMP |java.sql.Timestamp|
|CLOB |Clob|
|BLOB |Blob|
|ARRAY |Array|