mybatis Oracle 批量操作

本文介绍了一种批量操作的实现方式,包括批量新增和批量删除,使用UUID作为主键,通过Java和MyBatis进行数据库操作。批量新增部分展示了如何通过流迭代和循环创建对象,将数据插入数据库;批量删除部分介绍了如何处理多个ID的删除操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前提:主键不是自增的是插入UUID的。若@Parm 中是a 则foreach collection 就是a。若不写默认list
`批量新增:
void insertProjectDemonstrationMany(@Param(“proposalItemList”) List proposalItemList);

@ApiOperation(value = "项目论证概览批量新增", notes = "需要包装多个对象的集合", code = 200, produces = "application/json")
@RequestMapping(value = "insertProjectDemonstrationMany", method = RequestMethod.POST)
public ApiResult insertProjectDemonstrationMany(@ApiParam(name = "itemOrgSiteManyDto", value = "集合对象") @RequestBody List<ItemOrgSiteDto> itemOrgSiteDtoList) {
    //定义一个空集合
    List<ProposalItem>proposalItemList=new ArrayList<ProposalItem>();
    Stream.iterate(0,i->i+1).limit(itemOrgSiteDtoList.size()).forEach(i->{
        //每一个空对象(如果把空对象放到外面会有覆盖问题需循环创建多个对象而不是一个)
        ProposalItem proposalItem = new ProposalItem();
        ItemOrgSiteDto itemOrgSiteDto = itemOrgSiteDtoList.get(i);
        String orgId = queryItem_ORG(itemOrgSiteDto.getOrgName()).getOrgId();
        proposalItem.setItemId(UUID.randomUUID().toString().replaceAll("-", "").toUpperCase());
        proposalItem.setItemOrg(orgId);
        proposalItem.setItemYear(itemOrgSiteDto.getItemYear());
        proposalItem.setItemName(itemOrgSiteDto.getItemName());
        proposalItem.setIsInvestment(itemOrgSiteDto.getIsInvestment());
        proposalItem.setItemContent(itemOrgSiteDto.getItemContent());
        proposalItem.setItemSite(itemOrgSiteDto.getItemSite());
        proposalItem.setItemClass("2001");
        proposalItem.setParentItemId(null);
        proposalItem.setItemLevel(itemOrgSiteDto.getItemLevel());
        proposalItem.setRemarks(itemOrgSiteDto.getRemarks());
        proposalItem.setCreateUser(SpringManager.getCurrentUser().getUserId());
        proposalItemList.add(proposalItem);
    });
    annualDeploymentService.insertProjectDemonstrationMany(proposalItemList);
    return ApiResult.ofSuccess();
}
*sql:*
<insert id="insertProjectDemonstrationMany" parameterType="java.util.List">
    INSERT ALL
    <foreach collection="proposalItemList" item="p" index="index">
        INTO     PRODUCTION.CD_ITEM(ITEM_ID,PARENT_ITEM_ID,ITEM_NAME,ITEM_CLASS,ITEM_YEAR,ITEM_LEVEL,IS_INVESTMENT,ITEM_CONTENT,ITEM_ORG,ITEM_SITE,REMARKS,CREATE_USER,CREATE_DATE)
        VALUES
        (
        #{p.itemId,jdbcType=VARCHAR},
        #{p.parentItemId,jdbcType=VARCHAR},
        #{p.itemName,jdbcType=VARCHAR},
        #{p.itemClass,jdbcType=VARCHAR},
        #{p.itemYear,jdbcType=VARCHAR},
        #{p.itemLevel,jdbcType=VARCHAR},
        #{p.isInvestment,jdbcType=VARCHAR},
        #{p.itemContent,jdbcType=VARCHAR},
        #{p.itemOrg,jdbcType=VARCHAR},
        #{p.itemSite,jdbcType=VARCHAR},
        #{p.remarks,jdbcType=VARCHAR},
        #{p.createUser,jdbcType=VARCHAR},
        SYSDATE
        )
    </foreach>
    SELECT 1 FROM DUAL
</insert>`

批量删除(和mysql 一样)
void deleteProjectDemonstrationMany(List list)

@ApiOperation(value = "批量删除生产框架计划指标", notes = "需要fmPlanId", code = 200, produces = "application/json")
   @RequestMapping(value = "deleteLtdFramePlanMany", method = RequestMethod.POST)
   @ResponseBody
   public ApiResult deleteLtdFramePlanMany(@ApiParam(name = "ids", value = "多个fmPlanId", required = true) @RequestParam(value = "ids", required = true) String ids) {
       List<String> list = new ArrayList<String>();
       String[] stIds = ids.split(",");
       for (String value : stIds) {
           //判断fmPlanId是否存在
           List<ProposalLtdFramePlan>listLtdFramePlan = (List<ProposalLtdFramePlan>) queryLtdFramePlanById(value).getResult();
           if (listLtdFramePlan != null && listLtdFramePlan.size() > 0) {
               list.add(value);
           } else {
               return ApiResult.ofFailureResultMsg(null, "批量删除中有数据不存在,请重新选择!", false);
           }
       }
       annualDeploymentService.deleteLtdFramePlanMany(list);
       return ApiResult.ofSuccess();
   }
   *sql:*
<delete id="deleteProjectDemonstrationMany" parameterType="java.util.List">
        delete from PRODUCTION.CD_ITEM where ITEM_ID in
        <foreach collection="list" item="ids" open="(" close=")" separator=",">
            #{ids,jdbcType=VARCHAR}
        </foreach>
    </delete>
### MyBatisOracle数据库中实现批量更新 对于MyBatisOracle数据库中的批量更新操作,考虑到Oracle与MySQL之间的SQL语法差异,在编写批处理语句时需特别注意这些不同之处。为了有效地执行批量更新,可以采用`<foreach>`标签配合特定的SQL结构来完成这一目标。 #### 使用Foreach标签进行批量更新 通过利用`<foreach>`标签,能够构建适用于批量数据处理的强大查询语句。针对批量更新场景,可设计如下形式的Mapper XML配置: ```xml <!-- 更新记录 --> <update id="batchUpdate" parameterType="java.util.List"> BEGIN FORALL i IN indices OF #{list} UPDATE table_name t SET column_a = :i.columnA, column_b = :i.columnB, ... WHERE primary_key_column = :i.id; END; </update> ``` 上述代码片段展示了如何运用PL/SQL特性FORALL来进行高效的数据更新操作[^2]。此方式允许一次性提交多更新指令给数据库引擎处理,从而显著提高性能表现并减少网络开销。 另外一种常见做法是基于单个UPDATE语句结合件判断逻辑,即每次迭代都生成独立但相互关联的SET子句;然而这种方法可能不如前者那样直观易懂或是效率高。 #### 注意事项 当涉及大批量事务时,建议适当调整JDBC连接池设置以及考虑分批次提交更改以防止长时间锁定表资源或占用过多内存空间。此外,还需确保应用程序层面已妥善管理事物边界,以便于发生错误时能及时回滚未保存的变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值