关于Mybatis插入对象时空值的处理

这篇文章主要介绍了关于Mybatis插入对象时空值的处理方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

Mybatis插入对象时空值

Mybatis中经常会有插入数据的情景,有时传输的对象字段并不是完整的,如果不做任何处理则会抛出异常,影响程序执行。

如存在对象赋值不完整的情况可以在字段后添加 jdbcType  如:

INSERT INTO student(`uid`,`name`,`class`) VALUES(#{uid,jdbcType=VARCHAR},#{name,jdbcType=VARCHAR},#{class,jdbcType=VARCHAR})

然后再 mybatis-config.xml  中添加配置

        

如若是其它类型也可使用   标签

     otherType = #{otherType} 

这样在数据库未做限制时,就不会影响到数据的添加或修改。

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

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

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 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}         )     

查询了一下 一些资料说是 

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

           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}                  )         

错误日志是在: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} ,这样就可以解决以上错误了。 

但是,如果我们为每个sql都指定jdbc类型,也比较麻烦,可以mybatis-config.xml种全局设置下:

     

另外,再补充一点资料,可能更能让我们了解问题的真相:

适配oracle数据库的时候,mybatis报了Error setting null parameter,bug发现是参数出现了null值,对于Mybatis,如果进行操作的时候,没有指定jdbcType类型的参数,就可能导致问题。

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

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

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

以上为个人经验,希望能给大家一个参考,也希望大家多多支持0133技术站。

以上就是关于Mybatis插入对象时空值的处理的详细内容,更多请关注0133技术站其它相关文章!

赞(0) 打赏
未经允许不得转载:0133技术站首页 » Java