转自:https://blog.csdn.net/snakemoving/article/details/76052875

前天遇到一个问题 异常显示如下:

引用
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 

对应的sqlmap如下:

  1. <insert id="insertCustomerLog" parameterType="map">
  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} ,
  23. #{username},
  24. #{content},
  25. #{logFirstType},
  26. #{status},
  27. #{linkedId},
  28. #{fee},
  29. #{accountFirstType},
  30. #{accountSecondType},
  31. #{accountThirdType},
  32. #{logSecondType},
  33. #{logIp},
  34. #{memo}
  35. )
  36. </insert>

查询了一下 一些资料说是:

引用
MyBatis 插入空值时,需要指定JdbcType 
mybatis insert空值报空值异常,但是在pl/sql不会提示错误,主要原因是mybatis无法进行转换, 

所以将xml改为:

  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>

这个时候 运行正常。

我不甘心 想试试 ibatis2 是否也有同样的问题

xml如下:

  1. <insert id="BasicUserInfoDaoImpl.testMap" parameterClass="java.util.HashMap">
  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# ,
  23. #username#,
  24. #content#,
  25. #logFirstType#,
  26. #status#,
  27. #linkedId#,
  28. #fee#,
  29. #accountFirstType#,
  30. #accountSecondType#,
  31. #accountThirdType#,
  32. #logSecondType#,
  33. #logIp#,
  34. #memo#
  35. )
  36. </insert>

这个时候 发现 ibatis2 可以正常的执行 数据库可以正常的插入数据 。 
错误日志是在:org.apache.ibatis.type.BaseTypeHandler这个类的第17行打出的。根据异常上面的代码

  1. if (parameter == null) {
  2. if (jdbcType == null) {
  3. try {
  4. ps.setNull(i, JdbcType.OTHER.TYPE_CODE);
  5. } catch (SQLException e) {
  6. throw new TypeException("Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters. Cause: " + e, e);
  7. }
  8. } else {
  9. ps.setNull(i, jdbcType.TYPE_CODE);
  10. }
  11. } else {
  12. setNonNullParameter(ps, i, parameter, jdbcType);
  13. }

可以看出,是因为你传入的参数的字段为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

最新文章

  1. 将http调用返回json中的有关中文的unicode转换为中文
  2. [Java Basics] Reflection
  3. 回顾Spring框架
  4. 循环不变量loop invariant 与 算法的正确性
  5. [BS-00] const限定常量或者变量(初次赋值后),其值不允许被改变
  6. nginx日志文件切割
  7. Linux下mysql编译安装
  8. STL Traits编程技法
  9. VS2013 右键监视,未能计算表达式的值
  10. 如何让MFC程序关闭按钮失效,也无法右击任务栏关闭窗口来关闭?
  11. literal控件的例子
  12. 深度学习实践系列(2)- 搭建notMNIST的深度神经网络
  13. 用ECMAScript4 ( ActionScript3) 实现Unity的热更新 -- 使用FairyGUI (二)
  14. 树莓派3B+(三)
  15. 五、activiti工作流-学生请假流程
  16. mysql数据库忘记密码时如何修改
  17. Don’t Put View Code Into Your View Controller别把View创建的代码放在VC中(swift)
  18. java并发编程:线程安全管理类--原子操作类--AtomicBoolean
  19. ELK学习链接
  20. python -keras

热门文章

  1. cf812 C 二分
  2. 微信小程序navigateTo /redirectTo/navigateBack 三者区别
  3. 身份证&amp;银行卡识别方案
  4. 433.92 TX RX module design and test recording。。
  5. 一起玩转mysql
  6. Django 之 富文本编辑器-tinymce
  7. react拖拽(表格拖拽排序、普通拖拽排序以及树形拖拽排序)
  8. Codeforces 165 E. Compatible Numbers【子集前缀和】
  9. POJ 1611:The Suspects(并查集)
  10. 2018c语言第2次作业