最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot 裝飾器@TableField原理解析

 更新時(shí)間:2025年09月10日 14:54:56   作者:司南錘  
本文解析了MyBatis-Plus的@TableField注解,用于非主鍵字段與數(shù)據(jù)庫列的映射及行為控制,涵蓋自動填充、樂觀鎖、多租戶等企業(yè)級功能,提供使用技巧、常見問題及示例代碼,感興趣的朋友跟隨小編一起看看吧

1. 開胃菜:一句話認(rèn)識 @TableField

@TableField 是 MyBatis-Plus 提供的字段級注解,用于非主鍵字段與數(shù)據(jù)庫列的顯式綁定行為控制。
記住兩個(gè)關(guān)鍵字:“非主鍵”“行為控制”——這是它與 @TableId 的核心差異。

2. 為什么需要它?

場景不用 @TableField 的問題用了 @TableField 的收益
實(shí)體字段名與列名不一致默認(rèn)下劃線轉(zhuǎn)駝峰失效顯式指定 value="user_name"
實(shí)體屬性非數(shù)據(jù)庫字段MP 會無腦拼接,SQL 報(bào)錯(cuò)exist=false 排除
敏感字段不允許查詢查詢會返回密碼select=false 自動屏蔽
插入/更新時(shí)要填充手動 set 易遺漏fill=FieldFill.INSERT 自動填充
樂觀鎖版本號需要手動判斷version=true 一鍵啟用

3. 快速上手:5 個(gè)最常用的屬性

@Data
@TableName("t_user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;
    // 1. 列名不一致
    @TableField("user_name")
    private String name;
    // 2. 虛擬字段,不持久化
    @TableField(exist = false)
    private String token;
    // 3. 查詢時(shí)不返回
    @TableField(select = false)
    private String password;
    // 4. 插入自動寫入
    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;
    // 5. 更新自動寫入
    @TableField(fill = FieldFill.UPDATE)
    private LocalDateTime updateTime;
    // 6. 樂觀鎖
    @Version
    @TableField("version")
    private Integer version;
}

4. 源碼級剖析:MP 如何把注解變成 SQL

4.1 解析入口

TableInfoHelper#initTableInfo → 反射讀取所有字段 → 構(gòu)建 TableFieldInfo 列表。

4.2 SQL 拼接

AbstractSqlInjector 注入通用 CRUD 方法 →
DefaultSqlProviderTableFieldInfo 生成 SQL 片段 →
select=false 的字段被主動剔除,exist=false 的字段直接忽略。

4.3 填充與樂觀鎖

MetaObjectHandler 接口處理 FieldFill;
MybatisPlusInterceptor 內(nèi)的 OptimisticLockerInnerInterceptor 處理 @Version

5. 企業(yè)級高階玩法

5.1 動態(tài)過濾字段 —— 防止數(shù)據(jù)越權(quán)

// 場景:普通用戶不能查看薪資字段
@TableField(select = false, condition = "%s != 'admin'")
private BigDecimal salary;

配合 TenantLineInterceptor 可實(shí)現(xiàn)動態(tài)列級權(quán)限。

5.2 加密存儲 —— 自定義 TypeHandler

@TableField(typeHandler = AesTypeHandler.class)
private String idCard;

插入自動加密,查詢自動解密,業(yè)務(wù)代碼零侵入。

5.3 多租戶隔離 —— 租戶字段加索引

@TableField("tenant_id")
@InterceptorIgnore(tenantLine = "true") // 跳過插件,避免死循環(huán)
private Long tenantId;

6. 高頻踩坑 & 排查清單

現(xiàn)象根因正確姿勢
更新時(shí) version 不生效實(shí)體里 version 為 null先查后改,或者手動 set
虛擬字段被持久化忘記寫 exist=false加上即可
select=false 依然查出手寫 SQL 未使用 MP 條件構(gòu)造器LambdaQueryWrapperSqlSelectInterceptor
填充不生效沒實(shí)現(xiàn) MetaObjectHandler@Component 實(shí)現(xiàn)接口

7. 和 Spring 注解的“夢幻聯(lián)動”

@Component
public class MyMetaHandler implements MetaObjectHandler {
    @Override
    public void insertFill(MetaObject metaObject) {
        // Spring 容器直接注入
        this.strictInsertFill(metaObject, "createTime", 
                              LocalDateTime.class, LocalDateTime.now());
    }
}

@TableField 負(fù)責(zé)標(biāo)記,Spring 負(fù)責(zé)注入,兩者解耦,符合單一職責(zé)。

8. 總結(jié):一張腦圖記住 @TableField

@TableField
├─ value          映射列名
├─ exist          是否持久化
├─ select         是否參與查詢
├─ fill           自動填充策略
├─ update         自定義 set 片段
├─ condition      動態(tài)條件
├─ typeHandler    類型轉(zhuǎn)換
└─ keepGlobalFormat 保留全局格式

9. 一鍵復(fù)制即可跑的最小 Demo

GitHub:https://github.com/YOUR_NAME/mp-tablefield-demo
分支:feature/tablefield-demo
包含:加密、樂觀鎖、多租戶、自動填充 4 大示例,Maven 一鍵啟動。

10. 評論區(qū) FAQ 預(yù)覽(提前回答)

Q1@TableField@Column 有什么區(qū)別?
A:后者是 JPA 規(guī)范,只在 Hibernate 生效;前者是 MyBatis-Plus 專用,功能更強(qiáng)。

Q2:能否在 Kotlin data class 使用?
A:可以,但字段必須聲明為 var,否則無法填充。

Q3:性能會下降嗎?
A:解析結(jié)果緩存到 TableInfo,運(yùn)行期零反射,性能損耗 < 1%。

到此這篇關(guān)于一文講透一個(gè) SpringBoot 裝飾器 —— @TableField的文章就介紹到這了,更多相關(guān)SpringBoot 裝飾器@TableField內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Java操作FTP實(shí)現(xiàn)上傳下載功能

    Java操作FTP實(shí)現(xiàn)上傳下載功能

    這篇文章主要為大家詳細(xì)介紹了Java如何通過操作FTP實(shí)現(xiàn)上傳下載的功能,文中的示例代碼講解詳細(xì),對我們學(xué)習(xí)Java有一定幫助,需要的可以參考一下
    2022-11-11
  • Java獲取文件路徑的幾種方式匯總

    Java獲取文件路徑的幾種方式匯總

    本文介紹了使用Java處理文件路徑的方法,包括使用java.io.File、java.nio.file.Paths類處理本地文件和類路徑資源,以及在Web應(yīng)用中獲取路徑的方法,它還提供了最佳實(shí)踐和注意事項(xiàng),如使用現(xiàn)代化的路徑處理方式和跨平臺兼容性,需要的朋友可以參考下
    2026-04-04
  • 冒泡排序的原理及java代碼實(shí)現(xiàn)

    冒泡排序的原理及java代碼實(shí)現(xiàn)

    冒泡排序法:關(guān)鍵字較小的記錄好比氣泡逐趟上浮,關(guān)鍵字較大的記錄好比石塊下沉,每趟有一塊最大的石塊沉底。算法本質(zhì):(最大值是關(guān)鍵點(diǎn),肯定放到最后了,如此循環(huán))每次都從第一位向后滾動比較,使最大值沉底,最小值上升一次,最后一位向前推進(jìn)
    2016-02-02
  • Java中的遠(yuǎn)程方法調(diào)用之RPC使用

    Java中的遠(yuǎn)程方法調(diào)用之RPC使用

    本文介紹了RPC的基本概念、核心思想及其在分布式系統(tǒng)中的作用,重點(diǎn)講解了Java中的三種RPC實(shí)現(xiàn)方式:RMI、Hessian和Dubbo,分別從適用場景、核心特點(diǎn)等方面做了對比對比較,并并提供了其基本實(shí)現(xiàn)代碼示例,總結(jié)了各框架的優(yōu)缺點(diǎn),為實(shí)際開發(fā)中選擇合適的技術(shù)棧提供了參考
    2026-05-05
  • 關(guān)于logBack配置日志文件及編碼配置的問題

    關(guān)于logBack配置日志文件及編碼配置的問題

    這篇文章主要介紹了logBack配置日志文件及編碼配置的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-07-07
  • 如何將Mybatis連接到ClickHouse

    如何將Mybatis連接到ClickHouse

    這篇文章主要介紹了如何將Mybatis連接到ClickHouse,幫助大家更好得理解和學(xué)習(xí)使用Mybatis,感興趣的朋友可以了解下
    2021-03-03
  • jpa使用注解生成表時(shí)無外鍵問題及解決

    jpa使用注解生成表時(shí)無外鍵問題及解決

    這篇文章主要介紹了jpa使用注解生成表時(shí)無外鍵問題及解決方案,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • transactionAttributes各屬性意義及配置

    transactionAttributes各屬性意義及配置

    這篇文章主要介紹了transactionAttributes各屬性意義及配置,具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-09-09
  • IDEA設(shè)置Maven自動編譯model的實(shí)現(xiàn)方法

    IDEA設(shè)置Maven自動編譯model的實(shí)現(xiàn)方法

    本文主要介紹了IDEA設(shè)置Maven自動編譯model的實(shí)現(xiàn)方法, maven結(jié)構(gòu)的項(xiàng)目,我們在每次修改代碼后都會需要手動編譯,本文就可以解決這個(gè)問題,感興趣的可以了解一下
    2023-08-08
  • Java數(shù)據(jù)結(jié)構(gòu)中的HashMap和HashSet詳解

    Java數(shù)據(jù)結(jié)構(gòu)中的HashMap和HashSet詳解

    HashMap和HashSet都是存儲在哈希桶之中,通過本文我們可以先了解一些哈希桶是什么,本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友參考下吧
    2023-10-10

最新評論

阿拉尔市| 长泰县| 崇义县| 易门县| 大同市| 玉树县| 会宁县| 壶关县| 潮州市| 德化县| 曲阳县| SHOW| 巴南区| 隆回县| 博罗县| 达州市| 虞城县| 宁河县| 永兴县| 南乐县| 黄平县| 手游| 平谷区| 闽清县| 英超| 武平县| 东宁县| 云梦县| 鹤峰县| 武定县| 吴忠市| 西昌市| 砀山县| 镇远县| 黎平县| 池州市| 惠水县| 江永县| 定兴县| 阳东县| 海丰县|