MyBatis-Plus 实体类注解
MyBatis-Plus 实体类注解详解
MyBatis-Plus 是 MyBatis 的增强版,旨在简化开发者的 CRUD 操作。它通过丰富的特性和注解,简化了数据库与 Java 实体类之间的映射。MyBatis-Plus 提供了一系列的实体类注解,帮助开发者更轻松地映射数据库表、字段,并处理常见的数据操作需求。
1. MyBatis-Plus 实体类注解概览
MyBatis-Plus 提供了一系列注解,用于简化实体类与数据库表之间的映射。常用注解包括:
@TableName
:指定实体类对应的数据库表名。@TableId
:指定主键字段及其生成策略。@TableField
:指定非主键字段的映射信息。@TableLogic
:用于实现逻辑删除功能。@TableField(fill = ...)
:用于指定字段的自动填充策略。@Version
:用于实现乐观锁。
2. @TableName
注解
@TableName
用于指定实体类对应的数据库表名。如果实体类名与表名不一致,则需要使用该注解进行映射。
使用示例
import com.baomidou.mybatisplus.annotation.TableName;
@TableName("user")
public class User {
private Integer id;
private String username;
private String email;
}
在上面的示例中,实体类 User
映射到数据库表 user
。如果实体类名和数据库表名相同,则可以省略此注解。
常用属性
- value:指定表名。
- schema:指定数据库架构名称(可选)。
- autoResultMap:是否启用自动结果映射,默认
false
。
@TableName(value = "user", schema = "mydb", autoResultMap = true)
3. @TableId
注解
@TableId
用于指定表的主键列,并可以设置主键的生成策略。常见的生成策略有自动递增(AUTO
)、手动分配(INPUT
)等。
使用示例
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
private String username;
private String email;
}
在上面的示例中,id
字段被标记为主键,并且使用了自动递增策略。
常用属性
- value:指定主键字段名称。
- type:指定主键生成策略,常见的生成策略有:
IdType.AUTO
:数据库自动生成(通常是自增主键)。IdType.INPUT
:手动输入主键。IdType.ASSIGN_ID
:MyBatis-Plus 自动生成 ID(分布式 ID 算法)。IdType.UUID
:生成 UUID 作为主键。
@TableId(value = "user_id", type = IdType.ASSIGN_ID)
4. @TableField
注解
@TableField
用于标注非主键字段的映射。该注解可以配置数据库表中的列名、是否进行自动填充、是否是查询字段等。
使用示例
import com.baomidou.mybatisplus.annotation.TableField;
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField("user_name")
private String username;
@TableField(exist = false)
private String tempField; // 非数据库字段
}
在上面的示例中,username
字段对应数据库表中的 user_name
列,而 tempField
是一个实体类的临时字段,不会映射到数据库。
常用属性
- value:指定数据库列名。
- exist:是否是数据库表中的字段,默认
true
。如果设置为false
,表示该字段不参与数据库映射。 - fill:指定字段的自动填充策略,支持
INSERT
、UPDATE
、INSERT_UPDATE
。
@TableField(value = "created_at", fill = FieldFill.INSERT)
5. @TableLogic
注解
@TableLogic
用于实现逻辑删除功能。逻辑删除是在数据表中不真正删除记录,而是通过标记某个字段(如 is_deleted
)来表示数据是否被删除。
使用示例
import com.baomidou.mybatisplus.annotation.TableLogic;
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
private String username;
@TableLogic
private Integer isDeleted;
}
在上面的示例中,isDeleted
字段用于标记该记录是否被删除。当使用 MyBatis-Plus 提供的删除方法(如 deleteById
)时,实际上会更新 isDeleted
字段的值,而不是物理删除该记录。
默认行为
- 未删除:
isDeleted = 0
(默认为 0)。 - 已删除:
isDeleted = 1
(默认为 1)。
自定义逻辑删除值
如果逻辑删除标记的值不为 0 和 1,可以通过全局配置进行自定义。
mybatis-plus:
global-config:
db-config:
logic-not-delete-value: 0 # 未删除的值
logic-delete-value: 2 # 已删除的值
6. 自动填充字段 @TableField(fill = ...)
自动填充是指在插入或更新数据时,MyBatis-Plus 自动为某些字段赋值。常见的场景包括:创建时间、更新时间、操作人等。
使用示例
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import java.time.LocalDateTime;
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createdAt;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedAt;
}
在上面的示例中:
createdAt
字段会在插入时自动填充。updatedAt
字段会在插入和更新时自动填充。
自动填充实现步骤
- 定义实体类字段并加上
@TableField(fill = ...)
注解。 - 创建自动填充处理器:实现
MetaObjectHandler
接口,重写insertFill
和updateFill
方法。
import com.baomidou.mybatisplus.core.handlers.MetaObjectHandler;
import org.apache.ibatis.reflection.MetaObject;
import org.springframework.stereotype.Component;
import java.time.LocalDateTime;
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createdAt", LocalDateTime::now, LocalDateTime.class);
this.strictInsertFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updatedAt", LocalDateTime::now, LocalDateTime.class);
}
}
7. @Version
乐观锁注解
@Version
注解用于实现乐观锁。在并发环境下,乐观锁可以防止数据的“脏写”,通过版本号(version
)字段来保证数据的一致性。
使用示例
import com.baomidou.mybatisplus.annotation.Version;
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
private String username;
@Version
private Integer version; // 乐观锁版本号
}
当更新 User
表时,MyBatis-Plus 会检查 version
字段。如果版本号匹配,则进行更新,同时版本号自增;否则更新失败,防止数据冲突。
8. 综合示例
以下是一个使用了多种 MyBatis-Plus 注解的完整实体类示例:
import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;
@Data
@TableName("user")
public class User {
@TableId(type = IdType.AUTO)
private Integer id;
@TableField("user_name")
private String username;
private String email;
@TableLogic
private Integer isDeleted;
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createdAt;
@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updatedAt;
@Version
private Integer version;
}
username
字段映射到数据库的user_name
列。isDeleted
实现逻辑删除。createdAt
和updatedAt
实现自动填充。version
用于实现乐观锁。
9. 总结
MyBatis-Plus 提供的实体类注解极大简化了数据库字段与 Java 类之间的映射和管理,开发者可以通过简单的注解来完成复杂的数据库操作。
@TableName
:用于映射实体类与数据库表。@TableId
和@TableField
:用于映射主键和普通字段。@TableLogic
:实现逻辑删除。@Version
:用于乐观锁控制并发修改。- 自动填充:通过
@TableField(fill = ...)
配合自定义MetaObjectHandler
实现创建时间、更新时间等自动填充。
原文地址:https://blog.csdn.net/Flying_Fish_roe/article/details/142448696
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!