MyBatis Plus 对数据表常用注解
1. @TableName
(1) 解释说明
@TableName 注解用于 指定实体类对应的数据库表名,当实体类的名称与数据库表名不一致时,可以用此注解进行映射。此外,@TableName 还支持设置一些其他的配置选项,比如全局表名前缀、后缀的处理。
- value:指定数据库表名。如果没有设置此注解,则会默认映射到与类名相同的表名。
- schema:指定数据库的 schema,适用于多 schema 的情况。
(2) 应用示例
假设有一个 User 实体类对应数据库中的 user_info 表:
import com.baomidou.mybatisplus.annotation.TableName;@TableName("user_info")
public class User {private Long id;private String name;private Integer age;
}
如果不使用 @TableName,MyBatis-Plus 默认认为表名与类名一致,即表名为 user。此时需要用 @TableName("user_info") 来指定正确的表名。
(3) 使用场景
- 表名与实体类名不一致:例如实体类名 User 对应表名 user_info。
- 需要动态修改表名的场景:比如多租户情况下,不同租户的表前缀不同,使用 @TableName 可以灵活控制。
(4) 注意事项
- 大小写问题:数据库表名的大小写敏感性因数据库类型而异(例如 MySQL 默认不区分大小写,而 PostgreSQL 区分)。因此,在使用 @TableName 时,确保表名与数据库一致。
- 表前缀/后缀:在项目中可能有统一的前缀或后缀要求。使用 @TableName 可以覆盖全局配置中的前缀后缀。
2. @TableId
(1) 解释说明
@TableId 注解用于标识实体类中的主键字段,并且可以指定主键的生成策略。主键策略有多个选项:
- IdType.AUTO:自增类型,通常用于数据库支持自动增长的字段(如 MySQL 的 AUTO_INCREMENT)。
- IdType.ASSIGN_ID:全局唯一 ID,使用 MyBatis-Plus 提供的雪花算法生成主键 ID。
- IdType.INPUT:由用户输入的 ID。
- IdType.NONE:不使用 MyBatis-Plus 的主键生成策略。
(2) 应用示例
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;public class User {@TableId(value = "id", type = IdType.ASSIGN_ID)private Long id; // 使用雪花算法生成主键private String name;private Integer age;
}
(3) 使用场景
- 数据库支持自增主键:如 MySQL 中的 AUTO_INCREMENT。
- 分布式系统中主键生成:如使用雪花算法(ASSIGN_ID),确保生成全局唯一 ID。
- 手动输入主键值:当需要由应用层或用户控制主键生成时,使用 INPUT。
(4) 注意事项
- 自增主键类型:若数据库表的主键使用了自增策略,@TableId(type = IdType.AUTO) 是最常用的方式。
- 雪花 ID:ASSIGN_ID 生成的 ID 可以保证全局唯一,但生成的值是一个长整型 ID,需考虑前端显示时的精度问题(JavaScript 的整数精度限制)。
- 主键名称与字段名称不一致:如果数据库字段名不为 id,必须使用 @TableId(value = "column_name") 显式指定。
3. @TableField
(1) 解释说明
@TableField 注解用于标识实体类中的非主键字段与数据库表的对应关系。可以设置字段映射关系、参与 SQL 操作的方式以及是否需要自动填充等。
- value:指定数据库表的字段名。如果字段名与类属性名一致,可以省略。
- exist:设置该字段是否为数据库表中的字段。false 表示该字段不映射到数据库表。
- select:设置该字段是否在查询时被查询到,false 表示不查询。
- fill:自动填充策略,控制插入或更新时字段的自动填充。
(2) 应用示例
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.FieldFill;public class User {@TableIdprivate Long id;@TableField("user_name")private String name; // 映射到数据库的 user_name 字段@TableField(exist = false)private String tempData; // 该字段不与数据库映射@TableField(fill = FieldFill.INSERT)private LocalDateTime createTime; // 在插入时自动填充
}
(3) 使用场景
- 字段名与数据库列名不一致:例如 Java 字段为 userName,而数据库字段为 user_name。
- 不需要持久化的字段:例如 transient 字段,用 @TableField(exist = false) 标记不映射到数据库。
- 自动填充:对于如创建时间、更新时间等字段,使用 @TableField(fill = FieldFill.INSERT) 配合 MetaObjectHandler 自动填充。
(4) 注意事项
- exist = false 的字段不会出现在 SQL 中,因此不参与任何数据库操作。
- 自动填充:需要实现 MetaObjectHandler 接口并注册到 MyBatis-Plus 配置中。
- 性能:在大数据量情况下,尽量避免使用 select=false,因为会导致全表扫描。
4. @TableLogic
(1) 解释说明
@TableLogic 注解用于 实现逻辑删除。通过将数据库中的某个字段作为标记来表示记录是否被删除,而不是真正删除数据。这对于软删除(例如删除用户但保留其历史数据)非常有用。
- value:表示未删除的标记值(默认为 0)。
- delval:表示删除的标记值(默认为 1)。
(2) 应用示例
import com.baomidou.mybatisplus.annotation.TableLogic;public class User {@TableIdprivate Long id;private String name;@TableLogic(value = "0", delval = "1")private Integer deleted; // 0 表示未删除,1 表示已删除
}
(3) 使用场景
- 软删除:例如,删除用户或订单时不需要物理删除记录,而是通过设置某个字段值为删除标记来进行“删除”。
- 审计功能:有时出于审计的需求,需要保留历史数据以便查询。
(4) 注意事项
- deleted 字段必须存在,且需要明确其作用(例如,0 表示未删除,1 表示已删除)。
- 查询时过滤已删除的数据:MyBatis-Plus 会自动为逻辑删除字段添加查询条件,防止查询到已删除的数据。但如果需要查询已删除的数据,需手动指定 Wrapper 进行查询。
- 自动处理:MyBatis-Plus 会在执行 delete 操作时自动处理逻辑删除。若需要真正删除数据,可以调用 deleteById 等方法。