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

问题描述:
在使用mybatis对数据库执行更新操做时,parameterType为某个具体的bean,而bean中传入的参数为null时,抛出异常以下:java

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文件中代码以下:spring

<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>

解决办法一:sql

通过对代码分析,是因为未指定传入参数pxh的类型,当mybatis接收到null时,没法将其正确的进行解析,进而致使上述异常。数据库

将mapper中代码修改以下:express

<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>

解决办法二:apache

在配置文件mybatis-config.xml中加入以下代码:markdown

<?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也可以将其转换成正确的数据类型,并进行存储操做。mybatis

附:常见的Jdbc Type 与 Java Type之间的关系app

|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|
相关文章
相关标签/搜索