首页
关于
Search
1
MyBatisPlus动态填充
2 阅读
默认分类
前端
Vue
UI
后端
Java
MybatisPlus
Search
标签搜索
MybatisPlus
Cream
累计撰写
1
篇文章
累计收到
0
条评论
首页
栏目
默认分类
前端
Vue
UI
后端
Java
MybatisPlus
页面
关于
搜索到
1
篇与
的结果
2026-02-11
MyBatisPlus动态填充
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 全局配置不影响线程隔离和事务安全
2026年02月11日
2 阅读
0 评论
0 点赞