版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址:https://blog.csdn.net/sun8112133/article/details/106917113
文章目錄
本篇博客主要講解 MyBatis Plus 框架中常用註解的使用。
一、@TableName
此註解是用來 映射數據庫的表名。當表名與實體類名不相同時,需要加此註解來進行映射;相同時則不需要加此註解。
@Data
@TableName("t_user")
// 數據表的表名叫 t_user,要與實體類 User 進行映射
public class User {
private Integer id;
private String name;
private Integer age;
}
二、@TableId
此註解是用來 映射數據庫的主鍵。還可以設置該主鍵的生成策略。
1、常用屬性
- value: 映射主鍵字段名。當屬性名和字段名相同時不需要此屬性;
- type: 設置主鍵類型,也就是主鍵的生成策略。
2、type 屬性值
- AUTO(0): 數據庫自增。不管開發者賦不賦值,都會採用自增的方式;
- NONE(1): 默認值。它會隨機產生一個隨機數,這個產生方式使用雪花算法來實現;
- INPUT(2): 需要開發者手動賦值。若開發者沒有賦值(null),數據庫默認會以自增的方式給主鍵賦值;若開發者手動賦值,則會存入該值;
- ASSIGN_ID(3): MP 會自動產生主鍵值。這個產生方式採用雪花算法來實現,主鍵類型可以是 Long、Integer、String,使用效果類似 NONE;
- ASSIGN_UUID(4): MP 會自動產生一個 UUID 值。主鍵類型必須是 String 類型。
3、小例子
@Data
@TableName("t_user")
public class User {
@TableId(type=IdType.ASSIGN_UUID)
private String id; // 會自動產生一個 UUID 值
private String name;
private Integer age;
}
三、@TableField
此註解是用來 映射數據庫的非主鍵字段。
1、常用屬性
- value: 映射非主鍵字段名。當屬性名和字段名相同時不需要此屬性;
- exist: 表示該屬性是否爲數據庫字段。它有兩個值:true 爲是;false 爲不是,就不會從數據庫中查詢此字段。這個屬性一般在 VO 類或 DTO 類中用的比較多。如果實體類中的成員變量在數據庫中沒有對應的字段,則可以使用;
- select: 表示該屬性在查詢的時候是否從數據庫中查詢該字段;
- fill: 表示是否自動填充,將對象存入數據庫的時候,由 MyBatis Plus 自動給某些字段賦值,比如:create_time、update_time 這一類字段就會用到此屬性。
2、小例子(創建時間與更新時間)
1)添加字段
給數據表添加
create_time
、update_time
字段。
create table `t_user` (
`id` int(11) not null auto_increment,
`name` varchar(255),
`age` int(11),
`create_time` datetime, -- 創建時間
`update_time` datetime, -- 更新時間
primary key (`id`)
);
2)實體類中添加成員變量
給實體類中添加
createTime
和updateTime
成員變量,並且添加@TableField
註解,設置動作屬性(fill)。FieldFill 這個類是描述它的一個動作,在什麼時期去插入的。
@Data
@TableName("t_user")
public class User {
@TableId(type=IdType.ASSIGN_UUID)
private String id; // 會自動產生一個 UUID 值
private String name;
private Integer age;
// MyBatis Plus 會自動對駝峯命名和下劃線命名做一個映射
// 當添加的時候去插入
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 當添加或更新的時候去插入
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
}
3)創建自動填充的處理器
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
// 當插入的時候填充數據
// metaObject 是當前傳來的對象
@Override
public void insertFill(MetaObject metaObject) {
this.setFieldValByName("createTime", new Date(), metaObject);
this.setFieldValByName("updateTime", new Date(), metaObject);
}
// 當更新的時候填充數據
@Override
public void updateFill(MetaObject metaObject) {
this.setFieldValByName("updateTime", new Date(), metaObject);
}
}
四、@Version
該註解是用來 標記樂觀鎖 的,所謂 樂觀鎖 就是來保證數據安全性的。它是通過
version
字段來保證數據的安全性,當修改數據的時候,會以version
作爲條件,當條件成立的時候纔會修改成功。這是我給大家舉個小例子,幫助大家快速瞭解這個註解:
1、添加字段
給數據表添加
version
字段,並設置默認值爲1
。
create table `t_user` (
`id` int(11) not null auto_increment,
`name` varchar(255),
`age` int(11),
`create_time` datetime, -- 創建時間
`update_time` datetime, -- 更新時間
`version` int(11) default 1,
primary key (`id`)
);
2、實體類添加成員變量
給實體類中添加
version
成員變量,並且添加@Version
註解。
@Data
@TableName("t_user")
public class User {
@TableId(type=IdType.ASSIGN_UUID)
private String id; // 會自動產生一個 UUID 值
private String name;
private Integer age;
// MyBatis Plus 會自動對駝峯命名和下劃線命名做一個映射
// 當添加的時候去插入
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 當添加或更新的時候去插入
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@Version
private Integer version;
}
3、註冊配置類
@Configuration
public class MyBatisPlusConfig {
// 配置 啓用樂觀鎖功能
@Bean
public OptimisticLockerInterceptor optimisticLockerInterceptor() {
return new OptimisticLockerInterceptor();
}
}
五、@EnumValue
此註解是用來 映射實體類中的枚舉類型。大家可能經常會遇到這樣的情況,比如性別字段,在數據庫中存儲的時間一般不會存儲
男
、女
這樣的數據,有可能會存儲0
或1
這樣的數字代碼,但是在頁面中需要手動進行處理。我們可以通過該註解很方便的映射數據庫中存儲的數字代碼,在頁面中就直接顯示對應的漢字了。在這裏我就以性別爲例,舉一個簡單的小例子,這裏提供兩種方式實現這個小例子:
- 枚舉映射;
- 接口實現。
1、枚舉映射
1)創建枚舉類型
通過枚舉類(
@EnumValue
)註解,將數據庫字段映射成實體類的枚舉類型成員變量。
public enum SexEnum {
MEN(1, "男"),
WOMEN(0, "女");
@EnumValue
private Integer code; // 映射數據庫的中字段
private String msg;
private SexEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
}
2)添加字段
給數據表添加
sex
字段。
create table `t_user` (
`id` int(11) not null auto_increment,
`name` varchar(255),
`age` int(11),
`create_time` datetime, -- 創建時間
`update_time` datetime, -- 更新時間
`version` int(11) default 1,
`sex` int(11),
primary key (`id`)
);
3)實體類中添加成員變量
@Data
@TableName("t_user")
public class User {
@TableId(type=IdType.ASSIGN_UUID)
private String id; // 會自動產生一個 UUID 值
private String name;
private Integer age;
// MyBatis Plus 會自動對駝峯命名和下劃線命名做一個映射
// 當添加的時候去插入
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 當添加或更新的時候去插入
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@Version
private Integer version;
private SexEnum sex;
}
4)配置枚舉包
在
application.yml
配置文件中設置掃描枚舉類所在的包。
mybatis-plus:
type-enums-package:
com.demo.enums
2、接口實現
1)創建枚舉類型
public enum SexEnum implements IEnum<Integer> {
MEN(1, "男"),
WOMEN(0, "女");
private Integer code;
private String msg;
private SexEnum(Integer code, String msg) {
this.code = code;
this.msg = msg;
}
@Override
public Integer getValue() {
return this.code;
}
}
2)配置枚舉包
在
application.yml
配置文件中設置掃描枚舉類所在的包。
mybatis-plus:
type-enums-package:
com.demo.enums
六、@TableLogic
此註解是用來 映射邏輯刪除字段。
注意: 如果不加
@TableLogic
註解,MP 真的會將那條數據刪除哦~
1、添加字段
給數據表添加
deleted
字段,並設置默認值爲0
。
create table `t_user` (
`id` int(11) not null auto_increment,
`name` varchar(255),
`age` int(11),
`create_time` datetime, -- 創建時間
`update_time` datetime, -- 更新時間
`version` int(11) default 1,
`sex` int(11),
`deleted` int(11) default 0,
primary key (`id`)
);
2、實體類中添加成員變量
@Data
@TableName("t_user")
public class User {
@TableId(type=IdType.ASSIGN_UUID)
private String id; // 會自動產生一個 UUID 值
private String name;
private Integer age;
// MyBatis Plus 會自動對駝峯命名和下劃線做一個映射
// 當添加的時候去插入
@TableField(fill = FieldFill.INSERT)
private Date createTime;
// 當添加或更新的時候去插入
@TableField(fill = FieldFill.INSERT_UPDATE)
private Date updateTime;
@Version
private Integer version;
private SexEnum sex;
@TableLogic
private Integer deleted; // 與數據庫中的 deleted 字段進行映射
}
3、配置邏輯刪除
mybatis-plus:
global-config:
db-config: # 配置 0 是未刪除,1 是已刪除
logic-not-delete-value: 0
logic-delete-value: 1