`

mybatis 需要注意的点 MyBatis 插入空值时,需要指定JdbcType (201

阅读更多
前天遇到一个问题 异常显示如下:
引用

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如下:
  <insert id="insertCustomerLog" parameterType="map">
        insert into customer_log
        (
        ID,
        CUSTOMER_SERVICE_USER_NAME,
        user_name,
        CONTENT,
        LOG_FIRST_TYPE,
        STATUS,
        LINKED_ID,
        FEE,
        ACCOUNT_FIRST_TYPE,
        ACCOUNT_SECOND_TYPE,
        ACCOUNT_THIRD_TYPE,
        LOG_SECOND_TYPE,
        LOG_IP,
        MEMO
        )
        values
        (
               seq_customer_log.nextval ,
              #{customerServiceUserName} ,
              #{username},
              #{content},
              #{logFirstType},
              #{status},
              #{linkedId},
              #{fee},
              #{accountFirstType},
              #{accountSecondType},
              #{accountThirdType},
              #{logSecondType},
              #{logIp},
              #{memo}
        )
    </insert>


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

引用

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


所以将xml改为:
<insert id="insertCustomerLog1" parameterType="com.diyicai.customer.domain.CustomerLog">
        insert into customer_log
               (
               ID,
               CUSTOMER_SERVICE_USER_NAME,
               user_name ,
               CONTENT,
               LOG_FIRST_TYPE,
               STATUS,
               LINKED_ID,
               FEE,
               ACCOUNT_FIRST_TYPE,
               ACCOUNT_SECOND_TYPE,
               ACCOUNT_THIRD_TYPE,
               LOG_SECOND_TYPE,
               LOG_IP,
               MEMO
               )
               values
               (
               seq_customer_log.nextval ,
               #{customerServiceUserName,jdbcType=VARCHAR} ,
               #{username,jdbcType=VARCHAR},
               #{content,jdbcType=VARCHAR},
               #{logFirstType,jdbcType=NUMERIC},
               #{status,jdbcType=NUMERIC},
               #{linkedId,jdbcType=VARCHAR},
               #{fee,jdbcType=NUMERIC},
               #{accountFirstType,jdbcType=NUMERIC},
               #{accountSecondType,jdbcType=NUMERIC},
               #{accountThirdType,jdbcType=NUMERIC},
               #{logSecondType,jdbcType=NUMERIC},
               #{logIp,jdbcType=VARCHAR},
               #{memo,jdbcType=VARCHAR}
               )
    </insert>



这个时候 运行正常。

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

xml如下:
<insert id="BasicUserInfoDaoImpl.testMap" parameterClass="java.util.HashMap">
                insert into customer_log
                (
                ID,
                CUSTOMER_SERVICE_USER_NAME,
                user_name,
                CONTENT,
                LOG_FIRST_TYPE,
                STATUS,
                LINKED_ID,
                FEE,
                ACCOUNT_FIRST_TYPE,
                ACCOUNT_SECOND_TYPE,
                ACCOUNT_THIRD_TYPE,
                LOG_SECOND_TYPE,
                LOG_IP,
                MEMO
                )
                values
                (
                     seq_customer_log.nextval ,
                      #customerServiceUserName# ,
                      #username#,
                      #content#,
                      #logFirstType#,
                      #status#,
                      #linkedId#,
                      #fee#,
                      #accountFirstType#,
                      #accountSecondType#,
                      #accountThirdType#,
                      #logSecondType#,
                      #logIp#,
                      #memo#
                )
    </insert>


这个时候 发现 ibatis2 可以正常的执行 数据库可以正常的插入数据 。
错误日志是在:org.apache.ibatis.type.BaseTypeHandler这个类的第17行打出的。根据异常上面的代码
if (parameter == null) {
  if (jdbcType == null) {
  try {
  ps.setNull(i, JdbcType.OTHER.TYPE_CODE);
  } catch (SQLException e) {
  throw new TypeException("Error setting null parameter. Most JDBC drivers require that the JdbcType must be specified for all nullable parameters. Cause: " + e, e);
  }
  } else {
  ps.setNull(i, jdbcType.TYPE_CODE);
  }
  } else {
  setNonNullParameter(ps, i, parameter, jdbcType);
  }

可以看出,是因为你传入的参数的字段为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
分享到:
评论
5 楼 rgqancy 2016-10-19  
终于明白为啥XML里要带jdbcType=XXXX了。
4 楼 rzh0001 2015-12-01  
Thanks a lot
3 楼 guji528 2014-04-29  
学习了,谢谢
2 楼 AKka 2014-03-27  
彻底清楚这个错误的原因了。向楼主学习了。
1 楼 a4212abc 2013-02-22  
哈哈,原来如此,3Q

相关推荐

    mybatis常用jdbcType数据类型.txt

    mybatis常用jdbcType数据类型.txt mybatis常用jdbcType数据类型.txt

    经过修改源码的mybatis逆向工程生成器(不生成jdbcType)

    经过修改源码的mybatis逆向工程生成器(不生成jdbcType)

    mybatis 报空值异常

    这类问题通常出现在尝试将空值(`null`)插入数据库表中时,尤其是在未指定 JDBC 类型的情况下更为常见。本文将详细介绍这种异常的原因,并提供相应的解决方案。 #### 异常原因分析 当 MyBatis 在执行 SQL 语句时...

    Mybatis 3+Mysql 实现批量插入

    在这个配置中,`foreach`元素被用来遍历传入的列表(`list`),其中`item`属性表示当前迭代项的别名,`index`属性表示当前迭代项的索引,而`separator`属性则指定了各个插入语句之间的分隔符。 ### 四、Java代码实现 ...

    Mybatis实现多表联合查询和批量插入

    Mybatis实现多表联合查询和批量插入 Mybatis是一款流行的持久层框架,它可以帮助开发者快速、高效地访问数据库。在实际开发中,经常需要对多个表进行联合查询,或者对大量数据进行批量插入。本文将详细介绍如何使用...

    Mybatis与JDBC批量插入MySQL数据库性能测试

    接下来,我们将对比Mybatis和JDBC在批量插入时的性能表现。测试通常会涉及以下几个关键因素: 1. **插入数量**:批量插入的行数对性能有直接影响,一般随着插入量的增加,批处理的优势更加明显。 2. **事务大小**:...

    详解MyBatis直接执行SQL查询及数据批量插入

    在使用时,需要注意SQL字符串的编写规范,理解#{}和${}的区别,以及合理利用`&lt;foreach&gt;`标签进行批量操作。这使得MyBatis不仅简化了数据库操作,也提升了开发效率。在实际应用中,应结合业务需求,合理选择查询方式...

    Java实现mybatis批量插入数据到Oracle

    本篇文章将详细介绍如何利用Java和MyBatis实现批量插入数据到Oracle数据库中。 首先,我们需要理解Oracle数据库的一些基本概念。Oracle是世界上最流行的商业关系型数据库管理系统之一,以其强大的功能和高可靠性而...

    SpringBoot整合Mybatis连接SQL Server 跨库批量插入

    这里需要注意的是,SQL Server不支持跨库的事务管理,所以在进行跨库操作时,每个数据库的操作需要独立处理事务。如果其中一个操作失败,你需要捕获异常并手动回滚其他成功的操作。 批量插入可以提高数据插入效率,...

    Mybatis Plus 自定义批量插入或批量更新(根据唯一索引)

    Mybatis Plus 是 Mybatis 的一个扩展工具,它在 Mybatis 的基础上提供了许多便捷的功能,包括自动 CRUD 操作、条件构造器、批量操作等。在实际的项目开发中,批量插入和批量更新是常见的数据处理场景,尤其是在处理...

    MyBatis批量插入Update

    需要注意的是,MyBatis批量插入可能会出现内存不足的问题,因此需要提前修改MySql的配置文件,增加max_allowed_packet的值以避免内存不足的问题。 MyBatis批量插入是一种高效的数据插入方式,可以大大提高插入速度...

    mybatis返回插入的id1

    在 MyBatis 框架中,当我们执行一个插入(insert)操作时,有时需要获取新插入记录的自增主键值,例如数据库中的唯一标识 ID。MyBatis 提供了方便的功能来实现这一需求,这主要涉及到 `keyProperty` 和 `...

    spring整合mybatis时需要用到的配置文件

    最后,`sqlMapConfig.xml`是MyBatis的全局配置文件,它包含了MyBatis的运行时设置,如日志配置、类型别名、对象工厂等。此外,它还包含了一个或多个映射文件的引用,如我们的`User.xml`。通过这种方式,MyBatis知道...

    基于Tk MyBatis框架,mybatis 注解方式实现数据的加解密

    对于数据加密的需求,MyBatis提供了一种称为“插件”的机制,可以拦截SQL执行过程并在其中插入加密或解密的逻辑。MyBatis的插件系统允许开发者创建自定义插件,这些插件可以在执行SQL之前或之后进行干预。 在...

    mybatis运行需要的jar

    8. **其他依赖**:根据具体项目需求,可能还需要其他库,比如CGLIB(用于动态代理)、ASM(字节码操作库,CGLIB的底层依赖),或者当你使用MyBatis的Mapper SPI机制时需要的asm-all-repackaged-x.x.x.jar。...

    mybatis spring 需要的包

    "mybatis spring 需要的包"指的是为了实现MyBatis与Spring的无缝集成,我们需要准备的一些核心库文件。下面将详细解释这个过程以及涉及的关键知识点。 首先,MyBatis-Spring是连接MyBatis和Spring的桥梁,它提供了...

    Mybatis 插入一条或批量插入 返回带有自增长主键记录的实例

    需要注意的是,在 Mybatis 3.3.0 及其之前的版本中,不支持批量插入返回带主键的功能。需要升级到 Mybatis 3.3.1 及其以上版本。 总结 通过上面的示例,我们可以看到 Mybatis 插入一条或批量插入 返回带有自增长...

    struts2+mybatis解决longblob字段问题

    读取`LONGBLOB`字段时,我们需要从数据库查询数据,然后在Struts2的Action中将其转化为可下载的文件形式。在MyBatis的Mapper接口中,定义一个返回`LONGBLOB`字段的方法,如`getBlobById(int id)`。在Struts2 Action...

    Mybatis批量foreach merge into的用法

    Mybatis批量foreach merge into的用法可以批量插入时间价格表数据,但是需要注意其缺陷和限制。在实际应用中,需要根据实际情况选择合适的方法。 知识点总结: 1. Mybatis批量foreach merge into的用法可以批量...

Global site tag (gtag.js) - Google Analytics