常见注解
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; }
【使用建议】
- **一致性原则:**若大多数表都有前缀,使用全局配置。
- **混合场景:**若部分表有前缀,部分没有,可以不使用全局配置,使用@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,适用于Long、Integer、String类型的主键。默认使用雪花算法 通过IdentifierGenerator的nextId实现。
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官网查看。