问题描述:
在使用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: 无效的列类型: 1111at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:76)
mapper文件中代码如下:
update table pxh = #{pxh}, // 当pxh传入null时,抛出上述异常,pxh在bean中的类型为Long time = sysdate where id = #{id}
解决办法一:
经过对代码分析,是由于未指定传入参数pxh的类型,当mybatis接收到null时,无法将其正确的进行解析,进而导致上述异常。
将mapper中代码修改如下:
update table pxh = #{pxh,jdbcType=NUMERIC}, //将pxh的类型指定为NUMERIC即可 time = sysdate where id = #{id,jdbcType=VARCHAR}
解决办法二:
在配置文件mybatis-config.xml中加入如下代码:
... ...
这样,即使传入参数为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|