Cause: java.sql.SQLException: 无效的列类型: 1111(Mybatis中insert插入空值时,需要指定JdbcType)

这里写图片描述
夜晚福利来啦,看这美女写博客,要的就是这个feel!!!
今天在工作中使用mybatis,在insert向表中插入值时候,遇到一个问题.幸得下面这位博主的文章,问题圆满解决,先将内容整理如下;

首先感谢博主makemyownlife

一.异常再现

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 

二.异常原因


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

我当时业务是记录订单信息,故涉及插入null值,而我并没有指定jdbcType,进而导致报错;

三.相关代码

1.修改之前的xml文件

Xml代码  收藏代码
<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>  

2.修改后的xml文件

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>  

3.Mybatis JdbcType与Oracle、MySql数据类型对应列表

java.sql.Types 值Java 类型IBM DB2OracleSybaseSQLInformixIBM Content Manager
BIGINTjava.lang.longBIGINTNUMBER (38, 0)BIGINTBIGINTINT8DK_CM_BIGINT
BINARYbyte[]CHAR FOR BIT DATARAWBINARYIMAGEBYTEDK_CM_BLOB
BITjava.lang.BooleanN/ABITBITBITBITDK_CM_SMALLINT
BLOBbyte[]BLOBBLOBBLOBBLOBBLOBDK_CM_BLOB
CHARjava.lang.StringCHAR, GRAPHICCHARCHARCHARCHARDK_CM_CHAR
CLOBjava.lang.StringCLOB, DBCLOBCLOBCLOBCLOBCLOBDK_CM_CLOB
DATEjava.sql.DateDATEDATEDATEDATEDATEDK_CM_DATE
DECIMALjava.math.BigDecimalDECIMALNUMBERDECIMAL, MONEY, SMALLMONEYDECIMALDECIMALDK_CM_DECIMAL
DOUBLEjava.lang.DoubleDOUBLEDOUBLE PRECISIONDOUBLE PRECISIONDOUBLE PRECISIONDOUBLE PRECISIONDK_CM_DOUBLE
FLOATjava.lang.DoubleFLOATFLOATFLOATFLOATFLOATDK_CM_DOUBLE
INTEGERjava.lang.IntegerINTEGERINTEGERINTINTEGERINTEGERDK_CM_INTEGER
JAVA_OBJECTjava.lang.ObjectJAVA_OBJECTJAVA_OBJECTJAVA_OBJECTJAVA_OBJECTOPAQUEN/A
LONGVARBINARYbyte[]LONG VARCHAR FOR BIT DATALONG RAWIMAGEIMAGEBYTEDK_CM_BLOB
LONGVARCHARjava.lang.StringLONG VARCHAR, LONG VARGRAPHICLONGTEXTTEXTTEXTDK_CM_VARCHAR(3500)
NUMERICjava.math.BigDecimalNUMERICNUMBERNUMERICNUMERICNUMERICDK_CM_DECIMAL
OTHERjava.lang.ObjectOTHEROTHEROTHEROTHEROTHERN/A
REALjava.lang.FloatREALREALREALREALREALDK_CM_DOUBLE
SMALLINTjava.lang.IntegerSMALLINTSMALLINTSMALLINTSMALLINTSMALLINTDK_CM_INTEGER
TIMEjava.sql.TimeTIMEDATETIMETIMEDATETIME HOUR TO SECONDDK_CM_TIME
TIMESTAMPjava.sql.TimestampTIMESTAMPDATEDATETIME, SMALLDATETIMEDATETIMEDATETIME YEAR TO FRACTION (5)DK_CM_TIMESTAMP
TINYINTjava.lang.ButeSMALLINTTINYINTTINYINTTINYINTTINYINTDK_CM_INTEGER
VARBINARYbyte[]VARCHAR FOR BIT DATARAWVARBINARYIMAGEBYTEDK_CM_BLOB
VARCHARjava.lang.StringVARCHAR, VARGRAPHICVARCHARVARCHARVARCHARVARCHARDK_CM_VARCHAR
  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值