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|
相關文章
相關標籤/搜索