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>

 

 

记下来,以免以后在犯类似的错误..

posted @ 2014-10-23 18:18  月光之殇  阅读(2315)  评论(0编辑  收藏  举报