Oracle数据库mybatis 插入空值时报错(with JdbcType OTHER)
Oracle數據庫mybatis 插入空值時報錯(with JdbcType OTHER)的兩種解決方案
在使用Mybatis 3?時,發現了這個問題,當插入數據時,如果有一個字段為空值時,系統會報異常,導致插入數據失敗。
異常信息類似:
org.springframework.jdbc.UncategorizedSQLException:Error setting null for parameter #6 with JdbcType OTHER . Try setting adifferent JdbcType for this parameter or a different jdbcTypeForNullconfiguration property.?
經過查閱各種資料,終于找到了兩種解決方案,分別如下,其中第二種方案個人比較喜歡。
第一種方式,如出錯信息中提到的,需要在每個數據變量那里設置相應的jdbcType,示例如下(加粗加下劃線部分的內容):
1.?????<insert?id=”insertCustomerLog1″?parameterType=”com.diyicai.customer.domain.CustomerLog”>
2.?????????????insert?into?customer_log
3.????????????????????(
4.????????????????????ID,
5.????????????????????CUSTOMER_SERVICE_USER_NAME,
6.????????????????????user_name?,
7.????????????????????CONTENT,
8.????????????????????LOG_FIRST_TYPE,
9.????????????????????STATUS,
10.?????????????????LINKED_ID,
11.?????????????????FEE,
12.?????????????????ACCOUNT_FIRST_TYPE,
13.?????????????????ACCOUNT_SECOND_TYPE,
14.?????????????????ACCOUNT_THIRD_TYPE,
15.?????????????????LOG_SECOND_TYPE,
16.?????????????????LOG_IP,
17.?????????????????MEMO
18.?????????????????)
19.?????????????????values
20.?????????????????(
21.?????????????????seq_customer_log.nextval?,
22.?????????????????#{customerServiceUserName,jdbcType=VARCHAR}?,
23.?????????????????#{username,jdbcType=VARCHAR},
24.?????????????????#{content,jdbcType=VARCHAR},
25.?????????????????#{logFirstType,jdbcType=NUMERIC},
26.?????????????????#{status,jdbcType=NUMERIC},
27.?????????????????#{linkedId,jdbcType=VARCHAR},
28.?????????????????#{fee,jdbcType=NUMERIC},
29.?????????????????#{accountFirstType,jdbcType=NUMERIC},
30.?????????????????#{accountSecondType,jdbcType=NUMERIC},
31.?????????????????#{accountThirdType,jdbcType=NUMERIC},
32.?????????????????#{logSecondType,jdbcType=NUMERIC},
33.?????????????????#{logIp,jdbcType=VARCHAR},
34.?????????????????#{memo,jdbcType=VARCHAR}
35.?????????????????)
36.??????</insert>
這種方案在網上有很多介紹,但是我不滿意,因為太麻煩了,要增加很多代碼,導致后期的維護困難增加。后來找到以下第二種方案,很不錯,推薦一下。
第二種方案:MyBatis-config.xml?中設置當JDBC類型為空值時,要指定的值得,默認為OTHER,我們指定為NULL就好了(注意是大寫的NULL)。?
順便補習一下MyBatis-config.xml配置說明,趕緊收藏吧。
1.???????<!–?配置設置?–>??
2.???????????<settings>??
3.???????????????<!–?配置全局性?cache?的?(?開?/?關)?default:true?–>??
4.???????????????<setting?name=“cacheEnabled”?value=“true”/>??
5.?????????????????
6.???????????????<!–?是否使用?懶加載?關聯對象??同?hibernate中的延遲加載?一樣??default:true?–>??
7.???????????????<setting?name=“lazyLoadingEnabled”?value=“true”/>??
8.?????????????????
9.???????????????<!–?[當對象使用延遲加載時?屬性的加載取決于能被引用到的那些延遲屬性,否則,按需加載(需要的是時候才去加載)]?–>??
10.?????????????<setting?name=“aggressiveLazyLoading”?value=“true”/>??
11.???????????????
12.?????????????<!–?是否允許單條sql?返回多個數據集??(取決于驅動的兼容性)?default:true?–>??
13.?????????????<setting?name=“multipleResultSetsEnabled”?value=“true”/>??
14.???????????????
15.?????????????<!–?是否可以使用列的別名?(取決于驅動的兼容性)?default:true–>??
16.?????????????<setting?name=“useColumnLabel”?value=“true”/>??
17.???????????????
18.?????????????<!–允許JDBC?生成主鍵。需要驅動器支持。如果設為了true,這個設置將強制使用被生成的主鍵,有一些驅動器不兼容不過仍然可以執行。??default:false–>??
19.?????????????<setting?name=“useGeneratedKeys”?value=“false”/>??
20.???????????????
21.?????????????<!–指定?MyBatis?如何自動映射?數據基表的列?NONE:不隱射 PARTIAL:部分??FULL:全部–>??
22.?????????????<setting?name=“autoMappingBehavior”?value=“PARTIAL”/>??
23.???????????????
24.?????????????<!–?這是默認的執行類型???
25.?????????????????SIMPLE?:簡單????
26.?????????????????REUSE:執行器可能重復使用prepared?statements?語句???
27.?????????????????BATCH:執行器可以重復執行語句和批量更新??
28.?????????????–>??
29.?????????????<setting?name=“defaultExecutorType”?value=“SIMPLE”/>??
30.???????????????
31.?????????????<!–?設置驅動等待數據響應的超時數??默認沒有設置–>??
32.?????????????<setting?name=“defaultStatementTimeout”?value=“25000″/>??
33.???????????????
34.?????????????<!–?[是否啟用?行內嵌套語句??defaut:false]?–>??
35.?????????????<setting?name=“safeRowBoundsEnabled”?value=“false”/>??
36.???????????????
37.?????????????<!–?[是否?啟用??數據中?A_column?自動映射?到?java類中駝峰命名的屬性?default:fasle]?–>??
38.?????????????<setting?name=“mapUnderscoreToCamelCase”?value=“false”/>??
39.???????????????
40.?????????????<!–?設置本地緩存范圍?session:就會有數據的共享??statement:語句范圍?(這樣就不會有數據的共享?)?defalut:session?–>??
41.?????????????<setting?name=“localCacheScope”?value=“SESSION”/>??
42.???????????????
43.?????????????<!–?設置但JDBC類型為空時,某些驅動程序?要指定值,default:OTHER?–>??
44.?????????????<setting?name=“jdbcTypeForNull”?value=“DEFAULT”/>??
45.???????????????
46.?????????????<!–?設置觸發延遲加載的方法??–>??
47.?????????????<setting?name=“lazyLoadTriggerMethods”?value=“equals,clone,hashCode,toString”/>??
48.???????????????
49.?????????</settings>?
本文參考資料:?http://takeme.iteye.com/blog/1732801???http://makemyownlife.iteye.com/blog/1610021
?
另外,再補充一點資料,可能更能讓我們了解問題的真相:
適配oracle數據庫的時候,mybatis報了Error setting null parameter,bug發現是參數出現了null值,對于Mybatis,如果進行操作的時候,沒有指定jdbcType類型的參數,就可能導致問題。
postgreSQL,MySQL,SQLSERVER都支持JdbcType.NULL類型,Oracle是不支持,適配的時候也因為這個問題導致mybatis報錯。
比如,之前配置#{submitDate},它會在oracle中報錯:Error settingnull parameter
更改成#{submitDate,jdbcType=DATE},注意jdbcType是區分大小寫的。
轉載于:https://www.cnblogs.com/itrena/p/9018685.html
總結
以上是生活随笔為你收集整理的Oracle数据库mybatis 插入空值时报错(with JdbcType OTHER)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: BZOJ2535 [Noi2010]Pl
- 下一篇: p1044与p1898