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)