MybatisPlus(SpringBoot版)學習第四講:常用注解

目錄

1.@TableName

1.1 問題

1.2 通過@TableName解決問題

1.3 通過全局配置解決問題

2.@TableId

2.1 問題

2.2 通過@TableId解決問題

2.3 @TableId的value屬性

2.4 @TableId的type屬性

2.5 雪花算法

1.背景

2.數據庫分表

①垂直分表

②水平分表

1>主鍵自增

2>取模

3> 雪花算法

3.@TableField

3.1 情況1:駝峰命名

3.2 情況2:屬性字段不一樣

4.@TableLogic

4.1 邏輯刪除

4.2 實現邏輯刪除

?4.3 查詢


1.@TableName

????????經過以上的測試,在使用MyBatis-Plus實現基本的CRUD時,我們并沒有指定要操作的表,只是在?Mapper接口繼承BaseMapper時,設置了泛型User,而操作的表為user表

????????由此得出結論,??MyBatis-Plus在確定操作的表時,由BaseMapper的泛型決定,即實體類型決定,且默認操作的表名和實體類型的類名一致.

1.1 問題

????????若實體類類型的類名和要操作的表的表名不一致,會出現什么問題?

????????????????我們將表user更名為t_user?,測試查詢功能

????????程序拋出異常, ?Table?'mybatis_plus.user'doesn't?exist,因為現在的表名為t_user?,而默認操作的表名和實體類型的類名一致,即user表

1.2 通過@TableName解決問題

????????在實體類類型上添加@TableName("t_user"),標識實體類對應的表,即可成功執行SQL語句

1.3 通過全局配置解決問題

????????在開發的過程中,我們經常遇到以上的問題,即實體類所對應的表都有固定的前綴,例如t_或tbl_

????????此時,可以使用MyBatis-Plus提供的全局配置,為實體類所對應的表名設置默認的前綴,那么就不需要在每個實體類上通過@TableName標識實體類對應的表。

# 配置MyBatis日志
mybatis-plus:configuration:# 配置MyBatis日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:# 配置MyBatis-Plus操作表的默認前綴table-prefix: t_

2.@TableId

????????經過以上的測試,??MyBatis-Plus在實現CRUD時,會默認將id作為主鍵列,并在插入數據時,默認 基于雪花算法的策略生成id.

2.1 問題

????????若實體類和表中表示主鍵的不是id,而是其他字段,例如uid?,?MyBatis-Plus會自動識別uid為主鍵列嗎?

????????我們實體類中的屬性id改為uid,將表中的字段id也改為uid,測試添加功能

程序拋出異常,??Field?'uid'doesn't?have?a?default value,說明MyBatis-Plus沒有將uid作為主鍵?賦值

2.2 通過@TableId解決問題

? ????????在實體類中uid屬性上通過@TableId將其標識為主鍵,即可成功執行SQL語句

2.3 @TableId的value屬性

????????若實體類中主鍵對應的屬性為id,而表中表示主鍵的字段為uid,此時若只在屬性id上添加注解 ??@TableId,則拋出異常Unknown?column'id'in'field?list',即MyBatis-Plus仍然會將id作為表的?主鍵操作,而表中表示主鍵的是字段uid

????????此時需要通過@TableId注解的value屬性,指定表中的主鍵字段,??@TableId("uid")或@TableId(value="uid")

2.4 @TableId的type屬性

?type屬性用來定義主鍵策略

常用的主鍵策略:

描述

IdType.ASSIGN_ID?(默?認)

基于雪花算法的策略生成數據id,與數據庫id是否設置自增無關

IdType.AUTO

使用數據庫的自增策略,注意,該類型請確保數據庫設置了id自增,?否則無效

配置全局主鍵策略:

# 配置MyBatis日志
mybatis-plus:configuration:# 配置MyBatis日志log-impl: org.apache.ibatis.logging.stdout.StdOutImplglobal-config:db-config:# 配置MyBatis-Plus操作表的默認前綴table-prefix: t_# 配置MyBatis-Plus的主鍵策略id-type: auto

2.5 雪花算法

1.背景

????????需要選擇合適的方案去應對數據規模的增長,以應對逐漸增長的訪問壓力和數據量。

????????數據庫的擴展方式主要包括:

????????????????業務分庫、主從復制,數據庫分表。

分庫:比如淘寶,VIP用戶有一個庫,普通用戶一個庫

主從復制:備份

分表:100萬按照什么規則分表

2.數據庫分表

????????將不同業務數據分散存儲到不同的數據庫服務器,能夠支撐百萬甚至千萬用戶規模的業務,但如果業務繼續發展,同一業務的單表數據也會達到單臺數據庫服務器的處理瓶頸。例如,淘寶的幾億用戶數據,??如果全部存放在一臺數據庫服務器的一張表中,肯定是無法滿足性能要求的,此時就需要對單表數據進行拆分。

????????單表數據拆分有兩種方式:垂直分表水平分表。示意圖如下:

①垂直分表

????????垂直分表適合將表中某些不常用且占了大量空間的列拆分出去。

????????例如,前面示意圖中的 nickname?和 description?字段,假設我們是一個婚戀網站,用戶在篩選其他用戶的時候,主要是用 age?和 sex?兩個字段進行查詢,而 nickname?和 description?兩個字段主要用于展?示,?一般不會在業務查詢中用到。description?本身又比較長,因此我們可以將這兩個字段獨立到另外???一張表中,這樣在查詢 age?和 sex?時,就能帶來一定的性能提升。

②水平分表

????????水平分表適合表行數特別大的表,有的公司要求單表行數超過 5000 萬就必須進行分表,這個數字可以?作為參考,但并不是絕對標準,關鍵還是要看表的訪問性能。對于一些比較復雜的表,可能超過 1000??萬就要分表了;而對于一些簡單的表,即使存儲數據超過 1 億行,也可以不分表。

????????但不管怎樣,當看到表的數據量達到千萬級別時,作為架構師就要警覺起來,因為這很可能是架構的性能瓶頸或者隱患

????????水平分表相比垂直分表,會引入更多的復雜性,例如要求全局唯一的數據id該如何處理

1>主鍵自增

????????①以最常見的用戶?ID 為例,可以按照 1000000?的范圍大小進行分段, ??1?~?999999 放到表 1中,?1000000?~?1999999 放到表2中,以此類推。

????????因為是自動遞增的,所以刪除一條數據在增加,ID是后面的,會導致一個表里數據多,一個表少。服務器承受的力度不一樣。(比如,第一個表刪除5號ID,再新增,ID就是6,這樣就會導致實際的表中沒有那么多數據。那么管理這個表的服務器實際上只管理那么一點數據。)

????????②復雜點:分段大小的選取

????????????????分段太小會導致切分后子表數量過多,增加維護復雜度;

????????????????分段太大可能會?導致單表依然存在性能問題, ?

????????????????一般建議分段大小在 100 萬至 2000?萬之間,具體需要根據業務選取合適?的分段大小。

????????③優點:可以隨著數據的增加平滑地擴充新的表。例如,現在的用戶是 100 萬,如果增加到 1000 萬,?只需要增加新的表就可以了,原有的數據不需要動。

????????④缺點:分布不均勻。假如按照 1000 萬來進行分表,有可能某個分段實際存儲的數據量只有 1 條,而?另外一個分段實際存儲的數據量有 1000 萬條。

2>取模

????????①同樣以用戶 ID?為例,假如我們一開始就規劃了 10?個數據庫表,可以簡單地用 user_id?%?10?的值來表示數據所屬的數據庫表編號,??ID 為 985?的用戶放到編號為 5?的子表中, ??ID 為 10086?的用戶放到編號為 6?的子表中。

????????②復雜點:初始表數量的確定。表數量太多維護比較麻煩,表數量太少又可能導致單表性能存在問題。

????????③優點:表分布比較均勻。

????????④缺點:擴充新的表很麻煩,所有數據都要重分布。

3> 雪花算法

前兩種都是基于主鍵自增的。

????????雪花算法是由Twitter公布的分布式主鍵生成算法,它能夠保證不同表的主鍵的不重復性,以及相同表的?主鍵的有序性。

①核心思想:

????????長度共64bit(一個long型)。

????????首先是一個符號位,??1bit標識,由于long基本類型在Java中是帶符號的,最高位是符號位,正數是0,負 數是1,所以id一般是正數,最高位是0。

????????41bit時間截(毫秒級),存儲的是時間截的差值(當前時間截 - 開始時間截),結果約等于69.73年。

????????10bit作為機器的ID(?5個bit是數據中心,??5個bit的機器ID,可以部署在1024個節點)。

????????12bit作為毫秒內的流水號(意味著每個節點在每毫秒可以產生 4096 個 ID)。

②優點:整體上按照時間自增排序,并且整個分布式系統內不會產生ID碰撞,并且效率較高。


3.@TableField

????????經過以上的測試,我們可以發現,??MyBatis-Plus在執行SQL語句時,要保證實體類中的屬性名和表中的字段名一致

????????如果實體類中的屬性名和字段名不一致的情況,會出現什么問題呢?

3.1 情況1:駝峰命名

????????若實體類中的屬性使用的是駝峰命名風格,而表中的字段使用的是下劃線命名風格

例如實體類屬性userName,表中字段user_name

此時MyBatis-Plus會自動將下劃線命名風格轉化為駝峰命名風格

????????相當于在MyBatis中配置駝峰config配置。

?????????默認開啟,在這里關閉他不會報錯,但是相關字段是null值。

3.2 情況2:屬性字段不一樣

????????若實體類中的屬性和表中的字段不滿足情況1

例如實體類屬性name?,表中字段username

此時需要在實體類屬性上使用@TableField("username")設置屬性所對應的字段名


4.@TableLogic

4.1 邏輯刪除

? ????????物理刪除:真實刪除,將對應數據從數據庫中刪除,之后查詢不到此條被刪除的數據

?? ????????邏輯刪除:假刪除,將對應數據中代表是否被刪除字段的狀態修改為“被刪除狀態”,之后在數據庫中仍舊能看到此條數據記錄

?? ????????使用場景:可以進行數據恢復

? ? ? ? 所以,像那種政府、公司等都會設置邏輯刪除,更安全,誤刪還能恢復。

4.2 實現邏輯刪除

step1?:數據庫中創建邏輯刪除狀態列,設置默認值為0

step2?:實體類中添加邏輯刪除屬性

step3?:測試

測試刪除功能,真正執行的是修改

UPDATE t_user SET is_deleted=1 WHERE id=? AND is_deleted=0

測試查詢功能,被邏輯刪除的數據默認不會被查詢

SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0
@Autowired
private PeopleMapper peopleMapper;
@Test
public void testDeleted(){peopleMapper.deleteById(7L);}

?4.3 查詢

@Test
public void testSelect(){peopleMapper.selectList(null);
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/899746.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/899746.shtml
英文地址,請注明出處:http://en.pswp.cn/news/899746.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第二屆計算機網絡和云計算國際會議(CNCC 2025)

重要信息 官網:www.iccncc.org 時間:2025年4月11-13日 地點:中國南昌 簡介 第二屆計算機網絡和云計算國際會議(CNCC 2025)將于2025年4月11-13日在中國南昌召開。圍繞“計算機網絡”與“云計算”展開研討&#xff…

【大模型基礎_毛玉仁】5.4 定位編輯法:ROME

目錄 5.4 定位編輯法:ROME5.4.1 知識存儲位置1)因果跟蹤實驗2)阻斷實驗 5.4.2 知識存儲機制5.4.3 精準知識編輯1)確定鍵向量2)優化值向量3)插入知識 5.4 定位編輯法:ROME 定位編輯:…

橫掃SQL面試——連續性登錄問題

橫掃SQL面試 📌 連續性登錄問題 在互聯網公司的SQL面試中,連續性問題堪稱“必考之王”。💻🔍 用戶連續登錄7天送優惠券🌟,服務器連續報警3次觸發熔斷??,圖書館連續3天人流破百開啟限流?” …

Spring AI Alibaba 對話記憶使用

一、對話記憶 (ChatMemory)簡介 1、對話記憶介紹 ”大模型的對話記憶”這一概念,根植于人工智能與自然語言處理領域,特別是針對具有深度學習能力的大型語言模型而言,它指的是模型在與用戶進行交互式對話過程中,能夠追蹤、理解并利…

vdi模式是什么

?VDI模式(Virtual Desktop Infrastructure)是一種基于服務器的計算模型,其核心思想是將所有計算和存儲資源集中在服務器上,用戶通過前端設備(如瘦客戶機)訪問服務器上的虛擬桌面?? VDI模式的工作原理 在…

【分布式】深入剖析 Sentinel 限流:原理、實現

在當今分布式系統盛行的時代,流量的劇增給系統穩定性帶來了巨大挑戰。Sentinel 作為一款強大的流量控制組件,在保障系統平穩運行方面發揮著關鍵作用。本文將深入探討 Sentinel 限流的原理、實現方案以及其優缺點,助力開發者更好地運用這一工具…

c#winform,倒鴨子字幕效果,typemonkey字幕效果,抖音瀑布流字幕效果

不廢話 直接上效果圖 C# winform 開發抖音的瀑布流字幕。 也是typemonkey插件字幕效果 或者咱再網上常說的倒鴨子字幕效果 主要功能 1,軟件可以自定義添加字幕內容 2,軟件可以添加字幕顯示的時間區間 3,可以自定義字幕顏色,可以隨…

Pycharm(八):字符串切片

一、字符串分片介紹 對操作的對象截取其中一部分的操作,比如想要獲取字符串“888666qq.com前面的qq號的時候就可以用切片。 字符串、列表、元組都支持切片操作。 語法:字符串變量名 [起始:結束:步長] 口訣:切片其實很簡單,只顧頭來…

圖片解釋git的底層工作原理

(圖片來源:自己畫的) 基于同一個commit創建新分支 (圖片來源:書籍《Linux運維之道》 ISBN 9787121461811) 在新分支上修改然后commit一次 (圖片來源:書籍《Linux運維之道》 ISBN 978…

leetcode994.腐爛的橘子

思路源自 【力扣hot100】【LeetCode 994】腐爛的橘子|多源BFS 這里圖中的腐爛的的橘子是同時對周圍進行腐化,所以采用多源bfs就能解決 多源bfs與單源bfs的區別就在于隊列取出時一輪是取出隊列當中的全部元素 class Solution {public int orangesRotti…

【華為OD技術面試真題 - 技術面】- Java面試題(15)

華為OD面試真題精選 專欄:華為OD面試真題精選 目錄: 2024華為OD面試手撕代碼真題目錄以及八股文真題目錄 介紹下TCP/UDP TCP(傳輸控制協議)和 UDP(用戶數據報協議) TCP(Transmission Control Protocol)和 UDP(User Datagram Protocol)是兩種常見的傳輸層協議,主要…

?在 Fedora 系統下備份遠程 Windows SQL Server 數據庫的完整方案

?一、環境準備與工具安裝? ?1. 安裝 Microsoft SQL Server 命令行工具? Fedora 需安裝 mssql-tools 和 ODBC 驅動: # 添加 Microsoft 倉庫 sudo curl -o /etc/yum.repos.d/msprod.repo https://packages.microsoft.com/config/rhel/8/prod.repo# 安裝工具包 …

DeepSeek:巧用前沿AI技術,開啟智能未來新篇章

引言 近年來,人工智能(AI)技術迅猛發展,大模型成為全球科技競爭的核心賽道。在這場AI革命中,DeepSeek作為中國領先的大模型研發團隊,憑借其創新的技術架構、高效的訓練方法和廣泛的應用場景,迅…

R語言實現軌跡分析--traj和lcmm包體會

R語言實現軌跡分析–traj和lcmm包體會 軌跡分析是對重復測量數據的一種歸納,轉化為一種分類變量,比如手術后1~7天內的疼痛評分,可以形成術后急性痛軌跡。形成的軌跡作為一個分類變量,可以用于預測疾病的預后&#xff…

Vue 3 事件總線詳解:構建組件間高效通信的橋梁

Vue 3 事件總線詳解:構建組件間高效通信的橋梁 為什么需要事件總線?使用 mitt 實現事件總線1. 安裝 mitt2. 創建事件總線3. 在組件中使用事件總線發送端組件(例如 ComponentA.vue)接收端組件(例如 ComponentB.vue&…

MySQL的基礎語法1(增刪改查、DDL、DML、DQL和DCL)

目錄 一、基本介紹 二、SQL通用語法 三、SQL分類(DDL、DML、DQL、DCL) 1.DDL 1.1數據庫操作 1.2表操作 1.2.1表操作-查詢創建 1.2.2表操作-數據類型 1)數值類型 2)字符串類型 3)日期時間類型?編輯 4)表操作-案例 1.2.3…

【NLP】15. NLP推理方法詳解 --- 動態規劃:序列標注,語法解析,共同指代

動態規劃 (Dynamic Programming) 動態規劃(Dynamic Programming,簡稱 DP)是一種通過將問題分解為較小子問題來優化計算效率的技術。它特別適用于優化最優解問題,比如序列標注(sequence tagging)這類任務。…

JavaScript中的NaN、undefined和null 的區別

NaN代表"Not a Number",它是一種特殊的數值,用于表示非數字值。當一個操作無法返回有效的數值時,通常會得到NaN作為結果。 let result = 10 / abc; console.log(result); // 輸出 NaN需要注意的是,NaN與自身不相等,我們無法通過簡單的比較操作符(如==或===)來…

Turtle事件處理(鍵盤與鼠標交互)

Turtle 提供了 事件驅動編程,允許我們使用 鍵盤 和 鼠標 控制 Turtle,從而實現交互式繪圖。例如,我們可以讓 Turtle 響應 按鍵、鼠標點擊 和 拖動 事件,使其根據用戶的輸入進行移動、旋轉或繪制圖形。 1. 事件機制概述 Turtle 的事件處理主要依賴 turtle.Screen() 提供的 …

【Keepalived】Keepalived-2.3.3明確結束對CentOS 7的支持

2025年3月30日,官方發布了Keepalived的最新版,版本號:2.3.3 而2024年11月3日發布的2.3.2版本,在CentOS 7.9上編譯的時候,就出現了報錯,但是在Alma Linux 8.10上,則可以成功編譯安裝&#xff0c…