MyBatisPlus动态填充
标签搜索
侧边栏壁纸
  • 累计撰写 1 篇文章
  • 累计收到 0 条评论

MyBatisPlus动态填充

Cream
2026-02-11 / 0 评论 / 2 阅读 / 正在检测是否收录...
MyBatis-Plus 全局开启了字段自动填充(如创建时间、更新时间等),但在特定接口(例如数据迁移、批量导入)中,不希望触发字段填充逻辑

✨ 核心思路

利用 ThreadLocal 保存一个标志位(是否启用自动填充),然后在自定义的 MetaObjectHandler 中判断这个标志,来决定是否执行填充逻辑。

1️⃣ 定义一个控制工具类

public class FieldFillContext {

    private static final ThreadLocal<Boolean> ENABLE_FILL = ThreadLocal.withInitial(() -> true);

    public static void disable() {
        ENABLE_FILL.set(false);
    }

    public static void enable() {
        ENABLE_FILL.set(true);
    }

    public static boolean isEnabled() {
        return ENABLE_FILL.get();
    }

    public static void clear() {
        ENABLE_FILL.remove();
    }
}

2️⃣ 修改你的 MetaObjectHandler 实现类

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 CustomMetaObjectHandler implements MetaObjectHandler {

    @Override
    public void insertFill(MetaObject metaObject) {
        if (!FieldFillContext.isEnabled()) {
            return; // ❗ 关闭时跳过自动填充
        }
        this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }

    @Override
    public void updateFill(MetaObject metaObject) {
        if (!FieldFillContext.isEnabled()) {
            return; // ❗ 关闭时跳过自动填充
        }
        this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
    }
}

3️⃣ 在需要“关闭填充”的地方临时关闭

@Service
public class DataMigrationService {

    @Autowired
    private UserMapper userMapper;

    public void migrateData(List<User> users) {
        try {
            FieldFillContext.disable(); // ✅ 关闭填充
            for (User user : users) {
                userMapper.insert(user);
            }
        } finally {
            FieldFillContext.enable(); // ✅ 恢复全局设置
            FieldFillContext.clear();
        }
    }
}

✅ 效果:

  • 普通接口:照常自动填充
  • 数据迁移接口:不会触发 MetaObjectHandler 填充逻辑
  • 无需改动 MyBatis-Plus 全局配置
  • 不影响线程隔离和事务安全
0

评论 (0)

取消