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

mybatisPlus 新增时 其他字段的值和 id 保持一致实现方法

MyBatis-Plus 实现 sp_id_path 与 id 同步的方案

要实现新增时 sp_id_path 自动与 id 保持一致,需要在实体类和插入逻辑中做相应处理。MyBatis-Plus 提供了几种方式来实现这一需求:

方案一:使用 MyBatis-Plus 的自动填充功能

这是最优雅的解决方案,通过实现 MetaObjectHandler 接口,在插入前自动设置 sp_id_path 的值:

import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {// 获取当前实体对象Object entity = metaObject.getOriginalObject();// 只处理 DsteSpConfigNew 实体if (entity instanceof DsteSpConfigNew) {DsteSpConfigNew config = (DsteSpConfigNew) entity;// 若 sp_id_path 未手动设置,则在插入前设置为 id 值if (config.getSpIdPath() == null) {// 注意:此处 id 可能还未生成,需要特殊处理// 下面会提供具体实现方式}}}@Overridepublic void updateFill(MetaObject metaObject) {// 更新填充逻辑}
}

方案二:在插入后更新 sp_id_path

由于 id 是自增主键,插入前无法获取,可分两步实现:

  1. 先插入记录,获取生成的 id
  2. 立即更新 sp_id_path 为该 id
@Service
public class DsteSpConfigNewService {@Autowiredprivate DsteSpConfigNewMapper configMapper;@Transactionalpublic void saveConfig(DsteSpConfigNew config) {// 1. 插入记录,此时会自动生成 idconfigMapper.insert(config);// 2. 获取生成的 idLong id = config.getId();// 3. 更新 sp_id_path 为 id 值DsteSpConfigNew updateEntity = new DsteSpConfigNew();updateEntity.setId(id);updateEntity.setSpIdPath(String.valueOf(id));configMapper.updateById(updateEntity);}
}

方案三:使用数据库触发器(推荐)

数据库层面的触发器可以更可靠地保证 sp_id_path 与 id 的一致性:

DELIMITER $$
CREATE TRIGGER after_dste_sp_config_new_insert
AFTER INSERT ON dste_sp_config_new
FOR EACH ROW
BEGIN-- 将新记录的 sp_id_path 更新为 id 值UPDATE dste_sp_config_new SET sp_id_path = NEW.id WHERE id = NEW.id;
END$$
DELIMITER ;

这种方式无需修改 Java 代码,完全由数据库自动处理,但需要注意触发器可能带来的性能影响。

实体类配置

确保实体类中包含这两个字段,并使用正确的注解:

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName("dste_sp_config_new")
public class DsteSpConfigNew {@TableId(type = IdType.AUTO)private Long id;private String spName;private Long projectId;private String spIdPath;private String spNamePath;private Long parentSpId;private Integer spStatus;private LocalDateTime createAt;private LocalDateTime updateAt;private LocalDateTime deleteAt;
}
http://www.xdnf.cn/news/486883.html

相关文章:

  • NexBot AI 1.9.3 | 专业AI写作助手,高自由度定制内容,支持中文设置
  • Java 线程状态详解:从创建到销毁的完整旅途
  • 深度学习驱动下的目标检测技术:原理、算法与应用创新
  • PT2031S单触控单输出触摸IC
  • 关闭VSCode 自动更新
  • foxmail - foxmail 启用超大附件提示密码与帐号不匹配
  • 内部检测实验室数字化转型新路径 质检LIMS系统如何实现合规、效率、资质三重突破?
  • FC7300 SPI MCAL配置引导
  • Python爬虫(28)Python爬虫高阶:Selenium+Splash双引擎渲染实战与性能优化
  • Go语言交替打印问题及多种实现方法
  • 黑马点评面试前复习
  • 探索大型语言模型(LLM)的开源学习路径:mlabonne/llm-course 深度解析
  • 多模块,依赖android.car.jar后,能调用接口但是没有回调的问题
  • 电子电路仿真实验教学平台重磅上线!——深圳航天科技创新研究院倾力打造,助力高校教学数字化转型
  • Linux进程信号(一)之信号的入门
  • AI-Course-Presenter
  • Houdini POP入门学习01
  • 后端框架(1):Mybatis
  • “分布形态“
  • 浅谈“量子计算应用:从基础原理到行业破局”
  • ohttps开启群晖ssl证书自动更新
  • lesson03-简单回归案例(理论+代码)
  • 文章记单词 | 第87篇(六级)
  • FC7300 ADC MCAL配置引导
  • sqli-labs靶场23-28a关(过滤)
  • conda init执行了还是不好用
  • 2025年长三角+山东省赛+ 认证杯二阶段论文发布!
  • python是如何调用前后双下划线的函数的
  • mysql集群
  • [前端] wang 富文本 vue3