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则可以保证顺序,并且具有良好的唯一性,适合多用户、大数据量的高可用性场景。