目录

MyBatis-Plus-注解大全

MyBatis-Plus 注解大全


MyBatis-Plus 是基于 MyBatis 的增强工具,通过注解简化了单表 CRUD 操作和复杂查询的配置。以下是常用注解的分类及详细说明:


  • 作用 :标识实体类对应的数据库表名(当类名与表名不一致时使用)。

  • 属性

    • value :数据库表名(默认空,使用类名驼峰转下划线形式)。
    • schema :数据库 schema(可选)。
  • 示例

    @TableName("sys_user")
    public class User {
        // ...
    }
  • 作用 :标识实体类的主键字段。

  • 属性

    • value :数据库主键字段名(默认空,使用字段名驼峰转下划线形式)。
    • type :主键生成策略(默认为 IdType.NONE ),可选值:
      • AUTO :数据库自增。
      • NONE :无策略(手动输入)。
      • INPUT :用户输入。
      • ASSIGN_ID :雪花算法生成 Long 类型 ID。
      • ASSIGN_UUID :生成 UUID 字符串。
  • 示例

    public class User {
        @TableId(value = "id", type = IdType.ASSIGN_ID)
        private Long userId;
    }
  • 作用 :标识非主键字段与数据库列的映射关系。

  • 属性

    • value :数据库字段名(默认空,使用字段名驼峰转下划线形式)。
    • exist :是否为数据库表字段(默认 true ,若为 false 表示不参与 SQL 操作)。
    • fill :字段自动填充策略(如插入或更新时自动填充值),可选值:
      • FieldFill.DEFAULT :不处理。
      • FieldFill.INSERT :插入时填充。
      • FieldFill.UPDATE :更新时填充。
      • FieldFill.INSERT_UPDATE :插入和更新时填充。
    • select :是否参与查询(默认 true )。
  • 示例

    public class User {
        @TableField(value = "create_time", fill = FieldFill.INSERT)
        private LocalDateTime createTime;
    
        @TableField(exist = false)
        private String remark; // 非数据库字段
    }

  • 作用 :在 Mapper 接口方法中定义参数别名,用于 XML 或注解中的 SQL 绑定(非 MyBatis-Plus 特有,但常用)。

  • 示例

    List<User> selectByName(@Param("name") String name);

  • 作用 :标识逻辑删除字段(标记记录是否被删除)。

  • 属性

    • value :未删除时的值(默认 0 )。
    • delval :删除后的值(默认 1 )。
  • 示例

    @TableLogic(value = "0", delval = "1")
    private Integer isDeleted;

  • 作用 :标识乐观锁版本号字段(用于并发控制)。

  • 示例

    @Version
    private Integer version;
  • 作用 :标识枚举类中与数据库存储值对应的字段。

  • 示例

    public enum GenderEnum {
        MALE(1, "男"),
        FEMALE(2, "女");
    
        @EnumValue
        private final Integer code;
        private final String desc;
    }
  • 作用 :指定主键序列名称(适用于 Oracle、PostgreSQL 等数据库的序列主键)。

  • 属性

    • value :序列名。
    • clazz :主键类型(如 Long.class )。
  • 示例

    @KeySequence(value = "SEQ_USER", clazz = Long.class)
    public class User {
        // ...
    }
  • 作用 :忽略特定拦截器(如多租户插件、动态表名插件等)。

  • 属性

    • tenantLine :是否忽略多租户拦截(默认 "false" )。
    • dynamicTableName :是否忽略动态表名拦截。
  • 示例

    @InterceptorIgnore(tenantLine = "true")
    List<User> selectAll();

通过 @TableField(fill = FieldFill.xxx) 结合 MetaObjectHandler 实现字段自动填充:

  1. 定义处理器

    @Component
    public class MyMetaObjectHandler implements MetaObjectHandler {
        @Override
        public void insertFill(MetaObject metaObject) {
            this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
        }
    
        @Override
        public void updateFill(MetaObject metaObject) {
            this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
        }
    }
  2. 实体类字段注解

    public class User {
        @TableField(fill = FieldFill.INSERT)
        private LocalDateTime createTime;
    
        @TableField(fill = FieldFill.UPDATE)
        private LocalDateTime updateTime;
    }

  1. 表名或字段名驼峰转下划线

    MyBatis-Plus 默认开启驼峰转下划线映射(如 userNameuser_name )。若需关闭,配置:

    mybatis-plus:
      configuration:
        map-underscore-to-camel-case: false
  2. 逻辑删除全局配置

    application.yml 中配置逻辑删除的默认值:

    mybatis-plus:
      global-config:
        db-config:
          logic-delete-field: isDeleted  # 逻辑删除字段名
          logic-delete-value: 1         # 删除后的值
          logic-not-delete-value: 0      # 未删除时的值

通过掌握以上注解,开发者可以高效利用 MyBatis-Plus 简化数据库操作。更多细节可参考 。