MyBatis-Plus?實體類注解的實現(xiàn)示例
MyBatis-Plus 是 MyBatis 的增強版,旨在簡化開發(fā)者的 CRUD 操作。它通過豐富的特性和注解,簡化了數(shù)據(jù)庫與 Java 實體類之間的映射。MyBatis-Plus 提供了一系列的實體類注解,幫助開發(fā)者更輕松地映射數(shù)據(jù)庫表、字段,并處理常見的數(shù)據(jù)操作需求。
1. MyBatis-Plus 實體類注解概覽
MyBatis-Plus 提供了一系列注解,用于簡化實體類與數(shù)據(jù)庫表之間的映射。常用注解包括:
@TableName
:指定實體類對應(yīng)的數(shù)據(jù)庫表名。@TableId
:指定主鍵字段及其生成策略。@TableField
:指定非主鍵字段的映射信息。@TableLogic
:用于實現(xiàn)邏輯刪除功能。@TableField(fill = ...)
:用于指定字段的自動填充策略。@Version
:用于實現(xiàn)樂觀鎖。
2. @TableName 注解
@TableName
用于指定實體類對應(yīng)的數(shù)據(jù)庫表名。如果實體類名與表名不一致,則需要使用該注解進行映射。
使用示例
import com.baomidou.mybatisplus.annotation.TableName; @TableName("user") public class User { private Integer id; private String username; private String email; }
在上面的示例中,實體類 User
映射到數(shù)據(jù)庫表 user
。如果實體類名和數(shù)據(jù)庫表名相同,則可以省略此注解。
常用屬性
- value:指定表名。
- schema:指定數(shù)據(jù)庫架構(gòu)名稱(可選)。
- autoResultMap:是否啟用自動結(jié)果映射,默認(rèn)
false
。
@TableName(value = "user", schema = "mydb", autoResultMap = true)
3. @TableId 注解
@TableId
用于指定表的主鍵列,并可以設(shè)置主鍵的生成策略。常見的生成策略有自動遞增(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
字段被標(biāo)記為主鍵,并且使用了自動遞增策略。
常用屬性
- value:指定主鍵字段名稱。
- type:指定主鍵生成策略,常見的生成策略有:
IdType.AUTO
:數(shù)據(jù)庫自動生成(通常是自增主鍵)。IdType.INPUT
:手動輸入主鍵。IdType.ASSIGN_ID
:MyBatis-Plus 自動生成 ID(分布式 ID 算法)。IdType.UUID
:生成 UUID 作為主鍵。
@TableId(value = "user_id", type = IdType.ASSIGN_ID)
4. @TableField 注解
@TableField
用于標(biāo)注非主鍵字段的映射。該注解可以配置數(shù)據(jù)庫表中的列名、是否進行自動填充、是否是查詢字段等。
使用示例
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; // 非數(shù)據(jù)庫字段 }
在上面的示例中,username
字段對應(yīng)數(shù)據(jù)庫表中的 user_name
列,而 tempField
是一個實體類的臨時字段,不會映射到數(shù)據(jù)庫。
常用屬性
- value:指定數(shù)據(jù)庫列名。
- exist:是否是數(shù)據(jù)庫表中的字段,默認(rèn)
true
。如果設(shè)置為false
,表示該字段不參與數(shù)據(jù)庫映射。 - fill:指定字段的自動填充策略,支持
INSERT
、UPDATE
、INSERT_UPDATE
。
@TableField(value = "created_at", fill = FieldFill.INSERT)
5. @TableLogic 注解
@TableLogic
用于實現(xiàn)邏輯刪除功能。邏輯刪除是在數(shù)據(jù)表中不真正刪除記錄,而是通過標(biāo)記某個字段(如 is_deleted
)來表示數(shù)據(jù)是否被刪除。
使用示例
import com.baomidou.mybatisplus.annotation.TableLogic; public class User { @TableId(type = IdType.AUTO) private Integer id; private String username; @TableLogic private Integer isDeleted; }
在上面的示例中,isDeleted
字段用于標(biāo)記該記錄是否被刪除。當(dāng)使用 MyBatis-Plus 提供的刪除方法(如 deleteById
)時,實際上會更新 isDeleted
字段的值,而不是物理刪除該記錄。
默認(rèn)行為
- 未刪除:
isDeleted = 0
(默認(rèn)為 0)。 - 已刪除:
isDeleted = 1
(默認(rèn)為 1)。
自定義邏輯刪除值
如果邏輯刪除標(biāo)記的值不為 0 和 1,可以通過全局配置進行自定義。
mybatis-plus: global-config: db-config: logic-not-delete-value: 0 # 未刪除的值 logic-delete-value: 2 # 已刪除的值
6. 自動填充字段 @TableField(fill = ...)
自動填充是指在插入或更新數(shù)據(jù)時,MyBatis-Plus 自動為某些字段賦值。常見的場景包括:創(chuàng)建時間、更新時間、操作人等。
使用示例
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
字段會在插入和更新時自動填充。
自動填充實現(xiàn)步驟
- 定義實體類字段并加上
@TableField(fill = ...)
注解。 - 創(chuàng)建自動填充處理器:實現(xiàn)
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
注解用于實現(xiàn)樂觀鎖。在并發(fā)環(huán)境下,樂觀鎖可以防止數(shù)據(jù)的“臟寫”,通過版本號(version
)字段來保證數(shù)據(jù)的一致性。
使用示例
import com.baomidou.mybatisplus.annotation.Version; public class User { @TableId(type = IdType.AUTO) private Integer id; private String username; @Version private Integer version; // 樂觀鎖版本號 }
當(dāng)更新 User
表時,MyBatis-Plus 會檢查 version
字段。如果版本號匹配,則進行更新,同時版本號自增;否則更新失敗,防止數(shù)據(jù)沖突。
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
字段映射到數(shù)據(jù)庫的user_name
列。isDeleted
實現(xiàn)邏輯刪除。createdAt
和updatedAt
實現(xiàn)自動填充。version
用于實現(xiàn)樂觀鎖。
9. 總結(jié)
MyBatis-Plus 提供的實體類注解極大簡化了數(shù)據(jù)庫字段與 Java 類之間的映射和管理,開發(fā)者可以通過簡單的注解來完成復(fù)雜的數(shù)據(jù)庫操作。
@TableName
:用于映射實體類與數(shù)據(jù)庫表。@TableId
和@TableField
:用于映射主鍵和普通字段。@TableLogic
:實現(xiàn)邏輯刪除。@Version
:用于樂觀鎖控制并發(fā)修改。- 自動填充:通過
@TableField(fill = ...)
配合自定義MetaObjectHandler
實現(xiàn)創(chuàng)建時間、更新時間等自動填充。
到此這篇關(guān)于MyBatis-Plus 實體類注解的實現(xiàn)示例的文章就介紹到這了,更多相關(guān)MyBatis-Plus 實體類注解內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- mybatis-plus如何使用sql的date_format()函數(shù)查詢數(shù)據(jù)
- Mybatis-Plus實體類繼承Model的使用小結(jié)
- MyBatis-Plus動態(tài)返回實體類示例詳解
- Mybatis-plus如何提前獲取實體類用雪花算法生成的ID
- Mybatis-Plus實體類注解方法與mapper層和service層的CRUD方法
- mybatis-plus實體類中出現(xiàn)非數(shù)據(jù)庫映射字段解決辦法
- 詳解mybatis-plus實體類中字段和數(shù)據(jù)庫中字段名不對應(yīng)解決辦法
- MyBatis-Plus?ORM數(shù)據(jù)庫和實體類映射方式
相關(guān)文章
JDK8時間相關(guān)類超詳細總結(jié)(含多個實例)
jdk1.8的一些新特性簡化了代碼的寫法,減少了部分開發(fā)量,下面這篇文章主要給大家介紹了關(guān)于JDK8時間相關(guān)類超詳細總結(jié),文中包含了多個實例代碼,需要的朋友可以參考下2023-01-01Java基礎(chǔ)知識之ByteArrayOutputStream流的使用
這篇文章主要介紹了Java基礎(chǔ)知識之ByteArrayOutputStream流的使用,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2021-12-12Java、JavaScript、Oracle、MySQL中實現(xiàn)的MD5加密算法分享
這篇文章主要介紹了Java、JavaScript、Oracle、MySQL中實現(xiàn)的MD5加密算法分享,需要的朋友可以參考下2014-09-09Java對象Serializable接口實現(xiàn)詳解
這篇文章主要介紹了Java對象Serializable接口實現(xiàn)詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-12-12