在使用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.
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.
这种方案在网上有很多介绍,但是我不满意,因为太麻烦了,要增加很多代码,导致后期的维护困难增加。后来找到以下第二种方案,很不错,推荐一下。
第二种方案:MyBatis-config.xml中设置当JDBC类型为空值时,要指定的值得,默认为OTHER,我们指定为NULL就好了(注意是大写的NULL)。
顺便补习一下MyBatis-config.xml配置说明,赶紧收藏吧。
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25. SIMPLE :简单
26. REUSE:执行器可能重复使用prepared statements 语句
27. BATCH:执行器可以重复执行语句和批量更新
28. –>
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
另外,再补充一点资料,可能更能让我们了解问题的真相:
适配数据库的时候,mybatis报了Error setting null parameter,bug发现是参数出现了null值,对于Mybatis,如果进行操作的时候,没有指定jdbcType类型的参数,就可能导致问题。
postgreSQL,,SQLSERVER都支持JdbcType.NULL类型,是不支持,适配的时候也因为这个问题导致mybatis报错。
比如,之前配置#{submitDate},它会在oracle中报错:Error settingnull parameter
更改成#{submitDate,jdbcType=DATE},注意jdbcType是区分大小写的。