MyBatis-Plus注解全解析:@TableId、@TableField等核心注解深度解读

MyBatis-Plus注解全解析:@TableId、@TableField等核心注解深度解读

【免费下载链接】mybatis-plus An powerful enhanced toolkit of MyBatis for simplify development 【免费下载链接】mybatis-plus 项目地址: https://gitcode.com/gh_mirrors/my/mybatis-plus

引言:为什么需要MyBatis-Plus注解?

在日常的Java开发中,MyBatis作为优秀的持久层框架被广泛应用,但其配置相对繁琐。MyBatis-Plus(简称MP)作为MyBatis的增强工具包,通过一系列注解极大地简化了开发流程。你是否还在为繁琐的XML配置而烦恼?是否希望用更简洁的方式完成数据库映射?

本文将深入解析MyBatis-Plus的核心注解体系,让你彻底掌握@TableId、@TableField等关键注解的使用技巧,提升开发效率。

核心注解体系概览

MyBatis-Plus提供了丰富的注解来简化数据库操作,主要分为以下几类:

mermaid

一、@TableName:表名映射注解

基本用法

@TableName("sys_user")
public class User {
    // 类字段定义
}

高级配置选项

参数类型默认值说明
valueString""数据库表名
schemaString""数据库schema,覆盖全局配置
keepGlobalPrefixbooleanfalse是否使用全局表前缀
resultMapString""自定义结果集映射
autoResultMapbooleanfalse是否自动构建resultMap
propertiesString[]{}只包含的字段属性
excludePropertyString[]{}排除的字段属性

使用场景示例

// 复杂表名配置
@TableName(
    value = "t_user", 
    schema = "business",
    keepGlobalPrefix = true,
    autoResultMap = true
)
public class UserEntity {
    // 实体字段
}

二、@TableId:主键标识注解

基本语法

public @interface TableId {
    String value() default "";
    IdType type() default IdType.NONE;
}

IdType枚举详解

mermaid

详细策略说明
策略类型说明适用场景
AUTO0数据库ID自增MySQL等支持自增的数据库
NONE1未设置主键类型跟随全局配置
INPUT2用户输入ID需要手动设置主键的场景
ASSIGN_ID3分配ID(雪花算法)分布式系统,默认实现
ASSIGN_UUID4分配UUID需要字符串主键的场景

实战代码示例

// 雪花算法主键
public class User {
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    
    // 其他字段
}

// UUID主键
public class Order {
    @TableId(type = IdType.ASSIGN_UUID)
    private String orderId;
}

// 自定义字段名
public class Employee {
    @TableId(value = "emp_id", type = IdType.AUTO)
    private Long employeeId;
}

三、@TableField:字段映射注解

核心功能解析

@TableField是MP中最强大的注解之一,提供了丰富的字段控制能力:

public class User {
    @TableField(
        value = "user_name",           // 数据库字段名
        exist = true,                  // 是否为表字段
        condition = SqlCondition.LIKE, // 查询条件
        update = "%s+1",               // 更新表达式
        insertStrategy = FieldStrategy.NOT_NULL,  // 插入策略
        updateStrategy = FieldStrategy.NOT_EMPTY, // 更新策略
        whereStrategy = FieldStrategy.ALWAYS,     // WHERE策略
        fill = FieldFill.INSERT,       // 自动填充策略
        select = true,                 // 是否查询
        jdbcType = JdbcType.VARCHAR,   // JDBC类型
        typeHandler = MyTypeHandler.class // 类型处理器
    )
    private String username;
}

字段策略(FieldStrategy)深度解析

mermaid

自动填充(FieldFill)策略

填充策略说明使用场景
DEFAULT默认策略不进行自动填充
INSERT插入时填充创建时间、创建人
UPDATE更新时填充更新时间、修改人
INSERT_UPDATE插入和更新时填充逻辑删除标记

高级用法示例

// 复杂字段配置
public class Product {
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    
    // 数据库字段映射
    @TableField("product_name")
    private String name;
    
    // 非数据库字段
    @TableField(exist = false)
    private String computedField;
    
    // 自动填充创建时间
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    
    // 自动填充更新时间
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    
    // 更新时使用数据库函数
    @TableField(update = "now()")
    private LocalDateTime lastModified;
    
    // 条件查询配置
    @TableField(condition = SqlCondition.LIKE)
    private String searchKey;
    
    // 字段更新策略
    @TableField(updateStrategy = FieldStrategy.NOT_EMPTY)
    private String description;
}

四、其他重要注解

@TableLogic:逻辑删除注解

public class User {
    @TableLogic
    private Integer deleted; // 0-未删除,1-已删除
    
    // 或者使用时间戳标记删除
    @TableLogic(delval = "now()")
    private LocalDateTime deleteTime;
}

@Version:乐观锁注解

public class Account {
    @Version
    private Integer version;
}

@EnumValue:枚举值映射

public enum Gender {
    @EnumValue("M")
    MALE,
    
    @EnumValue("F")
    FEMALE
}

public class User {
    private Gender gender;
}

五、注解组合使用最佳实践

完整实体类示例

@TableName(value = "sys_user", autoResultMap = true)
public class User implements Serializable {
    
    // 主键配置
    @TableId(type = IdType.ASSIGN_ID)
    private Long id;
    
    // 字段映射与策略
    @TableField(
        value = "user_name",
        condition = SqlCondition.LIKE,
        insertStrategy = FieldStrategy.NOT_EMPTY,
        updateStrategy = FieldStrategy.NOT_EMPTY
    )
    private String username;
    
    // 逻辑删除
    @TableLogic
    private Integer deleted;
    
    // 乐观锁
    @Version
    private Integer version;
    
    // 自动填充
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    
    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;
    
    // 非数据库字段
    @TableField(exist = false)
    private String temporaryData;
    
    // 枚举映射
    private Status status;
    
    // getter/setter省略
}

public enum Status {
    @EnumValue("1") ACTIVE,
    @EnumValue("0") INACTIVE
}

配置对比表

场景传统MyBatis方式MyBatis-Plus方式优势
表名映射XML中配置@TableName注解代码更简洁
主键配置selectKey标签@TableId注解配置更简单
字段映射resultMap配置@TableField注解减少XML配置
逻辑删除手动处理@TableLogic注解自动实现
乐观锁手动版本控制@Version注解自动处理

六、常见问题与解决方案

问题1:注解不生效怎么办?

解决方案:

  1. 检查是否配置了@MapperScan扫描注解
  2. 确认实体类是否被Spring管理
  3. 检查全局配置是否正确

问题2:字段策略冲突如何解决?

优先级规则:

  1. 注解配置 > 全局配置
  2. 显式配置 > 默认配置

问题3:复杂查询场景如何处理?

建议: 对于复杂查询,可以结合Lambda表达式和Wrapper使用,注解主要用于基础映射。

七、性能优化建议

  1. 选择性查询:使用@TableField(select = false)避免大字段查询
  2. 合理使用策略:根据业务场景选择合适的FieldStrategy
  3. 批量操作:结合MP的批量操作方法提升性能
  4. 缓存配置:合理使用二级缓存减少数据库压力

总结

MyBatis-Plus的注解体系极大地简化了数据库操作,通过本文的深度解析,你应该已经掌握了:

  • ✅ @TableId的各种主键生成策略及应用场景
  • ✅ @TableField的完整配置选项和策略控制
  • ✅ @TableName的表级配置技巧
  • ✅ 其他辅助注解的配合使用
  • ✅ 实际开发中的最佳实践和避坑指南

记住,合适的注解配置能够让代码更加简洁明了,同时提升开发效率和系统性能。在实际项目中,根据具体业务需求灵活选择和组合这些注解,将会让你的开发工作事半功倍。

下一步学习建议: 掌握MyBatis-Plus的Wrapper条件构造器和Service层封装,进一步提升开发效率。

【免费下载链接】mybatis-plus An powerful enhanced toolkit of MyBatis for simplify development 【免费下载链接】mybatis-plus 项目地址: https://gitcode.com/gh_mirrors/my/mybatis-plus

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值