MyBatis - Plus(二)常见注解 + 常见配置

常见注解

MyBatis Plus通过扫描实体类,并基于反射获取实体类信息作为数据库表信息。

MyBatis Plus自动实现约定原理:

  • 类名驼峰下划线作为表名(例如:OrderDetail → 表名为order_detail)
  • 名为id的字段作为主键
  • 变量名驼峰转下划线为表的字段名(例如:属性uAddr → 表中字段名为u_addr)

若实体和表的对应关系不符合mp的约定,可使用mp的一些常用注解解决问题。

MyBatis Plus常用注解:

  • **@TableName:**用来指定表名
  • **@TableId:**用来指定表中的主键字段信息
  • **@TableField:**用来指定表中的普通字段信息

前期准备

  • 添加一个实体类:User
    • 添加属性:uid、name、age、sex、email、uAddr、isDeleted
  • 数据库中添加一个表:t_user
    • 添加字段:uid、username、sex、age、email、u_addr、is_deleted

@TableName

该注解用于指定实体类对应的数据库表名。

当实体类与数据库表名不一致,或实体类不是数据库表名的驼峰写法时,需要该注解明确指定表名。

在前期准备中,添加的实体类名为User,而表名为t_user,不符合mp的约定。

解决方案

方案一:在application.yml中配置操作表的默认前缀

XML 复制代码
mybatis-plus:
  global-config:
    db-config:
      ##################全局配置MyBatis-Plus操作表的默认前缀##################
      table-prefix: t_

工作原理:

  • 自动添加前缀: MyBatis-Plus会自动为所有实体类对应的表名添加 t_ 前缀
  • 表名映射规则: 实体类名 → 下划线命名 → 添加前缀
    • 例如:
      User类 → 表名为t_user
      OrderDetail → 表名为t_order_detail

缺点: 这是全局配置,会对所有实体类生效,所有实体类默认都会使用这个前缀。

若其中某个实体类对应的表没有这个前缀,需要通过 @TableName 注解显式指定表名或设置 keepGlobalPrefix = false。

java 复制代码
// 显式指定表名,不自动添加前缀
@TableName("user")
public class User {
    // ...
}

// 不使用全局前缀
@TableName(value = "user", keepGlobalPrefix = false)
public class User {
    // ...
}

方案二:在实体类上使用@TableName注解

java 复制代码
// 使用注解标识实体类对应的数据库表
// @TableName(value = "t_user")
// 或(value可省略)
@TableName("t_user") // ⭐⭐⭐
public class User {
    // ...
}

【相关属性】

  • value: 指定表名

    • **类型:**String
    • 默认值:""
    • 指定实体类对应的数据库表名。如果实体类名与表名不一致,使用这个属性来指定正确的表名。
    java 复制代码
    @TableName(value = "t_user")
    public class User {
        // ...
    }
  • schema: 指定数据库schema

    • **类型:**String
    • 默认值:""
    • 指定数据库的 Schema 名称。通常情况下,如果你的数据库没有使用 Schema 来组织表,这个属性可以不填写。
    java 复制代码
    @TableName(value = "user", schema = "business")  // business.user 表
    public class User {
        // ...
    }
  • keepGlobalPrefix: 是否保持全局表前缀

    • **类型:**boolean
    • 默认值:""
    • 当全局配置了 tablePrefix 时,这个属性决定是否保持使用全局的表前缀。如果设置为 true,即使注解中指定了表名,也会自动加上全局的表前缀。
    java 复制代码
    # application.yml
    mybatis-plus:
      global-config:
        db-config:
          table-prefix: t_
    
    @TableName(value = "user", keepGlobalPrefix = true)  // 最终表名: t_user
    public class User {
        // ...
    }
    
    @TableName(value = "user", keepGlobalPrefix = false) // 最终表名: user(忽略全局前缀)
    public class User {
        // ...
    }
  • resultMap: 查询结果映射到实体类对象中

    • **类型:**String
    • 默认值:""
    • 指定在 XML 中定义的 ResultMap 的 ID,用于将查询结果映射到特定类型的实体类对象。
  • autoResultMap: 自动生成结果映射

    • **类型:**boolean
    • 默认值:""
    • 是否自动构建 resultMap。如果已经设置了 resultMap,这个属性不会生效。

      注:截图内容来自MyBatis Plus官网。
  • excludeProperty: 排除属性(不参与sql)

    • **类型:**String[]
    • 默认值:{}
    • 指定在映射时需要排除的属性名。这些属性将不会被包含在生成的 SQL 语句中。
    java 复制代码
    @TableName(value = "user", excludeProperty = {"password", "salt"})
    public class User {
        private Long id;
        private String username;
        private String password;  // 不会出现在SQL中
        private String salt;      // 不会出现在SQL中
        private String email;
    }

使用建议

  1. **一致性原则:**若大多数表都有前缀,使用全局配置。
  2. **混合场景:**若部分表有前缀,部分没有,可以不使用全局配置,使用@TableName注解。

优先级

@TableName注解指定 > 全局配置table-prefix > 默认命名策略(下划线转换)


@TableId

该注解用于标记实体类中的主键字段。如果主键字段名为id,可以省略该注解。

在前期准备中,实体类和表中的主键均为 uid,不符合mp的约定。

解决方案

方案一:在application.yml中配置主键策略

XML 复制代码
mybatis-plus:
  global-config:
    db-config:
      ##################配置MyBatis Plus的主键策略##################
      id-type: auto

✅方案二:在实体类上使用@TableId注解

情况一:实体类和数据库表中主键均不是id的问题

java 复制代码
public class User {
    @TableId
    private Long uid;
    // ...
}

情况二:实体类主键是id,数据库表中的主键是uid的问题

java 复制代码
public class User {
    @TableId(value="uid")
    private Long id;
    // ...
}

相关属性

  • value:

    • **类型:**String
    • 默认值:""
    • 指定数据库表的主键字段名。如果不设置,MyBatis-Plus 将使用实体类中的字段名作为数据库表的主键字段名。
  • type:

    • **类型:**Enum
    • **默认值:**IdType.NONE
    • 指定主键的生成策略。
    • idType枚举类型定义:
      • **IdType.AUTO:**使用数据库自增 ID 作为主键(注意:确保数据库设置了id自增,否则无效)。
      • **IdType.NONE:**无特定生成策略,如果全局配置中有 IdType 相关的配置,则会跟随全局配置。
      • **IdType.INPUT:**在插入数据前,由用户自行设置主键值。
      • IdType.ASSIGN_ID: 自动分配 ID,适用于 LongIntegerString 类型的主键。默认使用雪花算法 通过 IdentifierGeneratornextId 实现。
    java 复制代码
    @TableId(value = "uid",type = IdType.AUTO)

@TableField

该注解用于标记实体类中的非主键 字段,它告诉 MyBatis-Plus 如何映射实体类字段到数据库表字段。

如果实体类字段名遵循驼峰命名规则,并且与数据库表字段名一致,则可以省略该注解。

在前期准备中,可以看出实体类中是name属性,数据库表中是username字段,不符合mp的约定。

使用场景

  • 实体类中属性名与数据库字段名不一致(例如:实体类中是name,数据库表中是username)
  • 实体类中属性名以is开头,且是布尔值(例如:实体类中是isMarried,数据库表中是is_married)
  • 实体类中属性名与数据库关键字冲突(例如:order)
  • 实体类中属性不是数据库字段(使用exist属性:exist=false,标记该属性不是数据库字段)

解决方案在实体类上使用@TableField注解

java 复制代码
@TableName(value = "t_user")
public class User {
    @TableId(value = "uid",type = IdType.AUTO)
    private Long uid;

    @TableField("username")
    private String name;

    @TableField("is_married")
    private Boolean isMarried;

    @TableField("`order`")
    private Integer order;

    // ...
}

【相关属性】

  • value: 指定表名

    • **类型:**String
    • 默认值:""
    • 指定数据库中的字段名。如果实体类字段名与数据库字段名不同,使用这个属性来指定正确的数据库字段名。
  • exist:

    • **类型:**boolean
    • **默认值:**true
    • 指示这个字段是否存在于数据库表中。如果设置为 false,MyBatis-Plus 在生成 SQL 时会忽略这个字段。
  • condition:

    • **类型:**String
    • 默认值:""
    • 在执行实体查询(EntityQuery)时,指定字段的条件表达式。这允许自定义字段在 WHERE 子句中的比较方式。如果该项有值则按设置的值为准,无值则默认为全局的 %s=#{%s} 为准。
    java 复制代码
    @TableName("t_user")
    public class User {
        @TableId(value = "uid",type = IdType.AUTO)
        private Long uid;
    
        @TableField("username")
        private String name;
    
        @TableField(condition = "%s > #{%s}") // 自定义 age 字段的条件表达式
        private Integer age;
    
        // ...
    }
    
    // 使用 EntityQuery 构建查询
    public List<User> findUserAgeOver18() {
        // 创建 User 实例,用于设置查询条件
        User queryEntity = new User();
        queryEntity.setAge(18); // 设置 age 字段的值
    
        // 创建 QueryWrapper 实例,并传递 User 实例
        QueryWrapper<User> queryWrapper = new QueryWrapper<>(queryEntity);
    
        // 执行查询
        List<User> userList = userMapper.selectList(queryWrapper);
    
        return userList;
    }
  • 等等


@TableLogic

该注解用于标记实体类中的字段作为逻辑删除字段。逻辑删除是一种数据管理策略,它不是真正地从数据库中删除记录,而是在记录中标记该记录为已删除状态。通过使用@TableLogic注解,MyBatis-Plus 可以在查询、更新和删除操作中自动处理逻辑删除字段的值。

**默认值:**0

java 复制代码
@TableName(value = "t_user")
public class User {
    @TableId(value = "uid",type = IdType.AUTO)
    private Long uid;
    @TableField("username")
    private String name;
    private Integer age;
    private SexEnum sex;
    private String email;
    private String uAddr;
    @TableLogic
    private Integer isDeleted;
}

当执行查询操作时,MyBatis-Plus 会自动过滤掉标记为逻辑删除的记录,只返回未删除的记录。在执行更新操作时,如果更新操作会导致逻辑删除字段的值变为逻辑删除值,MyBatis-Plus 会自动将该记录标记为已删除。在执行删除操作时,MyBatis-Plus 会自动将逻辑删除字段的值更新为逻辑删除值,而不是物理删除记录。


@Version

该注解用于标记实体类中的字段作为乐观锁 版本号字段。乐观锁是一种并发控制机制,它假设多个事务可以同时进行而不会互相干扰,只在提交事务时检查是否有冲突。通过在实体类中使用@Version注解,MyBatis-Plus 会在更新操作时自动检查版本号,确保在更新过程中数据没有被其他事务修改。

java 复制代码
@TableName(value = "t_user")
public class User {
    @TableId(value = "uid",type = IdType.AUTO)
    private Long uid;
    @TableField("username")
    private String name;
    private Integer age;
    private SexEnum sex;
    private String email;
    private String uAddr;
    @TableLogic
    private Integer isDeleted;
    @Version // 标记为乐观锁版本号字段
    private Integer version;
}

@EnumValue

该注解用于标记枚举类中的字段,指定在数据库中存储的枚举值。当实体类中的某个字段是枚举类型时,使用@EnumValue注解可以告诉MyBatis-Plus在数据库中存储枚举值的哪个属性。

java 复制代码
@TableName(value = "t_user")
public class User {
    @TableId(value = "uid",type = IdType.AUTO)
    private Long uid;
    @TableField("username")
    private String name;
    private Integer age;
    private SexEnum sex; // 假设 sex是一个枚举类型
    private String email;
    private String uAddr;
    @TableLogic
    private Integer isDeleted;
}

@Getter
public enum SexEnum {
    MALE(1, "男"),
    FEMALE(2, "女");

    @EnumValue
    private Integer sex;
    private String sexName;

    SexEnum(Integer sex, String sexName) {
        this.sex = sex;
        this.sexName = sexName;
    }
}

数据库中存储的是sex值。

还有其它的注解,可以进入MyBatis Plus官网查看。


常见配置

MyBatis-Plus 提供了丰富的配置选项,以满足不同用户的需求。这些配置中,一部分继承自 MyBatis 原生支持的配置,另一部分则是 MyBatis-Plus 特有的扩展配置。

开启驼峰配置

XML 复制代码
mybatis-plus:
  configuration:
    # MyBatis 配置
    map-underscore-to-camel-case: true

指定MyBatis配置文件的位置

如果有单独的 MyBatis 配置文件,应将其路径配置到 configLocation 。

XML 复制代码
mybatis-plus:
  config-location: classpath:/mybatis-config.xml

指定MyBatis Mapper对应的XML文件位置

如果在 Mapper 中有自定义方法,需要配置此项。

XML 复制代码
mybatis-plus:
  mapper-locations: classpath:/mapper/**.xml

指定MyBatis别名报扫描

XML 复制代码
mybatis-plus:
  type-aliases-package: com.qcby.springBootMybatisPlus.model

配置枚举扫描包

注意:从3.5.2版本开始,该配置无效,无需配置即可使用。

XML 复制代码
mybatis-plus:
  type-enums-package: com.qcby.springBootMybatisPlus.enums

配置全局策略

XML 复制代码
mybatis-plus:
  global-config:
    db-config:
      table-prefix: t_
      id-type: auto

等等,还有很多配置,需要时,可进入MyBatis Plus官网查看。

相关推荐
PD我是你的真爱粉2 小时前
MySQL基础-DQL语句与多表查询
数据库·mysql
C#程序员一枚2 小时前
SqlServer如何创建全文索引
数据库·sqlserver
DBA小马哥2 小时前
时序数据库迁移实践指南:面向业务连续性的技术演进路径
数据库·时序数据库·dba
生命因何探索2 小时前
Redis-持久化
数据库·redis·缓存
bepeater12342 小时前
使用Kubernetes部署Spring Boot项目
spring boot·容器·kubernetes
爱敲代码的小鱼3 小时前
web后端开发SpringBootWeb的入门:
java·spring boot·spring
yjb.gz3 小时前
Shell实现数据库巡检
数据库
树码小子3 小时前
Mybatis(8)#{}和${}的区别,排序,模糊查询
mybatis
那我掉的头发算什么3 小时前
【SpringBoot】统一功能处理详解
java·spring boot·后端·spring