作者:
Flyingis 在前面的一篇日志里面,我设计了在数据库表中自动生成ID号的一种算法(
点击这里查看),这个算法主要应用于字典表的修改中。字典表的ID号是这样设计的:A01、A05、A28等等,即一位字母+两位数字。由于每个字典表的ID号的第一个字母对于一个字典表来说是固定的,这样做的目的在于在其它表中查看数据的时候可以很容易分辨字典项的ID号是属于哪一个数据字典的,因此这就限制了每个字典表的数据不能超过99条,当数据量大于99条的时候,那个算法就不再适用。
因此这里给出了一个改进的算法(其实只作了一点点改进),可以满足数据在1~999条之间的数据字典,这对于绝大多数应用来说已经是绰绰有余了。下面就给出具体的方法:
/*
* 功能:增加字典信息时,自动生成最小的ID号码
* 参数:String 字典表名称 first 字典ID的首字母,代表唯一的字典
* 返回:String 生成的最小ID号码
*/
public String getId(String table, String first) {
// 所有除去首字母后的ID号码--整型,例如:11
int[] sid;
// 所有原始ID号码,例如:A011
String[] rid;
// 除去首字母后最小的ID号码--字符串
String sid_new = null;
// 程序返回的最小的原始ID号码
String rid_new = null;
// 循环参数
int i = 0;
int k = 0;
con = DatabaseConnection.getConnection("jdbc/wutie";
Statement stm = null;
ResultSet rst = null;
RowSet rowRst = null;
String sql = "SELECT * FROM " + table + " order by id";
try {
if (con.isClosed()) {
throw new IllegalStateException("error.sql.unexpected";
}
stm = con.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE);
rst = stm.executeQuery(sql);
while (rst.next()) {
k++;
}
sid = new int[k];
rid = new String[k];
rst = stm.executeQuery(sql);
// 如果不存在结果集,则直接在first字母后面加001,例如first="A",rid_new=A001
if (!rst.first()) {
rid_new = first.concat("001";
return rid_new;
}
// 如果存在结果集,则将表中所有ID号存入数组中,并转换为整型数据
else {
/*
while (rst.next()) {
rid[i] = rst.getString("id";
sid[i] = Integer.parseInt(rid[i].substring(1));
i++;
}
*/
for (rst.previous(); rst.next(); i++) {
rid[i] = rst.getString("id";
sid[i] = Integer.parseInt(rid[i].substring(1));
}
// 如果第一条记录ID号不为fisrt+001,例如A003、A018、A109等,则返回新增数据的ID号为A001
if (sid[0] != 1) {
rid_new = first.concat("001";
return rid_new;
}
// 如果第一条记录ID号为first+001,即A001,则执行下面语句
else {
// 如果总记录数只有一条,例如A001,则返回新增数据为A002
if (i == 1) {
rid_new = first.concat("002";
return rid_new;
}
else {
for (int j = 1; j < k; j++) {
// 如果相邻两条记录ID号的整数位相差1,则保存新增数据ID号整数位是前一位ID号整数位加1
if (sid[j] == sid[j-1] + 1) {
if (sid[j] < 9) {
sid_new = String.valueOf(sid[j] + 1);
rid_new = first.concat("00".concat(sid_new);
}
else if (sid[j]>9 && sid[j]<100){
sid_new = String.valueOf(sid[j] + 1);
rid_new = first.concat("0").concat(sid_new);
}
else {
sid_new = String.valueOf(sid[j] + 1);
rid_new = first.concat(sid_new);
}
}
// 如果相邻两条记录ID号的整数位相差非1,则返回新增数据ID号整数位是前一位ID号整数位加1
if (sid[j] != sid[j-1] + 1) {
if (sid[j-1] < 9) {
sid_new = String.valueOf(sid[j-1] + 1);
rid_new = first.concat("00".concat(sid_new);
return rid_new;
}
else if (sid[j]>9 && sid[j]<100){
sid_new = String.valueOf(sid[j-1] + 1);
rid_new = first.concat("0").concat(sid_new);
}
else {
sid_new = String.valueOf(sid[j-1] + 1);
rid_new = first.concat(sid_new);
return rid_new;
}
}
}
return rid_new;
}
}
}
}
catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException("error.sql.runtime";
}
finally {
try {
stm.close();
con.close();
}
catch (SQLException e1) {
e1.printStackTrace();
throw new RuntimeException("error.sql.runtime";
}
}
}
注意:之所以生成A01而不是A1,是因为在SQLServer2000中根据ID号正确排序的需要,如果按照升序排列,A1后面是A10、A11等,而不是A2。另外,在Hibernate中有多种自动生成ID字段的方法,但是这个项目比较小,我没有使用Hibernate中间件,这里提供的只是生成字典ID字段的一种简单思路,相比
原有算法改进了一点,可以适用于字典项不多于1000项的情况,一般情况下,字典项是不可能超过1000项了,在我参与的这个小项目中已经是完全够用了。还有什么更好的方法和思路还请大家多指教!
分享到:
相关推荐
在Java编程中,自动生成ID是一项常见的需求,特别是在数据库记录、分布式系统节点标识等领域。"java自动生成id策略"指的是设计并实现一种机制,确保在多线程环境下能够高效、唯一地生成ID。这里我们将详细探讨这个...
在Java中,生成ID号的方法有很多种,例如自增序列、UUID、雪花算法等。 1. **UUID(Universally Unique Identifier)**:UUID是一个128位的数字,由时间戳、随机数和节点ID组成,几乎可以确保全局唯一性。在Java中...
全局唯一ID作为一种唯一标识来区分数据,可用作订单号、用户ID等。ID生成器是生成全局唯一ID的工具,可封装为一种基础服务为其他业务提供服务。因此此项目就是用springboot封装ID生成器,让各种业务系统调用
在实现时,可以建立一个包含所有地区编码的数据库或字典,用于验证输入的前6位是否合法。 3. **出生日期转换** - 身份证号码中的出生日期是YYYYMMDD格式,需要将其转换为标准日期格式。Java中可以使用`...
在实际应用中,雪花算法常被用在数据库主键生成、订单号生成、用户唯一标识等领域。`snowflakes`这个文件可能是一个Java实现雪花算法的源代码文件,它包含了雪花算法的具体实现逻辑,可以作为理解和使用雪花算法的一...
在Java编程中,生成唯一的ID(Universal Unique Identifier,UUID)是一项常见的需求,特别是在数据库记录、分布式系统中的对象标识等方面。UUID是一种128位的数字,通常以32个字符的16进制形式表示,确保在全球范围...
在Java分布式环境中,生成唯一的ID(唯一标识符)是一个至关重要的任务,特别是在高并发和大数据量的场景下。这样的需求通常出现在数据库主键、订单号、用户唯一标识等业务场景中。下面我们将深入探讨Java分布式代码...
描述中的博文链接指向了一篇可能详细介绍如何在Java环境中使用Redis实现订单号生成的文章。虽然具体的细节没有给出,但我们可以根据通常的实现方式来探讨这个主题。 首先,`DataFactory.java`可能是一个工厂类,...
7. **工具类的设计**:在Java等编程语言中,订单号生成工具类通常会设计为线程安全,提供静态方法供调用,以确保在多线程环境下的正确性。同时,可以考虑提供配置项,允许用户自定义订单号的格式和生成策略。 8. **...
一种常见的方式是使用随机数生成器,如Java中的`java.util.Random`或者Python的`random`库,来创建随机数字序列。为了确保卡号的唯一性,生成器可能结合了时间戳、序列号或者其他变量,以降低重复的可能性。另一种...
在实现这些算法时,可以使用Java编程语言,因为描述中提到Java是主要使用的语言。例如,方案三的Java实现可能如下: ```java public String generateOrderId(int machineId) { return String.format("%04d", ...
自动编号算法是一种在软件系统或数据库中自动生成唯一标识符的方法。这种算法通常用于确保每一个记录都有一个唯一的编号,以便于追踪和管理。在实际应用中,自动编号可以是连续的数字序列、日期时间戳、或者更复杂的...
2. **数据库设计**:在Java图书管理系统中,数据库是存储书籍信息、用户信息以及借阅状态的关键部分。通常会设计如下的数据表: - 图书表(Book):包含书名、作者、出版社、ISBN号、库存数量等字段。 - 用户表...
Java中的UUID(Universally Unique Identifier)是一种用于生成全局唯一标识符的标准,由开源软件基金会(OSF)在分布式计算环境中提出。UUID的主要目的是确保在分布式系统中的任何元素都有其独特的识别信息,无需...
在IT开发领域,生成不重复的编号或标识符是一个常见的需求,特别是在数据库记录、订单号、唯一用户ID等场景。为了满足这一需求,开发者经常利用系统时间作为基础,结合其他算法来生成这样的唯一序列。标题提到的...
在Java的持久化框架Hibernate中,主键生成策略是一个至关重要的概念,它决定了数据库表中主键值如何自动生成。主键通常是表中唯一标识记录的一列,对于数据的完整性和一致性至关重要。以下是对Hibernate中主键生成...
8. 分布式唯一ID生成器:在大型系统中,可能需要使用分布式ID生成器(如Snowflake算法或UUID)来生成全局唯一的用户ID,这样即使登录名相同,也可以通过ID区分不同的用户。 9. 缓存策略:为了提高性能,可以将已...
### 使用Java实现多级下拉菜单的关键技术和方法 #### 实现基本思想 为了提升用户体验,减少用户登录系统时的等待时间,在服务器端处理大部分逻辑变得至关重要。本文介绍的方法旨在通过服务器端逻辑处理来减少客户端...
总结,从数据库生成序列ID是Java开发中常见的任务,可以通过JDBC直接操作数据库,也可以利用JPA和ORM框架进行抽象。根据具体场景选择合适的方法,可以有效地管理序列ID的生成,保证数据的一致性和唯一性。在无数据库...