Error when inserting null value in Oracle database mybatis (with JdbcType OTHER)

Two solutions for Oracle database mybatis inserting null value error (with JdbcType OTHER)

When using Mybatis 3 , I found this problem. When inserting data, if there is a field with a null value, the system will report an exception, resulting in failure to insert data.

The exception information is similar to:

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. 

After consulting various materials, I finally found two solutions, which are as follows, of which the second solution is personally preferred.

The first method, as mentioned in the error message, needs to set the corresponding jdbcType in each data variable. The example is as follows (the content of the bold and underlined part):

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 parameterbug发现是参数出现了null值,对于Mybatis,如果进行操作的时候,没有指定jdbcType类型的参数,就可能导致问题。

postgreSQLMySQLSQLSERVER都支持JdbcType.NULL类型,oracle是不支持,适配的时候也因为这个问题导致mybatis报错。

比如,之前配置#{submitDate},它会在oracle中报错:Error settingnull parameter

更改成#{submitDate,jdbcType=DATE},注意jdbcType是区分大小写的。

Guess you like

Origin http://10.200.1.11:23101/article/api/json?id=327099083&siteId=291194637