首页 > 代码库 > ibatis插入操作时,允许为null的字段必须设置字段对应的类型
ibatis插入操作时,允许为null的字段必须设置字段对应的类型
执行插入操作时遇到异常:
--- Cause: java.sql.SQLException : 无效的列类型
<insert id="saveAccCheckRecord" parameterClass="AccCheck" > <selectKey resultClass="Long" keyProperty="id" > SELECT SEQ_INFO_AD_CN_RD_CK_ID.NEXTVAL AS ID FROM DUAL </selectKey> insert into INFO_AWARD_COUPON_RECORD_CHECK ( ID, ORDER_ID, CHILD_BILLNO, BUSINESS_TYPE, BILL_NO, PAY_AMOUNT, OUT_DATE, SER_NUM, RESULT_CODE ) values ( #id#, #orderId#, #childBillNO#, #businessType#, #billNO#, #payAmount#, #outDate#, #serNum#, #resultCode# ) </insert>
看了一下原来是因为最后两个字段值为空(根本没有设置)造成的.
(参考http://lhbthanks.iteye.com/blog/1550457)
因为iBatis 是根据参数的当前值的类型(而不是类属性) 来决定对于这个 PrepairedStatement 设置参数是应该调用哪一个版本的 setXxx() 方法(是 String 就调用,setString() ,是 int 就调用setInt() 等)。而如果参数值为 null,iBatis 便不知道调用哪个 setXxx() 方法,于是在 Oracle 的驱动下就笼统的调用 setNull() 方法,然而 Oracle 在对字符串类型字段使用 setNull() 却是有问题的。
因为在配置中就必须指明当前字段的类型,如 #passwd:VARCHAR:NULL#,当 iBatis 在碰到参数为 null 难以决断时,但见到这里的 VARCHAR 选项,它也知道应该用 setString() 方法来给 PrepairedStatement 赋值。至于其中的 NULL,不过是指定参数为 null 时的默认值,显然,写成 #passwd:VARCHAR# 就行了,后面的 NULL 是多余的。
所以有必要给数据库中允许为空的字段对应的参数指定好对应的类型...
<insert id="saveAccCheckRecord" parameterClass="AccCheck" > <selectKey resultClass="Long" keyProperty="id" > SELECT SEQ_INFO_AD_CN_RD_CK_ID.NEXTVAL AS ID FROM DUAL </selectKey> insert into INFO_AWARD_COUPON_RECORD_CHECK ( ID, ORDER_ID, CHILD_BILLNO, BUSINESS_TYPE, BILL_NO, PAY_AMOUNT, OUT_DATE, SER_NUM, RESULT_CODE ) values ( #id#, #orderId#, #childBillNO:VARCHAR#, #businessType:NUMERIC#, #billNO:VARCHAR#, #payAmount#, #outDate:TIMESTAMP#, #serNum:VARCHAR#, #resultCode:VARCHAR# ) </insert>
记下来,以免以后在犯类似的错误..
ibatis插入操作时,允许为null的字段必须设置字段对应的类型
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。