• SpringBoot-Mybatis批量插入Oracle数据库数据


    前端数据

    有如下需求,前端提交一个对象cabinData,保存到数据表中,对象结构如下:

    1. {
    2. "shipId":"424",
    3. "shipName":"大唐2号",
    4. "ballastCabinData":["艏尖舱","双层底1左","双层底1右","双层底2左","双层底2右","双层底3左","双层底3右","双层底4左","双层底4右","双层底5左","双层底5右","顶边5左","顶边5右","尾尖舱"],
    5. "freshCabinData":["淡水舱1左","淡水舱1右"]
    6. }

    数据表结构

    数据表是oracle,表结构为:

    后端Controller:

    1. @PostMapping("/savecabin")
    2. public AjaxResult savecabin(@RequestBody Map<String,Object> postCabinData){
    3. // 获取map中的参数
    4. String shipIdStr = (String) postCabinData.get("shipId");
    5. Integer shipId = Integer.valueOf(shipIdStr);
    6. String shipName = (String) postCabinData.get("shipName");
    7. List<String> ballastCabinData = (List<String>) postCabinData.get("ballastCabinData");
    8. List<String> freshCabinData = (List<String>) postCabinData.get("freshCabinData");
    9. // 获取shipid下的所有的船舱记录
    10. List<DraftCabin> list = draftCabinService.selectCabinByShipId(shipId);
    11. // 船舱记录大于0时,执行批量删除;船舱
    12. if (list.size()>0){
    13. List<Long> idcards= list.stream().map(DraftCabin::getCabinId).collect(Collectors.toList());
    14. Long[] ids = idcards.toArray(new Long[idcards.size()]);
    15. draftCabinService.deleteDraftCabinByIds(ids);
    16. }
    17. // 批量插入船舱
    18. draftCabinService.insertDraftCabins(ballastCabinData,shipId,"压舱水",shipName);
    19. draftCabinService.insertDraftCabins(freshCabinData,shipId,"淡水",shipName);
    20. return AjaxResult.success();
    21. }

    解析:

    • 使用Map 来接收前端cabinData的JSON对象

      使用map.get("shipId")方法来解析JSON获得对应的值。

    • 批量删除时,使用list.stream().map(DraftCabin::getCabinId).collect(Collectors.toList())方法,使用类中的getCabinId方法来将结果集中的cabbinId形成数组参数,入参批量删除方法deleteDraftCabinByIds

    • 批量插入时,调用service的insertDraftCabins方法,传入四个参数(ballastCabinData,shipId,"压舱水",shipName)

    mapper:

    1. public int insertDraftCabins(@Param("DraftCabin")List DraftCabin, @Param("shipId")Integer shipId, @Param("cabinType")String cabinType,@Param("shipName")String shipName) ;

    解析:

    mapper中,多个参数使用@Param注解来接收,在mybaits的xml中,调用注解名称。

    xml

    1. <!--批量新增-->
    2. <insert id="insertDraftCabins" useGeneratedKeys="false">
    3. INSERT ALL
    4. <foreach collection="DraftCabin" item="item" index="index">
    5. INTO draft_cabin
    6. (cabin_name,ship_id,cabin_type,ship_name)
    7. values(#{item},#{shipId},#{cabinType},#{shipName,jdbcType=VARCHAR})
    8. </foreach>
    9. SELECT 1 FROM DUAL
    10. </insert>

    解析:

    • 批量新增insertDraftCabins,接收多个参数,这时不要添加parameterType属性,useGeneratedKeys="false",一定要添加;

    • foreach的collection是要遍历的对象,这里填写mapper中的注解名称;

    • orcale的批量插入方法与mysql有很大区别,这里需要注意以下:

      1. insert all
      2. into <tableName>[(<table_column1>,<table_column2>...)]
      3. values([<column_value1>,<column_value2>...])
      4. [into <tableName>[(<table_column1>,<table_column2>...)]
      5. values([<column_value1>,<column_value2>...])]...
      6. select <table_value1>[,<table_value2>...] from dual;

       

  • 相关阅读:
    model.eval 至关重要!!!!model.eval()是否开启 BN 和 Dropout 的不同
    Java基础之《netty(2)—IO模型、BIO介绍、NIO介绍》
    Vue3前端实现一个本地消息队列(MQ), 让消息延迟消费或者做缓存
    MVCC和BufferPool缓存机制
    谷歌紧急更新,Chrome 今年第二个零日漏洞曝光
    计算机毕业设计Java校园兼职招聘系统(源码+系统+mysql数据库+Lw文档)
    Python 绘制数据图表
    Pixel3系统提取镜像备份并还原到另一台手机
    宗老师计算机教学-大型集群开发基础知识
    @controller和@RestController的区别
  • 原文地址:https://blog.csdn.net/Java_ttcd/article/details/126540653