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

