转自: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

mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201的更多相关文章

  1. 当需要向数据库插入空值时,sql语句的判断

    方法如下: 1.int代表整形. 2.string 代表 字符型. 3.datetime ,日期类型判断如下 if(account.date!=Datetime.MinValue) { Str1.Ap ...

  2. mybatis 插入空值时报错 TypeException

    报错内容:nested exception is org.apache.ibatis.type.TypeException: Could not set parameters for mapping: ...

  3. Mybatis${}、#{}及使用#{}时指定jdbcType

    一.Mybatis 的Mapper.xml语句中parameterType向SQL语句传参有两种方式:#{}和${} 我们经常使用的是#{},一般解说是因为这种方式可以防止SQL注入,简单的说#{}这 ...

  4. mybatis指定jdbctype

    MyBatis 插入空值时,需要指定JdbcType mybatis insert空值报空值异常,但是在pl/sql不会提示错误,主要原因是mybatis无法进行转换 所以在MyBatis映射文件中要 ...

  5. (转)MyBatis在插入的数据有空值时,可能为空的字段都要设置jdbcType

    1 引言 前面的所有语句中你所见到的都是简单参数的例子,实际上参数是 MyBatis 非常强大的元素,对于简单的做法, 90% 的情况参数都很少,比如: <select id="sel ...

  6. Mybatis + Mysql 插入数据时中文乱码问题

    近日跟朋友一起建立一个项目,用的是spring+mybatis+mysql. 今天碰到一个mybatis向mysql中插入数据时,中文显示为'???'的问题,拿出来说下. 对于数据库操作中出现的中文乱 ...

  7. mybatis于Date和DateTime现场插入

    最近,该公司使用MyBatis3做数据持久层,有在该领域Date和DateTime种类,只有在插入数据时属性设置为一个实体Timestamp将相应mysql的DateTime类型.Date会相应mys ...

  8. Mybatis+Struts2的结合:实现用户插入和查找

    总结一下今天一个成功的小实验:Mybatis+Struts2的结合:实现用户插入和查找.删除和修改如果以后写了,会继续更新. 一 准备工作. 1.新建一个java web项目. 2.在webConte ...

  9. 在MyBatis中查询数据、涉及多参数的数据访问操作、插入数据时获取数据自增长的id、关联表查询操作、动态SQL、关于配置MyBatis映射没有代码提示的解决方案

    1. 单元测试 在单元测试中,每个测试方法都需要执行相同的前置代码和后置代码,则可以自定义2个方法,分别在这2个方法中执行前置代码和后置代码,并为这2个方法添加@Before和@After注解,然后, ...

随机推荐

  1. Tornado源码分析 --- 静态文件处理模块

    每个web框架都会有对静态文件的处理支持,下面对于Tornado的静态文件的处理模块的源码进行分析,以加强自己对静态文件处理的理解. 先从Tornado的主要模块 web.py 入手,可以看到在App ...

  2. wikioi 1035 火车停留 裸费用流

    链接:http://wikioi.com/problem/1035/ 怎么说呢,只能说这个建图很有意思.因为只有m条道,然后能互相接在一起的连通,对每个点进行拆点,很有意思的一道裸费用留题. 代码: ...

  3. orm框架的使用

    Install npm install orm Node.js Version Support Supported: 0.12 - 6.0 + Tests are run on Travis CI I ...

  4. 003PHP文件处理——目录操作:rename scandir

    <?php //目录操作:rename scandir /** * 修改目录名字: * rename('旧名字','新名字') 改变文件夹或者文件的名称 */ //var_dump(rename ...

  5. jQuery中 attr和Prop的区别

    出自这里: http://www.365mini.com/page/jquery_noconflict.htm 在jQuery中,attr()函数和prop()函数都用于设置或获取指定的属性,它们的参 ...

  6. idea里面Java文件显示一个x

    idea里面Java文件显示一个x,编译时过滤了,setting->builder->compiler->excludes

  7. Mac下 cordova 安装随笔

    首先这是我自己第一篇博客,如果有什么不对的,大家指出,积极修改. cordova是大家做混合开发最经常使用的一款使用HTML, CSS & JS进行移动App开发多平台共用一套代码,中文官方网 ...

  8. Java第二次作业--数组和String类

    Deadline: 2017-3-28 23:00 一.学习要点 认真看书并查阅相关资料,掌握以下内容: 掌握基本数据类型和引用数据类型的区别 理解对象的生成与引用的关系 掌握构造方法的重载 掌握St ...

  9. 【C++基础】sort函数

    sort函数的时间复杂度为O(n*logn),排序方法类似于快排. # 头文件 #include<algorithm> using namespace std; # 参数 第一个参数:要排 ...

  10. 比较两个array或者object是否深度相等

    function objectEquals(object1: Object, object2: Object): boolean { for (let propName in object1) { i ...