当前位置: 首页 > news >正文

mybatis 差异更新法

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

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

    /*** 找出需要删除的房间(存在于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等于空或者不在旧房间中,证明是需要新增或者更新的房间,最后检查其它字段的数据一致,不一致则更新字段。示例代码

 /*** 找出需要新增或更新的房间** @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),最后调用两用上面两个方法,该删除的删除,该新增的新增。示例代码

  /*** 修改酒店管理** @param blueHotel 酒店管理* @return 结果*/@Transactional@Overridepublic 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;}

http://www.dtcms.com/a/298018.html

相关文章:

  • gig-gitignore工具实战开发(三):gig add基础实现
  • k8s的service、deployment、探针详解
  • vue2用elementUI做单选下拉树
  • HC32 中断实现
  • ubuntu上将TempMonitor加入开机自动运行的方法
  • Python异常,模块与包
  • 电厂液压执行器自动化升级:Modbus TCP与DeviceNet的协议贯通实践
  • 从热点到刚需:SmartMediaKit为何聚焦B端视频系统建设?
  • 「iOS」——GCD其他方法详解
  • 自然语言处理技术应用领域深度解析:从理论到实践的全面探索
  • Unity 多人游戏框架学习系列十一
  • http-proxy-middleware MaxListenersExceededWarning
  • [2025CVPR-图象分类方向]SPARC:用于视觉语言模型中零样本多标签识别的分数提示和自适应融合
  • 【STM32】FreeRTOS任务的挂起与解挂(四)
  • 学习游戏制作记录(克隆技能)7.25
  • 踩坑记录:因版本不匹配导致 Boost 1.85 编译失败的完整解决过程
  • 二层隧道协议(PPP、PPTP、L2TP)
  • STM32的WI-FI通讯(HAL库)
  • 2025-07-25设置使用权限N次内
  • 《计算机组成原理与汇编语言程序设计》实验报告一 基本数字逻辑及汉字显示
  • OpenGLRender开发记录(二): 阴影(shadowMap,PCF,PCSS)
  • 升级目标API级别到35,以Android15为目标平台(三 View绑定篇)
  • Fluent自动化仿真(TUI命令脚本教程)
  • SQL Server数据库
  • 破局与重构:King’s LIMS 引领电子行业实验室智能化转型
  • 从kHz到GHz:晶振频率范围如何决定其应用场景
  • 打破渠道壁垒:SEO+ASO协同作战实现用户获取量翻倍
  • Spring Cloud Gateway 服务网关
  • Docker 实战大纲
  • HC32 睡眠