Mybatis-Plus字段策略FieldStrategy深度对比:NOT_NULL、NOT_EMPTY、IGNORED到底怎么选?(附Spring Boot 3.x配置示例)
MyBatis-Plus字段策略实战指南如何为不同业务场景选择最优FieldStrategy在数据持久层开发中空值处理是个看似简单却暗藏玄机的问题。想象一下这样的场景用户修改个人资料时清空昵称字段应该更新为NULL还是保持原值API接收到的空字符串是否应该覆盖数据库现有值这些细微差别直接影响着业务逻辑的严谨性和数据一致性。MyBatis-Plus的FieldStrategy正是为解决这类问题而设计的精妙工具但多数开发者往往只停留在使用默认配置的层面。1. 五种字段策略的深度解析1.1 策略类型全景图MyBatis-Plus提供了五种字段策略每种策略在空值处理上都有独特的行为特征策略类型NULL处理空字符串处理适用场景性能影响IGNORED忽略忽略全量更新场景低NOT_NULL跳过处理关键字段保护中NOT_EMPTY跳过跳过字符串字段特殊处理中NEVER强制跳过强制跳过只读字段低DEFAULT跟随全局配置跟随全局配置常规字段取决于全局配置提示NOT_EMPTY对非字符串类型字段如Integer的效果等同于NOT_NULL仅对字符串类型会额外检查空字符串1.2 策略底层实现原理这些策略在SQL生成阶段发挥作用MyBatis-Plus会根据策略类型动态组装SQL语句。以update操作为例// 伪代码展示策略判断逻辑 if (fieldStrategy IGNORED) { // 无条件包含字段 sql.append(fieldName value); } else if (fieldStrategy NOT_NULL) { if (value ! null) { sql.append(fieldName value); } } else if (fieldStrategy NOT_EMPTY) { if (value ! null !(value instanceof String ((String) value).isEmpty())) { sql.append(fieldName value); } }2. Spring Boot 3.x中的策略配置实践2.1 全局策略配置在application.yml中配置全局策略Spring Boot 3.x适配版本mybatis-plus: global-config: db-config: insert-strategy: not_null update-strategy: not_empty where-strategy: not_null对应策略的枚举值映射ignored→ FieldStrategy.IGNOREDnot_null→ FieldStrategy.NOT_NULLnot_empty→ FieldStrategy.NOT_EMPTYnever→ FieldStrategy.NEVERdefault→ FieldStrategy.DEFAULT2.2 字段级策略覆盖通过TableField注解实现细粒度控制public class User { TableField(updateStrategy FieldStrategy.NOT_EMPTY) private String nickname; // 允许清空但不允许空字符串 TableField(insertStrategy FieldStrategy.NEVER) private LocalDateTime createTime; // 仅由数据库自动生成 TableField(updateStrategy FieldStrategy.NOT_NULL) private String mobile; // 不允许设置为NULL }3. 典型业务场景策略选型3.1 用户资料更新场景允许清空的昵称字段TableField(updateStrategy FieldStrategy.IGNORED) private String nickname;这样前端传null时会更新为NULL传空字符串会更新为空字符串不允许清空的手机号字段TableField(updateStrategy FieldStrategy.NOT_NULL) private String mobile;3.2 逻辑删除与状态字段TableField(updateStrategy FieldStrategy.NEVER) private Integer deleted; // 只通过专用方法修改 TableLogic TableField(whereStrategy FieldStrategy.NOT_NULL) private Integer status; // 查询时自动带上status1条件3.3 与前端表单的协同处理当使用DTO接收前端数据时推荐策略组合public class UserDTO { // 允许清空但拒绝空字符串 TableField(updateStrategy FieldStrategy.NOT_EMPTY) private String avatar; // 数字类型使用NOT_NULL TableField(updateStrategy FieldStrategy.NOT_NULL) private Integer age; }4. 高级应用与避坑指南4.1 策略组合的黄金法则关键业务字段NOT_NULL 数据库NOT NULL约束可选字符串字段NOT_EMPTY 数据库DEFAULT 自动生成字段NEVER 数据库DEFAULT全量更新场景IGNORED 业务层校验4.2 性能优化建议频繁更新的字段避免使用NOT_EMPTY额外空字符串检查批量插入操作建议临时改为IGNORED策略查询条件字段合理设置whereStrategy减少索引失效4.3 常见问题排查问题现象字段更新不生效检查策略类型是否符合预期确认字段值是否被策略过滤调试时开启MyBatis-Plus日志logging.level.com.baomidou.mybatisplusdebug问题现象NPE异常确认NOT_NULL字段在insert时都有默认值复杂对象检查嵌套属性的策略配置在实际项目中使用这些策略时发现最易出错的是混合使用全局配置和字段注解。建议团队统一约定要么全部使用全局配置要么全部使用字段注解避免两者混用导致的维护困难。