Java实现自动生成数据库主键ID (java生成数据库主键id)

在数据库设计中,主键是被用来唯一标识一条记录的一个或一组字段,是保证数据完整性的一个重要组成部分。而生成主键ID就是为了防止数据重复而设定一个唯一的标识符,并且它的格式一般都是整数或字符型。然而,在很多情况下,数据库的主键ID需要手动输入或手动生成,这对系统的开发和部署带来了一定的麻烦。本文将介绍如何利用的方法,帮助开发者更轻松地完成这一步骤。

方法一、使用UUID生成主键ID

方法一:使用UUID

UUID是一种通用唯一识别码的缩写,作为标准的制定者是微软公司,但它在开源领域得到了广泛应用。其优点在于它可以生成一个唯一的ID,而且可以在一定程度上防止数据碰撞。因此,在Java中很多ORM框架和数据库工具库都有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位的整数分配给每个机器,然后再将这个64位的整数分成三个部分:41位作为时间戳,10位作为机器ID,12位作为序列号,这样可以保证在同一机器上同时生成主键时不会冲突。SnowFlake算法的优点在于其规律性和唯一性,在分布式场景下也有着很好的性能表现。

Java代码示例:

“` java

public class PrimaryKeyUtil {

/**

* 起始的时间戳

*/

private final static long START_TIMESTAMP = 1480166465631L;

/**

* 每一部分占用的位数

*/

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; // 数据中心

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();

}

}

“`

在实现自动生成数据库主键ID时,应根据需求进行选择。使用UUID可以简单实现自动生成主键ID,并且具有很高的唯一性,但是其序列号可能过于随机,不适合需要排序的数据,而使用SnowFlake算法生成主键ID则可以保证顺序,并且具有良好的唯一性,适合多用户、大数据量的高可用性场景。


数据运维技术 » Java实现自动生成数据库主键ID (java生成数据库主键id)