Mybatis+Oracle批量插入(均带主键自增序列)

目录

方法一

方法二


方法一

Mapper接口:

    /**
     * 批量新增
     *
     * @param
     * @return
     */
    int insertSelect(@Param("sjJymcList") List<SjJymc> sjJymcList);

对应的XML:(SJ_JYMC_SEQ是为该表创建的序列,作为其主键)

  <insert id="insertSelect" parameterType="java.util.List">
    BEGIN
    <foreach collection="sjJymcList" item="SjJymc" index="index" separator="">
      insert into sj_jymc(ID,BEAN_ID,JYFS_ID,FIELD_NAME,FILED_DESC,STATUS,ISDELETE,CREATE_ID,CREATE_TIME)
      VALUES(
      SJ_JYMC_SEQ.NEXTVAL,
      #{SjJymc.beanId,jdbcType=INTEGER},
      #{SjJymc.jyfsId,jdbcType=VARCHAR},
      #{SjJymc.fieldName,jdbcType=VARCHAR},
      #{SjJymc.filedDesc,jdbcType=VARCHAR},
      #{SjJymc.status,jdbcType=INTEGER},
      #{SjJymc.isdelete,jdbcType=INTEGER},
      #{SjJymc.createId,jdbcType=INTEGER},
      #{SjJymc.createTime,jdbcType=DATE} );
    </foreach>
    COMMIT;
    END;
  </insert>

注:insert标签一定要添加: useGeneratedKeys="false" ,否者会报错。

缺点:不管批量插入多少条数据,返回的影响行数总为-1。

方法二

dao接口:

int insertBatch(List<P> pos);

对应的XML:

<insert id="insertBatch" parameterType="list" useGeneratedKeys="false" databaseId="oracle">
  insert into table_name (
    ID,
    FIELD_ONE,
    FIELD_TWO,
    FIELD_THREE
  )
  <foreach collection="pos" item="item" index="index" separator="UNION ALL">
    select get_seq_next('seq_name'),
    #{item.fieldOne, jdbcType = ???},
    #{item.fieldTwo, jdbcType = ???},
    #{item.fieldThree, jdbcType = ???} from dual
  </foreach>
</insert>

注:table_name即表名;seq_name为自增序列名;get_seq_next()是个oracle函数,用来获取序列的下一个值,虽然按理说直接seq_name.nextval就可以了,但是这里会报错。

附:get_seq_next()函数:

CREATE OR REPLACE
function get_seq_next (seq_name in varchar2) return number
is
seq_val number ;
begin
execute immediate 'select '|| seq_name|| '.nextval from dual' into seq_val ;
return seq_val ;
end;

缺点:不能直接调用序列的nextval方法,需要另外加一个生成主键的oracle函数。

参考链接:

https://www.cnblogs.com/longmenzhitong/p/11122637.html

https://www.cnblogs.com/achengmu/p/11230493.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值