乐趣区

关于mybatis:记一次未指定jdbcType导致的报错

报错现场还原

一个批量入库的 sql 本人测试的时候失常,在线上报了

### Error updating database.  Cause: java.sql.SQLSyntaxErrorException: ORA-01790: 表达式必须具备与对应表达式雷同的数据类型    

原来的 sql 是这样写的

    <insert id="batchInsert">
        insert into
        <include refid="TABLE_NAME"/>
        (
            CID,
            TS,
            PHONE,
            NUM_PACKAGE,
            COST_MONTHPRICE,
            COST_PRICE,
            ONLINE_TIME,
            LOG_TIME
        )
        <foreach collection="list" item="item" separator="union all">
            select
                #{item.cid},
                #{item.ts},
                #{item.phone},
                #{item.numPackage},
                #{item.costMonthprice},
                #{item.costPrice},
                #{item.onlineTime},
                sysdate
            from dual
        </foreach>
    </insert>

其中 onlineTime 字段在现场有空的状况,狐疑未加 jdbcType=DATE 的状况下 mybatis 将这个字段置为了 ” 空串。

  <insert id="batchInsert">
        insert into
        <include refid="TABLE_NAME"/>
        (
            CID,
            TS,
            PHONE,
            NUM_PACKAGE,
            COST_MONTHPRICE,
            COST_PRICE,
            ONLINE_TIME,
            LOG_TIME
        )
        <foreach collection="list" item="item" separator="union all">
            select
                #{item.cid,jdbcType=INTEGER},
                #{item.ts,jdbcType=INTEGER},
                #{item.phone,jdbcType=VARCHAR},
                #{item.numPackage,jdbcType=VARCHAR},
                #{item.costMonthprice,jdbcType=VARCHAR},
                #{item.costPrice,jdbcType=VARCHAR},
                #{item.onlineTime,jdbcType=DATE},
                sysdate
            from dual
        </foreach>
    </insert>

我记得这个 jdbcType 有时还会引发索引生效的问题,所以当前还是都带上这个配置吧。

退出移动版