新聞中心
在數(shù)據(jù)庫設(shè)計中,主鍵是被用來唯一標識一條記錄的一個或一組字段,是保證數(shù)據(jù)完整性的一個重要組成部分。而生成主鍵ID就是為了防止數(shù)據(jù)重復(fù)而設(shè)定一個唯一的標識符,并且它的格式一般都是整數(shù)或字符型。然而,在很多情況下,數(shù)據(jù)庫的主鍵ID需要手動輸入或手動生成,這對系統(tǒng)的開發(fā)和部署帶來了一定的麻煩。本文將介紹如何利用的方法,幫助開發(fā)者更輕松地完成這一步驟。

目前成都創(chuàng)新互聯(lián)已為1000多家的企業(yè)提供了網(wǎng)站建設(shè)、域名、網(wǎng)絡(luò)空間、網(wǎng)站改版維護、企業(yè)網(wǎng)站設(shè)計、梓潼網(wǎng)站維護等服務(wù),公司將堅持客戶導(dǎo)向、應(yīng)用為本的策略,正道將秉承"和諧、參與、激情"的文化,與客戶和合作伙伴齊心協(xié)力一起成長,共同發(fā)展。
方法一、使用UUID生成主鍵ID
方法一:使用UUID
UUID是一種通用唯一識別碼的縮寫,作為標準的制定者是微軟公司,但它在開源領(lǐng)域得到了廣泛應(yīng)用。其優(yōu)點在于它可以生成一個唯一的ID,而且可以在一定程度上防止數(shù)據(jù)碰撞。因此,在Java中很多ORM框架和數(shù)據(jù)庫工具庫都有uuid的封裝,比如Hibernate、Mybatis等等。
Java代碼示例:
“` java
import java.util.UUID;
public class PrimaryKeyUtil {
public static String getUUID() {
UUID uuid = UUID.randomUUID();
String str = uuid.toString();
// 去掉”-“符號
return str.replaceAll(“-“, “”);
}
}
“`
方法二、使用SnowFlake生成主鍵ID
方法二:使用SnowFlake算法
SnowFlake算法是Twitter官方開源的分布式ID生成算法,其核心思想是將一個64位的整數(shù)分配給每個機器,然后再將這個64位的整數(shù)分成三個部分:41位作為時間戳,10位作為機器ID,12位作為序列號,這樣可以保證在同一機器上同時生成主鍵時不會沖突。SnowFlake算法的優(yōu)點在于其規(guī)律性和唯一性,在分布式場景下也有著很好的性能表現(xiàn)。
Java代碼示例:
“` java
public class PrimaryKeyUtil {
/**
* 起始的時間戳
*/
private final static long START_TIMESTAMP = 1480166465631L;
/**
* 每一部分占用的位數(shù)
*/
private final static long SEQUENCE_BIT = 12;
private final static long MACHINE_BIT = 5;
private final static long DATACENTER_BIT = 5;
/**
* 每一部分的更大值
*/
private final static long MAX_DATACENTER_NUM = ~(-1L
private final static long MAX_MACHINE_NUM = ~(-1L
private final static long MAX_SEQUENCE = ~(-1L
/**
* 每一部分向左的位移
*/
private final static long MACHINE_LEFT = SEQUENCE_BIT;
private final static long DATACENTER_LEFT = SEQUENCE_BIT + MACHINE_BIT;
private final static long TIMESTAMP_LEFT = DATACENTER_LEFT + DATACENTER_BIT;
private static long datacenterId = 1L; // 數(shù)據(jù)中心
private static long machineId = 1L; // 機器標識
private static long sequence = 0L; // 序列號
private static long lastTimeStamp = -1L;// 上一次時間戳
/**
* 生成下一個ID
*
* @return String類型的ID
*/
public synchronized static String nextId() {
long currTimeStamp = getNewTimeStamp();
if (currTimeStamp
throw new RuntimeException(“Clock moved backwards. Refusing to generate id”);
}
if (currTimeStamp == lastTimeStamp) {
sequence = (sequence + 1) & MAX_SEQUENCE;
if (sequence == 0L) {
currTimeStamp = getNextTimeStamp();
}
} else {
sequence = 0L;
}
lastTimeStamp = currTimeStamp;
return (currTimeStamp – START_TIMESTAMP)
| datacenterId
| machineId
| sequence;
}
private static long getNextTimeStamp() {
long timeStamp = getNewTimeStamp();
while (timeStamp
timeStamp = getNewTimeStamp();
}
return timeStamp;
}
private static long getNewTimeStamp() {
return System.currentTimeMillis();
}
}
“`
在實現(xiàn)自動生成數(shù)據(jù)庫主鍵ID時,應(yīng)根據(jù)需求進行選擇。使用UUID可以簡單實現(xiàn)自動生成主鍵ID,并且具有很高的唯一性,但是其序列號可能過于隨機,不適合需要排序的數(shù)據(jù),而使用SnowFlake算法生成主鍵ID則可以保證順序,并且具有良好的唯一性,適合多用戶、大數(shù)據(jù)量的高可用性場景。
相關(guān)問題拓展閱讀:
- Java主鍵序列生成,需求如下.
- java程序往mysql數(shù)據(jù)庫中插入數(shù)據(jù),主鍵ID是varchar型的,是數(shù)字
Java主鍵序列生成,需求如下.
思路:
序列生成方法入?yún)⒈仨氂猩霞壊藛涡蛄小⒉藛渭墑e陵鉛;如尺耐好果是一級菜單上級菜單序列為空
引入數(shù)據(jù)庫或者文件保存已生成的菜單,兩個方法,一個讀,一個寫,注意并發(fā)操作(加同步鎖)
每次調(diào)用序列生成方法時根據(jù)上級菜單序列創(chuàng)建其他菜單,,如果上級菜單序列為空時讀取文件取更大上級菜單序列再加1,否則直接遞增子菜單再寫入文畝肆件
需求都這么明確了,自己組主鍵唄
java程序往mysql數(shù)據(jù)庫中插入數(shù)據(jù),主鍵ID是varchar型的,是數(shù)字
因為你的eid是varchar類型的,所以在排序的時候 10是等于壹零 而不是十,所以就會出現(xiàn)1后面排序10的情況了,除非你在查詢的時候把eid轉(zhuǎn)成integer,然后再按照integer的排序,就可以實現(xiàn)順序排列了.
關(guān)于java生成數(shù)據(jù)庫主鍵id的介紹到此就結(jié)束了,不知道你從中找到你需要的信息了嗎 ?如果你還想了解更多這方面的信息,記得收藏關(guān)注本站。
香港服務(wù)器選創(chuàng)新互聯(lián),2H2G首月10元開通。
創(chuàng)新互聯(lián)(www.cdcxhl.com)互聯(lián)網(wǎng)服務(wù)提供商,擁有超過10年的服務(wù)器租用、服務(wù)器托管、云服務(wù)器、虛擬主機、網(wǎng)站系統(tǒng)開發(fā)經(jīng)驗。專業(yè)提供云主機、虛擬主機、域名注冊、VPS主機、云服務(wù)器、香港云服務(wù)器、免備案服務(wù)器等。
標題名稱:Java實現(xiàn)自動生成數(shù)據(jù)庫主鍵ID(java生成數(shù)據(jù)庫主鍵id)
網(wǎng)頁路徑:http://m.fisionsoft.com.cn/article/cdijjio.html


咨詢
建站咨詢
