Mybatis:使用bean传值,当传入值为Null时,提示“无效的列类型”的解决办法

问题描述:
在使用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|

猜你喜欢

转载自my.oschina.net/u/859228/blog/919981