1. 程式人生 > >問題描述: 在使用mybatis對資料庫執行更新操作時,parameterType為某個具體的bean,而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

問題描述:

在使用mybatis對資料庫執行更新操作時,parameterType為某個具體的bean,而bean中傳入的引數為null時,丟擲異常如上:


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