實體類id字段選擇Integer還是Long?

Java實體類ID類型選擇:Integer vs Long 深度解析與最佳實踐

在Java實體類設計中,ID字段的類型選擇看似簡單,卻直接影響系統擴展性、性能和數據一致性。本文將深入探討Integer和Long兩種主鍵類型的差異,并通過實際案例展示如何做出合理選擇。

一、核心差異對比

特性IntegerLong
取值范圍-231 ~ 231-1 (約±21億)-2?3 ~ 2?3-1 (約±922億億)
內存占用16字節(對象頭+值)24字節(對象頭+值)
數據庫對應INT / INTEGERBIGINT
適用場景中小型系統大型/分布式系統
溢出風險數據量>21億時高風險幾乎無風險
JSON傳輸無精度損失JS中>2?3可能丟失精度

二、選擇依據:七大關鍵因素

1. 數據量規模(決定性因素)

  • Integer上限21億條
    // 每天10萬條數據:
    2,147,483,647 / 100,00021,475天 ≈ 58
  • Long上限922億億條
    // 每天10億條數據:
    9,223,372,036,854,775,807 / 1,000,000,0009,223,372天 ≈ 25萬年
    

結論:當預估數據量可能超過10億時,必須選擇Long

2. 分布式ID生成策略

主流分布式ID算法要求Long類型:

算法位數必須類型
雪花算法64位Long
UUID128位String
Redis生成64位Long
// 雪花算法生成ID示例
public Long nextId() {return ((timestamp - 1288834974657L) << 22) | (dataCenterId << 18) | (workerId << 12) | sequence;
}

3. 數據庫兼容性

不同數據庫的整數類型支持:

數據庫Integer對應Long對應特殊限制
MySQLINT(11)BIGINT(20)BIGINT最大支持19位數字
PostgreSQLINTEGERBIGINT無特殊限制
OracleNUMBER(10)NUMBER(19)NUMBER(38)最大支持

4. 內存與存儲效率

實測數據對比(1000萬對象):

// Integer存儲
List<User> list1 = new ArrayList<>(10_000_000); 
// 內存占用 ≈ 160 MB// Long存儲
List<User> list2 = new ArrayList<>(10_000_000);
// 內存占用 ≈ 240 MB (增加50%)

結論:內存敏感場景優選Integer

5. 前端兼容性問題

JavaScript的Number類型最大安全整數為2?3-1(9,007,199,254,740,991):

// 超過此值將丟失精度
const id = 9007199254740993; 
console.log(id); // 輸出 9007199254740992

解決方案

// 后端返回時轉為字符串
public class UserDTO {@JsonFormat(shape = JsonFormat.Shape.STRING)private Long id;
}

6. MyBatis-Plus的特殊要求

MyBatis-Plus的ID生成策略:

public enum IdType {AUTO, // 數據庫自增NONE, // 無策略INPUT, // 手動輸入ASSIGN_ID, // 雪花算法(必須Long)ASSIGN_UUID; // UUID
}

ASSIGN_ID必須使用Long

@TableId(type = IdType.ASSIGN_ID)
private Long id; // 必須為Long類型

7. 系統擴展性考量

項目演進典型路徑

單體架構 → 分布式架構 → 分庫分表

選擇Long可避免架構升級時的重構成本

三、最佳實踐方案

場景1:全新項目決策樹

graph TDA[預估數據量] -->|<1億| B[使用Integer]A -->|>1億| C[是否分布式?]C -->|是| D[Long+ASSIGN_ID]C -->|否| E[Long+AUTO]

場景2:老系統遷移策略

步驟

  1. 數據庫修改:
    ALTER TABLE user MODIFY id BIGINT;
    
  2. 實體類更新:
    // 修改前
    private Integer id;// 修改后
    private Long id;
    
  3. 逐步更新關聯表外鍵

通用編碼規范

public class BaseEntity {/*** 統一使用Long類型主鍵* 原因:* 1. 避免未來擴展限制* 2. 兼容分布式ID生成* 3. 預留分庫分表空間*/@TableId(type = IdType.ASSIGN_ID)private Long id;// 公共字段...
}

四、實戰問題解決方案

問題1:Integer溢出緊急處理

癥狀:新增數據時報主鍵沖突

-- 錯誤日志
Duplicate entry '2147483647' for key 'PRIMARY'

救火方案

  1. 臨時擴展:
    ALTER TABLE user AUTO_INCREMENT = 3000000000;
    
  2. 永久解決:
    ALTER TABLE user MODIFY id BIGINT UNSIGNED AUTO_INCREMENT;
    

問題2:JS精度丟失

前端處理方案

// axios響應攔截器
axios.interceptors.response.use(response => {const data = response.data;convertBigIntToString(data);return response;
});function convertBigIntToString(obj) {Object.keys(obj).forEach(key => {if (typeof obj[key] === 'bigint') {obj[key] = obj[key].toString();} else if (typeof obj[key] === 'object') {convertBigIntToString(obj[key]);}});
}

五、性能優化技巧

內存敏感場景優化

// 使用基本類型long替代Long
public class CompactUser {private long id; // 節省8字節/對象// 需手動處理null值public void setId(Long id) {this.id = id != null ? id : 0L;}
}

數據庫優化方案

BIGINT索引優化

-- 使用前綴索引(前10位)
CREATE INDEX idx_user_id_prefix ON user (id(10)); -- 分頁優化
SELECT * FROM user 
WHERE id > 9000000000 
ORDER BY id ASC LIMIT 20;

六、總結:選擇決策矩陣

考量維度推薦選擇理由說明
初創小系統Integer節省內存,簡化開發
中大型業務系統Long避免未來擴展瓶頸
高并發分布式系統Long支持分布式ID生成
物聯網大數據Long支持海量數據存儲
遺留系統維護維持原樣避免復雜遷移風險

架構師建議:在2023年后的新項目中,優先選擇Long類型。隨著硬件成本降低和數據規模爆發式增長,Long帶來的擴展性優勢遠超過其微小的存儲開銷。使用包裝類型Long而非基本類型long,可以更好地處理null值場景,符合MyBatis-Plus等框架的最佳實踐。

最終決策公式

if (存在分布式可能 || 預估數據量 > 1億) {選擇Long;
} else if (內存敏感 && 數據量 < 1000萬) {選擇Integer;
} else {選擇Long; // 默認安全選項
}

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

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

相關文章

變現與自我提升:加法與乘法的智慧抉擇

在當今這個快速發展的時代&#xff0c;無論是追求財富的變現&#xff0c;還是致力于個人能力的提升&#xff0c;我們都會面臨一個關鍵問題&#xff1a;是分類分步地逐步實現&#xff0c;還是將多種要素混合在一起&#xff1f;是簡單地做加法&#xff0c;還是復雜的乘法運算&…

鴻蒙 SideBarContainer 開發攻略:側邊欄交互設計與多端適配

一、引言&#xff1a;側邊欄布局的核心組件 在鴻蒙應用開發中&#xff0c;SideBarContainer 作為構建高效交互界面的核心組件&#xff0c;為開發者提供了靈活的側邊欄布局解決方案。該組件通過標準化的接口設計&#xff0c;實現了側邊欄與內容區的協同展示&#xff0c;適用于文…

Windows系統克隆硬盤后顯示容量與實際容量嚴重不符如何處理?

在 Windows 系統中&#xff0c;克隆硬盤后出現硬盤顯示容量與實際容量不符的問題&#xff0c;通常與分區布局、文件系統未正確調整或克隆工具設置有關。以下是可能的原因及對應的處理方案。 1. 問題原因分析 1.1 分區未正確調整 現象&#xff1a; 克隆后硬盤的總容量未正確顯…

EXCEL數據報表

客單價成交金額*成交客戶數 —— 提取年份 YEAR() 視圖-窗口-新建窗口&#xff0c;就能將excel的一個子表格單拎出來成為獨立窗口&#xff0c;方便對比查看 數據報表的單元格盡量都用公式來填補&#xff0c;鏈接到源表上去。這樣當源表有新數據更新進來后&#xff0c;報表也…

TCP/IP協議簡要概述

一、TCP/IP協議概述 &#xff08;一&#xff09;定義 TCP/IP&#xff08;Transmission Control Protocol/Internet Protocol&#xff09;協議是一組用于互聯網以及類似計算機網絡的通信協議。它是由網絡層的IP協議和傳輸層的TCP協議組成&#xff0c;但整個TCP/IP協議族包含很…

ubuntu下利用Qt添加相機設備并運行arm程序

一、編譯x86-64平臺的opencv demo 緊接上一篇&#xff0c;我電腦里現在同時存在兩個版本的opencv庫&#xff0c;一個是基于x86-64平臺的3.4.11庫&#xff0c;一個是基于arm平臺的4.7.0庫&#xff0c;現在我正常運行opencv的demo&#xff0c;直接報錯&#xff1a;沒有找到oencv…

貪心算法理論與實踐總結

文章目錄 一、貪心算法的基本概念二、貪心算法的適用條件三、貪心算法的設計步驟四、貪心算法的經典應用場景1. 區間調度問題2. 背包問題3. 最小生成樹&#xff08;MST&#xff09;4. 單源最短路徑&#xff08;Dijkstra算法&#xff09;5. 霍夫曼編碼6. 零錢兌換 五、貪心算法的…

在 AWS 上重構數據中臺,這家出海企業選擇了數棧

2024年&#xff0c;袋鼠云接到了一個不小的挑戰。 一家貨幣交易所的技術負責人在通話里直接說&#xff1a;“我們現在業務都跑在 AWS&#xff08;亞馬遜云平臺&#xff09; 上了&#xff0c;你們的產品&#xff08;數棧大數據平臺&#xff09;能不能不改代碼直接跑在 AWS 上&a…

STM32CubeIDE中文注釋變亂碼終極解決方案:3步設置永久解決錕斤拷問題!

STM32CubeIDE中文注釋變亂碼終極解決方案&#xff1a;3步設置永久解決錕斤拷問題&#xff01; 前言簡述問題STM32CubeIDE的設置STM32CubeIDE軟件的設置當前工程設置 最重要的一環——添加環境變量重要秘方具體做法 前言 你是否在STM32CubeIDE中遇到過這樣的崩潰場景&#xff1…

Windows VMWare Centos環境下安裝Docker并配置MySql

虛擬機安裝 官網下載Centos Stream 10系統鏡像 安裝了Minimal版&#xff0c;Terminal中粘貼、復制指令不方便&#xff0c;又新建了虛擬機&#xff0c;安裝GUI版 終端輸入指令報錯修復 輸入指令報錯&#xff1a;failed to set locale defaulting to C.UTF-8&#xff0c;安裝語言…

AI能力集成設計與Prompt策略

AI能力集成設計與Prompt策略 在智能客服系統中引入AI能力&#xff0c;必須建立一套架構化、可擴展的AI服務集成體系&#xff0c;并根據不同業務場景制定Prompt策略&#xff0c;從而實現穩定、精準、高效的AI響應能力。 AI能力集成的關鍵組件設計 AI能力集成架構的核心在于通…

深入剖析 CVE-2021-3560 與 CVE-2021-4034:原理、區別與聯系

CVE-2021-3560 和 CVE-2021-4034 是 2021 年曝光的兩個 Linux 本地權限提升漏洞&#xff0c;均涉及 Polkit 組件。由于它們影響廣泛且利用門檻較低&#xff0c;迅速引起安全社區關注。本文將深入分析這兩個漏洞的技術原理、影響范圍、區別與聯系&#xff0c;并結合實際案例&…

Jupyter Notebook 完全指南:從入門到生產力工具

Jupyter Notebook 完全指南&#xff1a;從入門到生產力工具 Jupyter Notebook 已成為數據科學、機器學習和科研領域的標準工具&#xff0c;它完美結合了代碼、文檔和可視化功能。本文將帶您全面了解 Jupyter 的強大功能&#xff0c;并展示如何將其轉化為您的超級生產力工具。 …

HKDF密鑰派生原理與應用詳解

HKDF&#xff08;HMAC-Based Key Derivation Function&#xff09;是一種基于 HMAC&#xff08;Hash-based Message Authentication Code&#xff09;的密鑰派生函數&#xff0c;用于從原始密鑰材料&#xff08;如共享密鑰、隨機數等&#xff09;生成多個加密密鑰&#xff08;如…

SpringBoot + MyBatis 事務管理全解析:從 @Transactional 到 JDBC Connection 的旅程

SpringBoot MyBatis 事務管理全解析&#xff1a;從 Transactional 到 JDBC Connection 的旅程 一、JDBC Connection&#xff1a;事務操作的真正執行者1.1 數據庫事務的本質1.2 Spring 與 Connection 的協作流程 二、從 Transactional 到 JDBC Connection 的完整鏈路2.1 Spring…

Wpf之應用圖標的修改!

前言 Wpf之應用圖標的修改&#xff01; 一、修改步驟 1、準備好ico圖片。 2、右鍵項目》點擊屬性 3、找到win32資源點擊 4、點擊瀏覽找到ioc圖標 5、點擊運行程序 6、右鍵項目點擊打開在資源管理器中打開 找到以下路徑 在該路徑下能看到.exe文件的圖標已經改成你想要的…

Spring Boot整合Redis指南

一、環境準備 在開始整合前&#xff0c;請確保已完成以下準備工作&#xff1a; 已安裝Redis服務&#xff08;安裝指南&#xff09;創建好Spring Boot項目 二、添加依賴 在項目的pom.xml中添加以下依賴&#xff1a; <!-- Redis核心依賴 --> <dependency><gr…

Re-攻防世界

easyEZbaby_app Jadx 這個文件一般是窗口界面&#xff0c;點擊中間的一般就是主函數 Obj1是用戶名&#xff0c;obj2是密碼 用戶名 public boolean checkUsername(String str) { if (str ! null) { try { if (str.length() ! 0 &&…

矩陣題解——搜索二維矩陣 II【LeetCode】

240. 搜索二維矩陣 II 1.1 核心思想 問題描述&#xff1a;給定一個 m x n 的二維矩陣&#xff0c;矩陣的每一行從左到右遞增&#xff0c;每一列從上到下遞增。判斷目標值 target 是否存在于矩陣中。解決思路&#xff1a; 從矩陣的右上角&#xff08;或左下角&#xff09;開始搜…

dockerfile文件詳解之基礎語法

dockerfile文件詳解之基礎語法 一般而言 Dockerfile 可以分為4個部分 &#xff08;1&#xff09;基礎鏡像信息&#xff0c; &#xff08;2&#xff09;維護者信息 &#xff08;3&#xff09;鏡像操作命令 &#xff08;4&#xff09;啟動時執行指令 1-注釋 用 # 來進行注…