前天遇到一個問題 異常顯示以下: java
Exception in thread "main" org.springframework.jdbc.UncategorizedSQLException: Error setting null for parameter #6 with JdbcType OTHER . Try setting a different JdbcType for this parameter or a different jdbcTypeForNull configuration property. Cause: java.sql.SQLException: 無效的列類型: 1111
; uncategorized SQLException for SQL []; SQL state [99999]; error code [17004]; 無效的列類型: 1111; nested exception is java.sql.SQLException: 無效的列類型: 1111
spring
對應的sqlmap以下:
sql
<insert id="insertCustomerLog" parameterType="map"> apache
insert into customer_log mybatis
( oracle
ID, dom
CUSTOMER_SERVICE_USER_NAME, ui
user_name, this
CONTENT,
LOG_FIRST_TYPE,
STATUS,
LINKED_ID,
FEE,
ACCOUNT_FIRST_TYPE,
ACCOUNT_SECOND_TYPE,
ACCOUNT_THIRD_TYPE,
LOG_SECOND_TYPE,
LOG_IP,
MEMO
)
values
(
seq_customer_log.nextval ,
#{customerServiceUserName} ,
#{username},
#{content},
#{logFirstType},
#{status},
#{linkedId},
#{fee},
#{accountFirstType},
#{accountSecondType},
#{accountThirdType},
#{logSecondType},
#{logIp},
#{memo}
)
</insert>
查詢了一下 一些資料說是:
引用
MyBatis 插入空值時,須要指定JdbcType
mybatis insert空值報空值異常,可是在pl/sql不會提示錯誤,主要緣由是mybatis沒法進行轉換,
因此將xml改成:
<insert id="insertCustomerLog1" parameterType="com.diyicai.customer.domain.CustomerLog">
insert into customer_log
(
ID,
CUSTOMER_SERVICE_USER_NAME,
user_name ,
CONTENT,
LOG_FIRST_TYPE,
STATUS,
LINKED_ID,
FEE,
ACCOUNT_FIRST_TYPE,
ACCOUNT_SECOND_TYPE,
ACCOUNT_THIRD_TYPE,
LOG_SECOND_TYPE,
LOG_IP,
MEMO
)
values
(
seq_customer_log.nextval ,
#{customerServiceUserName,jdbcType=VARCHAR} ,
#{username,jdbcType=VARCHAR},
#{content,jdbcType=VARCHAR},
#{logFirstType,jdbcType=NUMERIC},
#{status,jdbcType=NUMERIC},
#{linkedId,jdbcType=VARCHAR},
#{fee,jdbcType=NUMERIC},
#{accountFirstType,jdbcType=NUMERIC},
#{accountSecondType,jdbcType=NUMERIC},
#{accountThirdType,jdbcType=NUMERIC},
#{logSecondType,jdbcType=NUMERIC},
#{logIp,jdbcType=VARCHAR},
#{memo,jdbcType=VARCHAR}
)
</insert>
這個時候 運行正常。
我不甘心 想試試 ibatis2 是否也有一樣的問題
xml以下:
<insert id="BasicUserInfoDaoImpl.testMap" parameterClass="java.util.HashMap">
insert into customer_log
(
ID,
CUSTOMER_SERVICE_USER_NAME,
user_name,
CONTENT,
LOG_FIRST_TYPE,
STATUS,
LINKED_ID,
FEE,
ACCOUNT_FIRST_TYPE,
ACCOUNT_SECOND_TYPE,
ACCOUNT_THIRD_TYPE,
LOG_SECOND_TYPE,
LOG_IP,
MEMO
)
values
(
seq_customer_log.nextval ,
#customerServiceUserName# ,
#username#,
#content#,
#logFirstType#,
#status#,
#linkedId#,
#fee#,
#accountFirstType#,
#accountSecondType#,
#accountThirdType#,
#logSecondType#,
#logIp#,
#memo#
)
</insert>
這個時候 發現 ibatis2 能夠正常的執行 數據庫能夠正常的插入數據 。
錯誤日誌是在:org.apache.ibatis.type.BaseTypeHandler這個類的第17行打出的。根據異常上面的代碼
if (parameter == null) {
if (jdbcType == null) {
try {
ps.setNull(i, JdbcType.OTHER.TYPE_CODE);
} catch (SQLException e) {
throw new TypeException("Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters. Cause: " + e, e);
}
} else {
ps.setNull(i, jdbcType.TYPE_CODE);
}
} else {
setNonNullParameter(ps, i, parameter, jdbcType);
}
能夠看出,是由於你傳入的參數的字段爲null對象沒法獲取對應的jdbcType類型,而報的錯誤。
你只要在insert語句中insert的對象加上jdbcType就能夠了,修改以下:
#{menuTitle,jdbcType=VARCHAR}
這樣就能夠解決以上錯誤了。
看來須要真正的瞭解mybatis 和ibatis 呀。
但願遇到一樣問題的朋友一塊兒交流。
晚上看到了http://wksandy.iteye.com/blog/1443133 感謝 感謝 WKsandy ,他的文字寫得很好
引用
還有在向oracle插入數據時,mybatis3報Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters,是因爲參數出現了null值,對於Mybatis,若是進行操做的時候,沒有指定jdbcType類型的參數,mybatis默認jdbcType.OTHER致使,給參數加上jdbcType可解決(注意大小寫) http://code.google.com/p/mybatis/issues/detail?id=224&q=Error%20setting%20null%20parameter&colspec=ID