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

mybatisplus 集成逻辑删除

一开始,没去查资料,后面要被AI气死了,先看它的的话

一开始,看ai的描述,我还以为,不需要改数据库,mybatis-puls自动拦截集成就可以实现逻辑删除,c,最后还是要给数据库加一个标志位。

ALTER TABLE bird_andconfidence ADD COLUMN deleted INT DEFAULT 0;

运行向数据库插入一个字段deleted

步骤 1: 配置全局逻辑删除属性
mybatis-plus:global-config:db-config:logic-delete-field: deleted       # 指定全局逻辑删除字段名logic-delete-value: 1             # 逻辑已删除值logic-not-delete-value:0

2.逻辑删除标准为加@TableLogic

就好了,在删除时会变为修改,将deleted字段变为1

查询时,会带上条件 AND where deleted =0;

给出我今天写的接口:

public ResponseEntity<?> selectAllBirdsInday(@RequestParam("date") String date) {log.info("查询 {} 的所有鸟类检测结果", date);try {// 手动将 String 类型的 date 参数转换为 LocalDate 类型DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd");LocalDate localDate = LocalDate.parse(date, formatter);List<DetectionResultVO> results = birdSelectService.SelectBirdByDate(localDate);if (results == null || results.isEmpty()) {log.info("{} 没有检测到鸟类", date);// 返回包含提示信息的 JSON 对象,并使用 200 OK 状态码Map<String, String> response = Collections.singletonMap("message", "当天没有检测到鸟类");return ResponseEntity.ok(response); // 200 OK}log.info("查询到 {} 个鸟类检测结果", results.size());return ResponseEntity.ok(results); // 200 OK, 返回检测结果列表} catch (DateTimeParseException e) {log.error("日期格式转换失败", e);return ResponseEntity.badRequest().body("日期格式不正确,请使用 yyyy-MM-dd 格式"); // 400 Bad Request} catch (Exception e) {log.error("查询鸟类检测结果失败", e);return ResponseEntity.internalServerError().body("查询失败,请稍后重试"); // 500 Internal Server Error}
}

public List<DetectionResultVO> SelectBirdByDate(LocalDate date) {try {// 1. 构造查询时间范围LocalDateTime startOfDay = date.atStartOfDay();LocalDateTime endOfDay = date.atTime(LocalTime.MAX);// 2. 使用 Mybatis-Plus 的 QueryWrapper 构建查询条件QueryWrapper<DetectionResult> queryWrapper = new QueryWrapper<>();queryWrapper.between("creat_time", startOfDay, endOfDay);// 3. 查询 DetectionResult 列表List<DetectionResult> detectionResults = detectionResultMapper.selectList(queryWrapper);if (detectionResults == null || detectionResults.isEmpty()) {log.info("{} 没有检测到鸟类", date);return null; // 或者返回 Collections.emptyList();}// 1. 获取所有 detectionResults 的 ID 列表List<Integer> detectionResultIds = detectionResults.stream().map(DetectionResult::getId).collect(Collectors.toList());// 2. 使用 IN 语句查询 BirdAndconfidence 列表QueryWrapper<BirdAndconfidence> birdQueryWrapper = new QueryWrapper<>();birdQueryWrapper.in("detection_results_id", detectionResultIds);List<BirdAndconfidence> allBirdAndConfidences = birdAndconfidenceMapper.selectList(birdQueryWrapper);// 3. 将查询结果按照 detection_results_id 进行分组Map<Integer, List<BirdAndconfidence>> birdMap = allBirdAndConfidences.stream().collect(Collectors.groupingBy(BirdAndconfidence::getDetectionResultsId));List<DetectionResultVO> detectionResultVOS = new ArrayList<>();// 查询相应的多个识别结果for (DetectionResult detectionResult : detectionResults) {int detectionResultsId = detectionResult.getId();// 4. 从分组结果中获取对应的 BirdAndconfidence 列表List<BirdAndconfidence> birdAndConfidences = birdMap.getOrDefault(detectionResultsId, new ArrayList<>());DetectionResultVO detectionResultVO = new DetectionResultVO();BeanUtils.copyProperties(detectionResult, detectionResultVO);detectionResultVO.setResults(birdAndConfidences);detectionResultVOS.add(detectionResultVO);}if (detectionResultVOS == null || detectionResultVOS.isEmpty()) {log.info("{} 没有检测到鸟类", date);return null; // 或者返回 Collections.emptyList();}log.info("查询到 {} 条鸟类检测结果", detectionResultVOS.size());return detectionResultVOS;} catch (Exception e) {log.error("查询鸟类检测结果失败", e);return null; // 或者抛出异常,取决于你的业务需求}}

中途,ai给出了一个优化,批量查询 BirdAndconfidence 列表: 为了避免 N+1 查询问题,可以使用 IN 语句批量查询

使用 for 循环遍历 detectionResults 列表,并在循环中查询 BirdAndconfidence 列表。 这种方式会导致 N+1 查询问题,即每次循环都需要执行一次数据库查询。 如果 detectionResults 列表中的数据量很大,会导致大量的数据库查询,影响性能。

原本

优化后

使用in,先将所有在这天的鸟类识别结果查出,把对应的分组放在程序中,有效减少数据库连接

http://www.xdnf.cn/news/5849.html

相关文章:

  • 从硬盘加载bootloader(setup)
  • 仿射密码的加密与解密
  • LlamaIndex 第八篇 MilvusVectorStore
  • 【图像处理基石】什么是油画感?
  • rocketMq实例
  • Java Spring MVC -01
  • Feign+Resilience4j实现微服务熔断机制:原理与实战
  • spark Mysql数据库配置
  • 百度导航广告“焊死”东鹏特饮:商业底线失守,用户安全成隐忧
  • YOLO11解决方案之物体模糊探索
  • 【自学30天掌握AI开发】第1天 - 人工智能与大语言模型基础
  • MySQL数据库——视图
  • JavaWeb 开发的核心基础知识
  • Stapi知识框架
  • ubuntu---100条常用命令
  • C++GO语言微服务之数据卷实践
  • 分式注记种表达方式arcgis
  • 大语言模型RLHF训练框架全景解析:OpenRLHF、verl、LLaMA-Factory与SWIFT深度对比
  • 华为海思系列----昇腾张量编译器(ATC)模型转换工具----入门级使用指南(LINUX版)
  • AD PCB布局时常用的操作命令
  • Python作业练习2
  • Go语言——docker-compose部署etcd以及go使用其服务注册
  • Spark处理过程—转换算子
  • 0.66kV0.69kV接地电阻柜常规配置单
  • 仓颉Magic亮相GOSIM AI Paris 2025:掀起开源AI框架新热潮
  • 裸金属服务器 VS 传统物理机
  • 鸿蒙next播放B站视频横屏后的问题
  • Linux之进程控制
  • 【Linux网络】HTTPS
  • k8s v1.26 实战csi-nfs 部署