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 {
@Override
public 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 可能还未生成,需要特殊处理
// 下面会提供具体实现方式
}
}
}
@Override
public void updateFill(MetaObject metaObject) {
// 更新填充逻辑
}
}
方案二:在插入后更新 sp_id_path
由于 id
是自增主键,插入前无法获取,可分两步实现:
- 先插入记录,获取生成的
id
- 立即更新
sp_id_path
为该id
@Service
public class DsteSpConfigNewService {
@Autowired
private DsteSpConfigNewMapper configMapper;
@Transactional
public void saveConfig(DsteSpConfigNew config) {
// 1. 插入记录,此时会自动生成 id
configMapper.insert(config);
// 2. 获取生成的 id
Long 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;
}