問題描述:
在使用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|