使用List<LinkedHashMap>批量插入或批量更新操作

文章介绍了如何在Javamapper接口中使用动态SQL实现根据主键进行数据的更新或插入操作,通过`insertOrUpdateListMapsBatch`方法,避免直接编写实体类,提高了代码的灵活性和可维护性。

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

根据主键(可多个)有数据则更新,无数据则插入,方便快捷。避免书写实体类

1、在mapper接口内容

    /**
     * 更新或插入操作
     * primaryKey 主键字段
     * tableName 表名
     * maps 需要插入的值
     */
    int insertOrUpdateListMapsBatch(@Param("tableName") String tableName, @Param("maps") List<LinkedHashMap<String, Object>> maps,@Param("primarysKey") List<String> primarysKey);

2、xml内容

<insert id="insertOrUpdateListMapsBatch">
        <foreach collection="maps" item="map" separator=";">
            MERGE INTO ${tableName} AS target USING ( VALUES
            <foreach item="value" index="key" collection="map.entrySet()" open="(" separator="," close=")">
                #{value}
            </foreach>
            ) AS source

            <foreach item="value" index="key" collection="map.entrySet()" open="(" separator="," close=")">
                ${key}
            </foreach>
            ON
            <foreach item="value" index="key" collection="primarysKey" open="(" separator="," close=")">
                target.${value} = source.${value}
            </foreach>
            WHEN MATCHED THEN
            UPDATE SET
            <foreach item="value" index="key" collection="map.entrySet()" separator=",">
                target.${key} = #{value}
            </foreach>
            WHEN NOT MATCHED THEN
            insert
            <foreach item="value" index="key" collection="map.entrySet()" open="(" separator="," close=")">
                ${key}
            </foreach>
            values
            <foreach item="value" index="key" collection="map.entrySet()" open="(" separator="," close=");">
                source.${key}
            </foreach>
        </foreach>

    </insert>

BusFocusResp busFocusResp = new BusFocusResp(); //查询触客阶段 String touchCusLevelCode = customerProfileService.queryCustomerStage(req.getAgentCode(), req.getCo(), req.getOneId()); /* //根据触客阶段编码转换map Map<String, List<BusFocusDetailResp>> bfMap = new HashMap<>(); for (int i = 1; i < 4; i++) { List<BusFocusDetailResp> focusDetailRespList = busPloyConfigMapper.selectBusFocus(String.valueOf(i)); List<BusApplyCusResp> applyCusRespList = busPloyConfigMapper.selectBusApplyCus(String.valueOf(i)); //查询经营重点配置信息 for (BusFocusDetailResp focusDetailResp : focusDetailRespList) { String busFocs = focusDetailResp.getBusinessFocusCode(); //List<BusApplyCusResp> applyCusRespList = busPloyConfigMapper.selectBusApplyCus(busFocs); for(BusApplyCusResp busApplyCusResp : applyCusRespList){ List<BusSkilsResp> skilsResps = busPloyConfigMapper.selectBusSkill(busFocs,busApplyCusResp.getApplyCusCode()); busApplyCusResp.setBusSkilsResps(skilsResps); } focusDetailResp.setBusApplyCusResps(applyCusRespList); } bfMap.put(String.valueOf(i),focusDetailRespList); }*/ // 2. 批量加载所有阶段数据(1次查询) List<BusFocusDetailResp> allFocusList = busPloyConfigMapper.selectAllBusFocus(); // 3. 批量加载所有适用客户数据(1次查询) Set<String> focusCodes = allFocusList.stream() .map(BusFocusDetailResp::getBusinessFocusCode) .collect(Collectors.toSet()); List<BusApplyCusResp> allApplyCusList = busPloyConfigMapper.selectApplyCusByFocusCodes(focusCodes); // 4. 批量加载所有技能数据(1次查询) Set<String> applyCusCodes = allApplyCusList.stream() .map(BusApplyCusResp::getApplyCusCode) .collect(Collectors.toSet()); List<BusSkilsResp> allSkilsList = busPloyConfigMapper.selectSkillsByCodes(focusCodes, applyCusCodes); // 5.1 技能映射: focusCode -> applyCusCode -> [skills] Map<String, Map<String, List<BusSkilsResp>>> skillMap = new HashMap<>(); for (BusSkilsResp skill : allSkilsList) { skillMap.computeIfAbsent(skill.getBusinessFocusCode(), k -> new HashMap<>()) .computeIfAbsent(skill.getApplyCusCode(), k -> new ArrayList<>()) .add(skill); } // 5.2 适用客户映射: focusCode -> [applyCus] Map<String, List<BusApplyCusResp>> applyCusMap = new HashMap<>(); for (BusApplyCusResp applyCus : allApplyCusList) { applyCusMap.computeIfAbsent( applyCus.getBusinessFocusCode(), k -> new ArrayList<>() ).add(applyCus); // 关联技能数据 applyCus.setBusSkilsResps( skillMap.getOrDefault(applyCus.getBusinessFocusCode(), new HashMap<>()) .getOrDefault(applyCus.getApplyCusCode(), new ArrayList<>()) ); } // 5.3 经营重点按阶段分组 Map<String, List<BusFocusDetailResp>> bfMap = allFocusList.stream() .collect(Collectors.groupingBy(BusFocusDetailResp::getTouchCusLevelCode)); // 6. 关联适用客户数据 bfMap.values().forEach(focusList -> focusList.forEach(focus -> focus.setBusApplyCusResps( applyCusMap.getOrDefault(focus.getBusinessFocusCode(), new ArrayList<>()) ) ) ); // 7. 构建返回对象 busFocusResp.setTouchCusLevelCode(touchCusLevelCode); busFocusResp.setBusFocusDataMap(bfMap); //busFocusResp.setTouchCusLevelCode(touchCusLevelCode); // busFocusResp.setBusFocusDataMap(bfMap); return busFocusResp;--返回数据有重复,进行优化处理
最新发布
07-02
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值