网站建设论坛报告黄骅贴吧十一万
2026/1/10 16:42:57 网站建设 项目流程
网站建设论坛报告,黄骅贴吧十一万,沐风模板WordPress,制作网站教学设计MyBatis-Plus 提供的不同填充策略#xff0c;各有特点和适用场景#xff1a;方法对比表特性strictInsertFill / strictUpdateFillfillStrategysetFieldValByName版本3.3.03.03.0严格模式✅ 严格类型检查❌ 不检查类型❌ 不检查类型空值覆盖❌ 已有值不覆盖✅ 空值才填充✅ 总…MyBatis-Plus 提供的不同填充策略各有特点和适用场景方法对比表特性strictInsertFill/strictUpdateFillfillStrategysetFieldValByName版本3.3.03.03.0严格模式✅ 严格类型检查❌ 不检查类型❌ 不检查类型空值覆盖❌ 已有值不覆盖✅ 空值才填充✅ 总是覆盖推荐指数⭐⭐⭐⭐⭐ (推荐)⭐⭐⭐⭐⭐⭐详细对比1.strictInsertFill/strictUpdateFill(推荐使用)特点严格类型检查避免类型错误如果字段已有值不会覆盖安全需要明确指定字段类型javaComponent public class MyMetaObjectHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { // 严格模式 - 推荐使用 this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, createBy, String.class, getCurrentUser()); // 如果实体类中已经设置了 createTime这里不会覆盖 } Override public void updateFill(MetaObject metaObject) { this.strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); this.strictUpdateFill(metaObject, updateBy, String.class, getCurrentUser()); } }场景适合大多数情况特别是需要类型安全和避免意外覆盖的场景。2.fillStrategy特点宽松模式不检查类型只有字段值为 null 时才填充更灵活但不够安全javaOverride public void insertFill(MetaObject metaObject) { // 策略模式 - 字段为null时才填充 this.fillStrategy(metaObject, createTime, LocalDateTime.now()); this.fillStrategy(metaObject, updateTime, LocalDateTime.now()); // 相当于 // if (metaObject.getValue(createTime) null) { // metaObject.setValue(createTime, LocalDateTime.now()); // } }场景当你确定不会出现类型错误且希望空值才填充时使用。3.setFieldValByName(不推荐)特点最原始的方法强制设置总是覆盖已有值没有类型检查容易出错javaOverride public void insertFill(MetaObject metaObject) { // 强制设置 - 总是覆盖 this.setFieldValByName(createTime, LocalDateTime.now(), metaObject); this.setFieldValByName(updateTime, LocalDateTime.now(), metaObject); // 即使实体类已经设置了 createTime也会被覆盖 }场景基本不需要使用除非你有特殊需求需要强制覆盖。实际示例对比场景实体类已经设置了值javaUser user new User(); user.setCreateTime(LocalDateTime.of(2023, 1, 1, 0, 0)); // 手动设置 user.setName(test); userMapper.insert(user);不同方法的结果java// 1. strictInsertFill - 保护已有值 this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); // 结果createTime 2023-01-01T00:00 不覆盖 // 2. fillStrategy - 空值才填充 this.fillStrategy(metaObject, createTime, LocalDateTime.now()); // 结果createTime 2023-01-01T00:00 不覆盖因为不是null // 3. setFieldValByName - 强制覆盖 this.setFieldValByName(createTime, LocalDateTime.now(), metaObject); // 结果createTime 当前时间 强制覆盖类型安全对比java// 1. strictInsertFill - 编译时检查 this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); // ✅ 正确类型匹配 this.strictInsertFill(metaObject, createTime, Date.class, new Date()); // ❌ 错误类型不匹配但编译可能通过运行时报错或填充失败 // 2. fillStrategy - 运行时才可能发现错误 this.fillStrategy(metaObject, createTime, new Date()); // ❌ 危险类型不匹配可能运行时出错或数据错误 // 3. setFieldValByName - 同样危险 this.setFieldValByName(createTime, new Date(), metaObject); // ❌ 危险类型不匹配性能对比实际上性能差异很小但strictInsertFill有额外的类型检查略微增加开销fillStrategy和setFieldValByName更直接但这点性能差异可以忽略不计。最佳实践建议推荐方案javaComponent Slf4j public class AutoFillHandler implements MetaObjectHandler { Override public void insertFill(MetaObject metaObject) { // 使用严格模式 - 安全第一 this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, createBy, String.class, getCurrentUser()); this.strictInsertFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); this.strictInsertFill(metaObject, updateBy, String.class, getCurrentUser()); } Override public void updateFill(MetaObject metaObject) { // 使用严格模式 this.strictUpdateFill(metaObject, updateTime, LocalDateTime.class, LocalDateTime.now()); this.strictUpdateFill(metaObject, updateBy, String.class, getCurrentUser()); } }特殊情况处理javaOverride public void insertFill(MetaObject metaObject) { // 混合使用严格模式 策略模式 // 1. 时间字段用严格模式避免类型错误 this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); // 2. 业务字段用策略模式更灵活 this.fillStrategy(metaObject, department, getDefaultDepartment()); // 3. 确定需要覆盖的用setField极少情况 // this.setFieldValByName(systemFlag, Y, metaObject); }debug 日志javaOverride public void insertFill(MetaObject metaObject) { log.debug(开始自动填充插入字段); try { this.strictInsertFill(metaObject, createTime, LocalDateTime.class, LocalDateTime.now()); log.debug(填充 createTime 成功); } catch (Exception e) { log.warn(填充 createTime 失败使用策略模式, e); this.fillStrategy(metaObject, createTime, LocalDateTime.now()); } }总结选择说明90% 场景使用strictInsertFill/strictUpdateFill灵活场景使用fillStrategy几乎不用setFieldValByName简单记忆要安全→strictInsertFill要灵活→fillStrategy要强制→setFieldValByName在 Spring Boot MyBatis-Plus 项目中推荐始终使用strictInsertFill和strictUpdateFill这是最安全、最现代的做法。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询