Mybatis_Plus中的常用注解

目錄

1、@TableName

@TableId

@TableId的type屬性

@TableField?


1、@TableName

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

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

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

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

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

通過@TableName解決問題

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

通過全局配置解決問題

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

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

mybatis-plus:

configuration:

# 配置MyBatis日志

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

global-config:

db-config:

# 配置MyBatis-Plus操作表的默認前綴

table-prefix: t_

@TableId

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

a>問題

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

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

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

?

通過@TableId解決問題

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

c>@TableIdvalue屬性

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

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

@TableId(value="uid")

?

?

@TableIdtype屬性

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

常用的主鍵策略:

描述

IdType.ASSIGN_ID (默 認)

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

IdType.AUTO

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

配置全局主鍵策略:

mybatis-plus:

configuration:

# 配置MyBatis日志

log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

global-config:

db-config:

# 配置MyBatis-Plus操作表的默認前綴

table-prefix: t_

# 配置MyBatis-Plus的主鍵策略

id-type: auto

?

雪花算法

? 背景

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

數據庫的擴展方式主要包括:業務分庫、主從復制,數據庫分表。

? 數據庫分表

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

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

? 垂直分表

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

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

? 水平分表????????????????????????????????????????????????????????????????????????????????????????????????????? ?

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

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

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

I?? 主鍵自增

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

復雜點:分段大小的選取。分段太小會導致切分后子表數量過多,增加維護復雜度;分段太大可能會 導致單表依然存在性能問題,? 一般建議分段大小在 100 萬至 2000 萬之間,具體需要根據業務選取合適 的分段大小。

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

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

取模

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

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

優點:表分布比較均勻。

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

I??? 雪花算法

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

①核心思想:

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

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

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

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

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

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

@TableField?

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

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

a>情況1

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

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

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

相當于在MyBatis中配置

b>情況2

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

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

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

4@TableLogic

a>邏輯刪除

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

? 邏輯刪除:假刪除,將對應數據中代表是否被刪除字段的狀態修改為被刪除狀態,之后在數據庫

中仍舊能看到此條數據記錄

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

b>實現邏輯刪除

I??? 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

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

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

相關文章

JavaScript函數知識點總結

JavaScript函數是一種可重復使用的代碼塊,它接受輸入值(參數)、執行特定任務,并返回輸出值。 1. 聲明函數 function greet(name) {return "Hello, " + name + "!"; }console.log(greet("Alice")); // 輸出: Hello, Alice! console.log( t…

分布式計算Ray框架面試題及參考答案

目錄 簡述 Ray 的架構設計核心組件及其協作流程 全局控制存儲(GCS)在 Ray 中的作用是什么?如何實現高可用性? 對比 Ray 的任務(Task)與 Actor 模型,說明各自適用場景 解釋 Ray 的 Object Store 如何實現跨節點數據共享與零拷貝傳輸 Ray 的分布式調度器如何實現毫秒級…

GitHub熱門RAG框架:讓大語言模型更智慧

檢索增強生成(RAG):提升大型語言模型能力的全新思路 隨著人工智能應用的不斷深入發展,如何讓大型語言模型(LLM)具備更強的上下文理解和實時響應能力成為了關鍵問題。檢索增強生成(Retrieval-Augmented Generation,RAG)正是在這一背景下應運而生的技術,它巧妙地結合了…

HTTP協議講解

概念: Hyper Text Transfer Protocol 超文本傳輸協議,規定了瀏覽器和服務器之間的數據傳輸規則 特點 基于TCP協議,面向連接,安全基于請求-響應模型的,一次請求對應一次響應無狀態的,對于事物沒有記憶能力…

全國節能宣傳周線上知識競賽

線上知識競賽|節能降碳知識知多少 引言 全國節能宣傳周舉辦的主題是“綠色低碳,節能先行”。國家節能中心會同相關單位共同打造了一款線上知識競賽小程序,學習節能知識,爭做節能達人。 1.小程序規則: 體力規則:每位…

【區塊鏈安全 | 第十八篇】類型之引用類型(二)

文章目錄 引用類型數組切片結構體 引用類型 數組切片 數組切片是對數組中連續部分的一個視圖。它的語法為 x[start:end],其中 start 和 end 是表達式,結果類型為 uint256(或者可以隱式轉換為 uint256)。切片的第一個元素是 x[st…

GitHub上免費學習工具的精選匯總

以下是GitHub上免費學習工具的精選匯總,涵蓋編程語言、開發框架、數據科學、面試準備等多個方向,結合工具的功能特點、社區活躍度及適用場景進行分類推薦: 一、編程語言與開發框架 Web Developer Roadmap 簡介:為開發者提供全棧學…

[leetcode]2685. 統計完全連通分量的數量

題目鏈接 題意 給定無向圖,求完全連通分量 連通分量就是一個連通塊的意思 完全連通分量:就是一個連通塊中 ,所有點之間都兩兩有邊相連 思路 一個完全聯通分量有n個點 那么應該有 C n 2 C_n^2 Cn2?條邊 并查集維護連通塊 檢查每個聯通分量…

使用LangChain Agents構建Gradio及Gradio Tools(3)——使用Langchain agents構建Gradio UI

使用LangChain Agents構建Gradio及Gradio Tools(3)——使用Langchain agents構建Gradio UI 本篇摘要16. 使用LangChain Agents構建Gradio及Gradio Tool16.3 使用Langchain agents構建Gradio UI16.3.1 創建代理16.3.2 創建Gradio UI16.3.3 運行demo參考文獻本章目錄如下: 《使…

項目實戰 - 用戶列表

用戶列表想要實現這樣的效果: 渲染數據: import React,{useState,useEffect} from react; import { Button,Table, Tag,Modal,Popover, Switch } from antd; import { EditOutlined,DeleteOutlined,ExclamationCircleOutlined } from ant-design/icons…

吾愛破解安卓逆向學習筆記(4p)

學習目標,了解安卓四大組件,activity生命周期,同時了解去除部分廣告和更新提示。 廣告類型 1.啟動頁廣告 2.更新廣告 3.橫幅廣告 安卓四大組件 組件描述Activity(活動)在應用中的一個Activity可以用來表示一個界面,意思可以…

【目標檢測】【深度學習】【Pytorch版本】YOLOV1模型算法詳解

【目標檢測】【深度學習】【Pytorch版本】YOLOV1模型算法詳解 文章目錄 【目標檢測】【深度學習】【Pytorch版本】YOLOV1模型算法詳解前言YOLOV1的模型結構YOLOV1模型的基本執行流程YOLOV1模型的網絡參數YOLOV1模型的訓練方式 YOLOV1的核心思想前向傳播階段網格單元(grid cell)…

Vue項目中Vuex在util引入,斷點存在default

示例代碼 // src/store/index.js import Vue from vue; import Vuex from vuex; ……Vue.use(Vuex); export default new Vuex.Store({…… })// src/utils/index.js import store from /store // 導入默認導出的 store export async function getDict() {store.state.userInf…

FALL靶機滲透實戰:從信息收集到特權升級的完整鏈分析

1.下載靶機,并在虛擬機中打開 2.用kali來確定該靶機的IP kali的IP:192.168.139.152 arp-scan -l 3.掃描端口 nmap -O 192.168.139.172 4.掃目錄 gobuster dir -u http://192.168.139.172 -x php,txt,html -w /usr/share/dirbuster/wordlists/directo…

談談常見的數據結構(如數組、鏈表、棧、隊列、哈希表、樹、圖)及其應用場景

一、數組(Array) 定義:連續存儲相同類型數據的線性結構,支持隨機訪問。 應用場景:列表渲染、數據緩存、算法處理 代碼示例: // 數組基本操作 const arr [1, 2, 3, 4]; arr.push(5); // O(1) 平均時間復雜…

Kafka 的高可用性

Kafka 的高可用性主要通過副本機制、ISR(In-Sync Replicas)列表和控制器 Broker 來實現。這些機制共同確保了 Kafka 集群在部分節點故障時仍然可以正常運行,數據不會丟失,并且服務不會中斷。 1. 副本機制 Kafka 的副本機制是其高…

力扣HOT100之矩陣:54. 螺旋矩陣

這道題之前在代碼隨想錄里刷過類似的,還有印象,我就按照當初代碼隨想錄的思路做了一下,結果怎么都做不對,因為按照代碼隨想錄的邊界條件設置,當行數和列數都為奇數時,最后一個元素無法被添加到數組中&#…

快速構建個人本地知識庫管理系統與實現RAG問答

文章目錄 摘要一、RAG 和知識庫簡介1、RAG2、知識庫 二、 工作流程三、系統架構設計文件結構知識庫構建模塊RAG 模塊用戶交互模塊 四、技術實現細節五、系統使用案例結論未來改進方向致謝 摘要 在當今信息爆炸的時代,快速準確地獲取知識變得尤為重要。本地 RAG&…

使用DeepSeek API進行情感分析:超簡單

文章目錄 1. 引言1.1 情感分析概述1.2 為什么選擇DeepSeek API1.3 本文目標 2. 技術方案對比2.1 傳統情感分析方法2.2 基于LLM的方法DeepSeek API優勢 3. DeepSeek 情感分析實戰3.1 Few-shot Learning方法3.2 完整的DeepSeek API調用示例3.3 案例演示 4. DeepSeek開發情感分析工…

設置網站主題色color-scheme

color-scheme color-scheme CSS 屬性允許元素指示它可以舒適地呈現哪些顏色方案。 操作系統顏色方案的常見選擇為“亮色”和“暗色”,或“日間模式”和“夜間模式”。當用戶選擇其中一種顏色方案時,操作系統會對用戶界面進行調整,包括表單控件…