Oracle+Mybatis组合使用


前言


Oracle+Mybatis组合使用进行批量插入

一、使用步骤

对于Mybatis+Oralce 的组合,由于oracle没有自动生成主键的功能所以只能借由序列产生数值,来代替mysql当中的类似功能,对于使用foreach这个myabtis提供的标签只能使用List进行值的传入,并且separator需要使用union all 进行分割,又因为oracle对于任何sql语句都需要存放到一个包含有from的sql当中所以对于每次循环生成的语句都需要放入dual临时表当中,并且在insert标签上需要将usegeneratekey标签设置为false因为Oracle不支持自动生成的主键。如果不设置这个值会导致报错。又因为序列的生成也放入foreache标签当中会出现“该处不能放置序列”的异常所以又只能将内部的多个联合查询的sql放入一个子查询,在放入子查询时需要将通名列设置别名防止列明冲突,在外层的查询上在添加 序列的nextval语句,如此才能正常的生成一条能够插入多条数据的sql.
useGeneratedKeys=“false” 需要设置为false否则会报错

代码如下(示例):

<!--通过List将数据批量插入数据库当中 -->
    <!--<insert id="addDingDanMX" parameterType="java.util.ArrayList" useGeneratedKeys="false">
        INSERT INTO USE_ITEM_ORDERS_LINE (
        id
        ,HEADER_ID
        ,CREATE_DATE
        ,LAST_UPDATE_DATE
        ,CREATE_BY
        ,LAST_UPDATE_BY
        ,ITEM_CODE
        ,ITEM_DESC
        ,UNIT
        ,QUANTITY
        ,STOCK_UP_QTY
        ,REMARKS
        ,ORG_CODE
        ,FACTORY
        ,TARGET_SUBINVENTORY
        ,TARGET_LOCATION
        ,ISDELETE
        ,ISCLOSE
        ,NEED_DATE
        )
       select USE_ITEM_ORDERS_LINE_S.nextval,A.* from (
     <foreach collection="list" item="temp" index="index" separator="UNION ALL"> 
     select 
        ${temp.HEADER_ID},sysdate CREATE_DATE,sysdate LAST_UPDATE_DATE
        <if test="temp.CREATE_BY != null">,#{temp.CREATE_BY} CREATE_BY</if>
        <if test="temp.LAST_UPDATE_BY != null">,#{temp.LAST_UPDATE_BY} LAST_UPDATE_BY</if>
        <if test="temp.ITEM_CODE != null">,#{temp.ITEM_CODE}</if>
        <if test="temp.ITEM_DESC != null">,#{temp.ITEM_DESC}</if>
        <if test="temp.UNIT != null">,#{temp.UNIT}</if>
        <if test="temp.QUANTITY != null">,${temp.QUANTITY}</if>
        <if test="temp.STOCK_UP_QTY != null">,${temp.STOCK_UP_QTY} STOCK_UP_QTY</if>
        <if test="temp.REMARKS != null">,#{temp.REMARKS}</if>
        <if test="temp.ORG_CODE != null">,#{temp.ORG_CODE}</if>
        <if test="temp.FACTORY != null">,#{temp.FACTORY}</if>
        <if test="temp.TARGET_SUBINVENTORY != null">,#{temp.TARGET_SUBINVENTORY}</if>
        <if test="temp.TARGET_LOCATION != null">,#{temp.TARGET_LOCATION}</if>
        <if test="temp.ISDELETE != null">,${temp.ISDELETE} ISDELETE</if>
        <if test="temp.ISCLOSE != null">,${temp.ISCLOSE} ISCLOSE</if>
        <if test="temp.NEED_DATE != null">,#{temp.NEED_DATE}</if>
        from dual
    </foreach>
    ) A
    -->

2.最终生成的sql

代码如下(示例):

INSERT INTO USE_ITEM_ORDERS_LINE
  (ID,
   HEADER_ID,
   CREATE_DATE,
   LAST_UPDATE_DATE,
   CREATE_BY,
   LAST_UPDATE_BY,
   ITEM_CODE,
   ITEM_DESC,
   UNIT,
   QUANTITY,
   STOCK_UP_QTY,
   REMARKS,
   ORG_CODE,
   FACTORY,
   TARGET_SUBINVENTORY,
   TARGET_LOCATION,
   ISDELETE,
   ISCLOSE,
   NEED_DATE)
  SELECT USE_ITEM_ORDERS_LINE_S.NEXTVAL, A.*
    FROM (SELECT 249,
                 SYSDATE CREATE_DATE,
                 SYSDATE LAST_UPDATE_DATE,
                 '5781' CREATE_BY,
                 '5781' LAST_UPDATE_BY,
                 '**',
                 '测试001',
                 '件',
                 1,
                 0 STOCK_UP_QTY,
                 '',
                 '****',
                 '**',
                 '**',
                 '**',
                 0 ISDELETE,
                 0 ISCLOSE,
                 '2021-01-03'
            FROM DUAL
          UNION ALL
          SELECT 249,
                 SYSDATE CREATE_DATE,
                 SYSDATE LAST_UPDATE_DATE,
                 '5781' CREATE_BY,
                 '5781' LAST_UPDATE_BY,
                 '*********',
                 '**',
                '**',
                 1,
                 0 STOCK_UP_QTY,
                 '',
                 '**','**','**','**',
                 0 ISDELETE,
                 0 ISCLOSE,
                 '2021-01-03'
            FROM DUAL
          UNION ALL
          SELECT 249,
                 SYSDATE CREATE_DATE,
                 SYSDATE LAST_UPDATE_DATE,
                 '5781' CREATE_BY,
                 '5781' LAST_UPDATE_BY,
                 '*****',
                 '测试001',
                 '件',
                 1,
                 0 STOCK_UP_QTY,
                 '',
                 '**','**','**','**',
                 0 ISDELETE,
                 0 ISCLOSE,
                 '2021-01-03'
            FROM DUAL
          UNION ALL
          SELECT 249,
                 SYSDATE CREATE_DATE,
                 SYSDATE LAST_UPDATE_DATE,
                 '5781' CREATE_BY,
                 '5781' LAST_UPDATE_BY,
                 '**************',
                 '*******',
                 '件',
                 1,
                 0 STOCK_UP_QTY,
                 '',
                 '**','**','**','**',
                 0 ISDELETE,
                 0 ISCLOSE,
                 '2021-01-03'
            FROM DUAL
          UNION ALL
          SELECT 249,
                 SYSDATE CREATE_DATE,
                 SYSDATE LAST_UPDATE_DATE,
                 '5781' CREATE_BY,
                 '5781' LAST_UPDATE_BY,
                  '**************',
                 '*******',
                 '件',
                 1,
                 0 STOCK_UP_QTY,
                 '',
                 '**','**','**','**',
                 0 ISDELETE,
                 0 ISCLOSE,
                 '2021-01-03'
            FROM DUAL) A

总结

对于插入时的字段数必须与插入的字段数一致,目前还没有想到新的解决办法将插入字段与传入参数字段一致。


版权声明:本文为qq_42365066原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。