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
- #{memo,jdbcType=VARCHAR}
这种方案在网上有很多介绍,但是我不满意,因为太麻烦了,要增加很多代码,导致后期的维护困难增加。后来找到以下第二种方案,很不错,推荐一下。
第二种方案:MyBatis-config.xml中设置当JDBC类型为空值时,要指定的值得,默认为OTHER,我们指定为NULL就好了(注意是大写的NULL)。
顺便补习一下MyBatis-config.xml配置说明,赶紧收藏吧。
<!– 设置但JDBC类型为空时,某些驱动程序 要指定值,default:OTHER –>
<setting name=“jdbcTypeForNull” value=“DEFAULT”/>
本文参考资料: 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是区分大小写的。