使用MyBatis框架做更新操作时,在该字段需要更新的内容为空时,就会出现1111错误,也就是无效的列类型,这个时候你就要使用jdbcType。至于什么时候要使用到javaType我还没遇到过,而且我也没有听说过要使用javaType。

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

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

转自:http://makemyownlife.iteye.com/blog/1610021 感谢作者

Mybatis中的jdbcType的作用的更多相关文章

  1. 记自己在mybatis中设置jdbcType的一个坑

    项目是用ssm搭建的.主要是为app数据接口.其中有一个需求就app想要查询一段时间内某个用户的测量信息,所以app给我后端传递了3个参数,分别是appuserId(String),startDate ...

  2. mybatis中<include>标签的作用

    MyBatis中sql标签定义SQL片段,include标签引用,可以复用SQL片段 sql标签中id属性对应include标签中的refid属性.通过include标签将sql片段和原sql片段进行 ...

  3. mybatis中 keyProperty="id" 的作用

    keyProperty="id"的作用是: 一般都是结合数据库自动生成主键来使用,由于是数据库生成的主键, 所以在这个对象持久化到数据库之前是对象中的这个属性是没有属性值的,但是在 ...

  4. MyBatis中的JdbcType映射介绍

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.                                               本 ...

  5. 关于 myBatis 中的 jdbcType的细节问题

    前几天上线了一个 版本,第二天到公司的时候,在cat上发现了一个长sql查询非常耗时,几乎把线上的项目搞崩溃了.我马上开始排查问题.最终发现 球队的ID传过来的时候是String 类型的,但是在执行s ...

  6. mybatis中的resultMap实际作用

    resultMap和resultType在实际的使用上完全可以进行替换,但是resultMap有比resultType更多的一个功能.我们先定义一个简单的resultMap例子 <resultM ...

  7. mybatis中jdbcType的作用和是否必须

    1. mybatis中 jdbcType 时间类型 当jdbcType = DATE 时, 只传入了 年月日 jdbcType = TIMESTAMP ,  年月日+ 时分秒 2. jdbcType ...

  8. MyBatis中jdbcType=INTEGER、VARCHAR作用

    Mapper.xml中 pid = #{pid,jdbcType=INTEGER} pid = #{pid} 都可以用 Mybatis中什么时候应该声明jdbcType? 当Mybatis不能自动识别 ...

  9. mybatis 中jdbctype和javatype的对应关系

    1:mybatis 中jdbctype和javatype的对应关系 JDBC Type Java Type CHAR String VARCHAR String LONGVARCHAR String ...

随机推荐

  1. Mac OS 10.12 - 安装任何来源软件!!

    今天想安装一个从网上下载的软件到Mac OS 10.12中,结果没有想到Mac告诉我那个软件已经损坏,害得我删除了!! 最后通过热心网友的帮助,顺利解决了这个安装问题,重新安装并且使用上了这款软件,下 ...

  2. zookeeper链接数导致kafka storm不能正常工作

    报错信息: java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: org.apache ...

  3. mybatis单表操作实现完全java代码封装

    之前在项目中用到mybtis操作数据库时都是手动写sql,对于我这种sql水平不是很好地人来说痛苦死了:动态查询的sql我表示到现在还不会写呀! 还好,利用数据库表反向生成的工具可以帮我解决大部分的s ...

  4. 配置阿里云ESC服务器部署项目

    第一次SSH登录 ECS 服务器: 打开命令行终端(git),键入: > ssh root@39.108.54.110 输入实例密码,进入服务器环境. 配置 root 及应用账号权限 新增管理员 ...

  5. 【转】JMeter学习参数化User Defined Variables与User Parameters

    偶然发现JMeter中有两个元件(User Defined Variables与User Parameters)很相近,刚开始时我也没注意,两者有什么不同.使用时却发现两者使用场景有些不同,现在小结一 ...

  6. linux对文件赋权限的命令chmod的详细说明

    指令名称 : chmod使用权限 : 所有使用者 使用方式 : chmod [-cfvR] [--help] [--version] mode file... 说明 : Linux/Unix 的档案调 ...

  7. iOS开发总结——协议代理的认识

    1.前言 自今年5月底正式转iOS之后,天天get新技能,很多技能在脑子里回旋不吐不快,所以,写点东西整理一下.先从协议代理开始. 2.协议方法的声明 @protocol EventMenuBarDe ...

  8. Unity 自动生成组件索引类工具

    Unity 自动生成组件索引类工具 需求由来 我们在写UI类时 需要获取预设中的组件 joystick = transform.Find("joystick"); backgrou ...

  9. POJ 2390

    import java.util.*; public class Main { public static void main(String args[]){ double interest; Sca ...

  10. LeetCode All in One题解汇总(持续更新中...)

    突然很想刷刷题,LeetCode是一个不错的选择,忽略了输入输出,更好的突出了算法,省去了不少时间. dalao们发现了任何错误,或是代码无法通过,或是有更好的解法,或是有任何疑问和建议的话,可以在对 ...