常見Jdbc Type 與 Java Type之間的關係
阿新 • • 發佈:2019-01-24
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