1. MyBatisPlus核心注解全景解析
作为MyBatis的增强工具,MyBatisPlus通过注解机制极大简化了ORM层开发。这些注解主要分为三类:表结构映射注解、字段行为控制注解和特殊功能注解。下面我们通过典型电商系统的用户模块来演示这些注解的实际应用场景。
1.1 表结构映射注解组
@TableName是实体类与数据库表建立映射的基石注解。在用户中心系统中,我们通常会遇到表名与实体类名不一致的情况:
@TableName(value = "t_member", schema = "user_center") public class Member { // 类字段定义 }关键细节:当系统采用分库分表设计时,schema属性特别重要。比如用户数据按区域分库存储,华北地区的用户数据存在user_center_hb库中,此时就需要动态设置schema。
@TableId主键注解支持多种生成策略,电商系统常用的有:
@TableId(value = "member_id", type = IdType.ASSIGN_ID) private Long id;主键策略对比:
| 策略类型 | 适用场景 | 特点 |
|---|---|---|
| ASSIGN_ID | 分布式系统 | 雪花算法生成19位数字 |
| ASSIGN_UUID | 需要字符串ID | 32位UUID字符串 |
| INPUT | 有业务意义的ID | 如订单编号SO20231201 |
1.2 字段行为控制注解组
@TableField是使用频率最高的字段级注解,其丰富属性可以应对各种业务场景:
// 敏感字段脱敏处理 @TableField(value = "id_card", select = false) private String idCard; // 自动填充创建时间 @TableField(fill = FieldFill.INSERT) private LocalDateTime createTime; // 动态查询条件 @TableField(condition = SqlCondition.LIKE) private String username;字段策略的坑点记录:
- 当使用FieldStrategy.NOT_EMPTY时,注意数字0会被视为空值
- 自动填充需要实现MetaObjectHandler接口
- condition属性在动态查询时性能优于XML配置
1.3 特殊功能注解组
@Version实现乐观锁控制库存:
// 商品库存版本控制 @Version private Integer version;@TableLogic实现逻辑删除会员数据:
@TableLogic(value = "0", delval = "1") private Integer deleted;重要提示:逻辑删除字段需要全局配置逻辑未删除值,否则自定义查询需要手动过滤已删除数据。
2. 注解深度应用实战技巧
2.1 多租户系统注解配置
在SAAS系统中,多租户隔离是基本需求。通过注解组合实现:
@TableName("t_order") @KeySequence(value = "seq_order", dbType = DbType.ORACLE) public class Order { @TableId(type = IdType.INPUT) private String orderNo; @TableField(tenantId = true) private String tenantId; }租户字段处理要点:
- 需要配置TenantLineInnerInterceptor插件
- 排除不需要隔离的表使用@InterceptorIgnore
- 分布式ID生成要考虑租户前缀
2.2 枚举类型优雅处理
用户状态枚举的数据库存储方案:
public enum UserStatus { @EnumValue("A") ACTIVE("A"), @EnumValue("F") FROZEN("F"); private String code; // 构造方法等 } // 实体类中使用 private UserStatus status;枚举处理的最佳实践:
- 数据库存code值而非枚举名
- 实现IEnum接口可获得更好序列化支持
- 配合Mybatis的typeHandler实现自定义转换
3. 生产环境避坑指南
3.1 注解失效常见场景
- Lombok冲突问题:
- @Data会覆盖@TableField配置
- 解决方案:改用@Getter/@Setter单独注解
- 继承场景下的注解继承:
- 父类注解不会被自动继承
- 需要子类重新声明或使用@Inherited
- 动态表名不生效:
- @TableName是静态配置
- 需要配合动态表名插件使用
3.2 性能优化建议
- 避免过度使用autoResultMap:
- 会增加元数据解析开销
- 明确指定需要处理的字段
- 谨慎使用select=false:
- 会导致N+1查询问题
- 建议用DTO做字段过滤
- 批量操作禁用乐观锁:
- 批量更新时去掉@Version字段
- 使用updateBatchById替代
4. 高级特性组合应用
4.1 审计日志注解方案
结合自动填充实现操作日志:
public class BaseEntity { @TableField(fill = FieldFill.INSERT) private String createBy; @TableField(fill = FieldFill.UPDATE) private String updateBy; }实现MetaObjectHandler:
public class AuditHandler implements MetaObjectHandler { @Override public void insertFill(MetaObject metaObject) { this.setFieldValByName("createBy", getCurrentUser(), metaObject); } }4.2 多数据源注解策略
不同模块使用不同数据源:
@TableName(value = "t_product", schema = "product_db") public class Product { // 商品模块字段 } @TableName(value = "t_order", schema = "order_db") public class Order { // 订单模块字段 }配置要点:
- 需要配置DynamicDataSource
- 事务注解要指定数据源
- 分库字段需要特殊处理
5. 自定义注解扩展
实现字段加密注解:
@Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface FieldEncrypt { String algorithm() default "AES"; } // 使用自定义注解 @FieldEncrypt private String mobile;配套实现:
- 实现TypeHandler处理加解密
- 注册到Mybatis配置中
- 注意加解密性能影响
通过深度掌握这些注解特性,可以大幅提升持久层开发效率。在实际项目中,建议建立注解使用规范,避免滥用导致的维护问题。对于复杂场景,合理组合注解功能往往比自定义XML更优雅高效。