【MyBatisPlus筆記整理二】常用註解

版權聲明:本文爲 小異常 原創文章,非商用自由轉載-保持署名-註明出處,謝謝!
本文網址: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_timeupdate_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)實體類中添加成員變量

給實體類中添加 createTimeupdateTime 成員變量,並且添加 @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

此註解是用來 映射實體類中的枚舉類型。大家可能經常會遇到這樣的情況,比如性別字段,在數據庫中存儲的時間一般不會存儲 這樣的數據,有可能會存儲 01 這樣的數字代碼,但是在頁面中需要手動進行處理。我們可以通過該註解很方便的映射數據庫中存儲的數字代碼,在頁面中就直接顯示對應的漢字了。

在這裏我就以性別爲例,舉一個簡單的小例子,這裏提供兩種方式實現這個小例子:

  1. 枚舉映射;
  2. 接口實現。

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


博客中若有不恰當的地方,請您一定要告訴我。前路崎嶇,望我們可以互相幫助,並肩前行!



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章