mybatis 差异更新法

主表酒店(blue_hotel)和子表房间(blue_hotel_room)

1.先找出要删除的房间(存在于旧房间但不在新房间中),筛选出新房间的id,然后拿新房间的id去和旧房间做过滤,最后得到结果。代码示例

java 复制代码
    /**
     * 找出需要删除的房间(存在于oldRooms但不在newRooms中)
     *
     * @param oldRooms
     * @param newRooms
     * @return
     */
    private List<BlueHotelRoom> findRoomsToDelete(List<BlueHotelRoom> oldRooms, List<BlueHotelRoom> newRooms) {
        // 收集新房间中的所有ID(使用Set提高查找效率)
        Set<Long> newRoomIds = newRooms.stream()
                .map(BlueHotelRoom::getHotelRoomId)
                .filter(Objects::nonNull)
                .collect(Collectors.toSet());

        // 返回旧房间中不在新房间ID集合中的房间
        return oldRooms.stream()
                .filter(room -> !newRoomIds.contains(room.getHotelRoomId()))
                .collect(Collectors.toList());
    }

2.找出需要新增或更新的房间。将旧房间的数据转换为Map<房间ID,房间对象>的数据形式,然后拿新房间的数据做过滤,新房间中的id等于空或者不在旧房间中,证明是需要新增或者更新的房间,最后检查其它字段的数据一致,不一致则更新字段。示例代码

java 复制代码
 /**
     * 找出需要新增或更新的房间
     *
     * @param oldRooms
     * @param newRooms
     * @return
     */
    private List<BlueHotelRoom> findRoomsToAddOrUpdate(List<BlueHotelRoom> oldRooms, List<BlueHotelRoom> newRooms) {
        // 收集旧房间中的所有ID(使用Map提高查找效率)
        Map<Long, BlueHotelRoom> oldRoomMap = oldRooms.stream()
                .collect(Collectors.toMap(BlueHotelRoom::getHotelRoomId, room -> room));

        return newRooms.stream()
                .filter(room -> {
                    // 新增房间(ID为null或不在旧房间中)
                    if (room.getHotelRoomId() == null) return true;
                    if (!oldRoomMap.containsKey(room.getHotelRoomId())) return true;

                    // 检查是否需要更新(比较关键字段)
                    BlueHotelRoom oldRoom = oldRoomMap.get(room.getHotelRoomId());
                    return !Objects.equals(room.getHotelRoomName(), oldRoom.getHotelRoomName()) ||
                            !Objects.equals(room.getOrderNum(), oldRoom.getOrderNum());
                    // 添加其他需要比较的字段
                })
                .collect(Collectors.toList());
    }

3.最后更新的时候先更新主表数据,也就是酒店的数据。然后查询现有的房间数据,也就是旧的房间数据(oldRooms)新的房间数据就是传过来的房间数据(newRooms),最后调用两用上面两个方法,该删除的删除,该新增的新增。示例代码

java 复制代码
  /**
     * 修改酒店管理
     *
     * @param blueHotel 酒店管理
     * @return 结果
     */
    @Transactional
    @Override
    public int updateBlueHotel(BlueHotel blueHotel) {
        blueHotel.setUpdateTime(DateUtils.getNowDate());

        List<BlueHotelRoom> newRooms = blueHotel.getBlueHotelRoomList();
        // 1. 更新主表
        int rows = blueHotelMapper.updateBlueHotel(blueHotel);

        // 2. 查询现有房间
        List<BlueHotelRoom> oldRooms = blueHotelMapper.selectBlueHotelRoomByHotelId(blueHotel.getHotelId());

        // 3. 找出需要删除的房间(存在于old但不在new中)
        List<BlueHotelRoom> toDelete = findRoomsToDelete(oldRooms, newRooms);
        toDelete.forEach(room -> {
            blueHotelMapper.deleteBlueHotelRoomByHotelRoomId(room.getHotelRoomId());
        });

        // 4. 找出需要新增/更新的项目
        List<BlueHotelRoom> toAddOrUpdate = findRoomsToAddOrUpdate(oldRooms, newRooms);
        toAddOrUpdate.forEach(room -> {
            room.setHotelId(blueHotel.getHotelId());
            if (room.getHotelRoomId() == null) {
                blueHotelMapper.insertBlueHotelRoom(room);
            } else {
                blueHotelMapper.updateBlueHotelRoom(room);
            }
        });


        return rows;
    }
相关推荐
码兄科技13 分钟前
Java AI智能体开发实战:从零构建智能对话系统指南
java·开发语言·人工智能
折哥的程序人生 · 物流技术专研1 小时前
第8篇:六大设计原则在工厂模式中的体现
java·设计模式·设计原则·工厂模式·编程进阶·扩充系列
小明bishe181 小时前
计算机毕业设计之基于JAVA的植物科普网站
java·spring boot·spring·架构·课程设计
r_oo_ki_e_1 小时前
Java Map 集合学习笔记
java·笔记·学习
SL-staff2 小时前
智慧园区2000+设备统一管理:JVS-IoT如何降低运维成本40%
java·开发语言·物联网·智慧园区·设备管理·运维优化·jvs-iot
咖啡八杯2 小时前
GoF设计模式——模板方法模式
java·后端·spring·设计模式
梦帮科技3 小时前
GRAVIS v4.0:基于Web的极速套利架构设计与实时数据流实现
前端·人工智能·rust·自动化·区块链·智能合约·数字货币
爱笑的源码基地3 小时前
一款全开源的信创云PACS影像云平台解决方案,支持多模态医学影像处理(CT/MR/DR/超声/病理等)
java·源码·国产化·pacs·云影像·区域pacs
爱勇宝3 小时前
办公资料反复修改、补传、交接混乱,我做了个桌面工具来解决这件事
前端·后端·程序员
我命由我123453 小时前
Android 开发问题:ClickableSpan 的点击事件没有生效
java·java-ee·android studio·android jetpack·android-studio·android runtime