首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 實現資料字典 ID 自動生成:處理間隙與字母前綴的演算法設計

     編輯:Java 相關知識

業務背景

Struts B/S 系統的資料字典表結構 table(id, name),ID 格式為 A01、A02、B10、C12... 每字典分配一字母前綴,便於除錯識別。新增時需自動生成連續 ID(含補齊刪除產生的間隙)。

演算法核心邏輯

  1. 查詢該字典(字母前綴)現有最大 ID。
  2. 若無資料,起始為 X01(X 為前綴)。
  3. 解析現有 ID 數字部分,找出最小缺失正整數(補齊間隙)。
  4. 格式化為兩位數(01~99),組合新 ID。
  5. 插入資料庫。

關鍵代碼片段(原文以圖片形式呈現,此處重構邏輯)

public String generateNextId(String prefix, Connection conn) throws SQLException {
    // 1. 查詢該前綴所有 ID
    String sql = "SELECT id FROM dict_table WHERE id LIKE ? ORDER BY id";
    try (PreparedStatement ps = conn.prepareStatement(sql)) {
        ps.setString(1, prefix + "%");
        ResultSet rs = ps.executeQuery();

        // 2. 收集現有數字後綴
        Set used = new TreeSet<>();
        while (rs.next()) {
            String id = rs.getString("id");
            if (id.length() == 3) { // 前綴1碼 + 2位數
                try {
                    int num = Integer.parseInt(id.substring(1));
                    used.add(num);
                } catch (NumberFormatException ignored) {}
            }
        }

        // 3. 找最小缺失正整數 (1~99)
        int next = 1;
        for (int n : used) {
            if (n == next) next++;
            else if (n > next) break; // 找到間隙
        }
        if (next > 99) throw new IllegalStateException("ID 耗盡 (超過 99)");

        // 4. 格式化
        return prefix + String.format("%02d", next);
    }
}

設計考量

  • 兩位數格式:確保 SQL ORDER BY id 排序正確(A1 會排在 A10 之前)。
  • 間隙重用:刪除 A02 後,新增優先補 A02 而非 A04。
  • 擴充性:超過 99 筆需擴充位數(修改格式化模板與解析邏輯)。
  • 替代方案:Hibernate 提供多種 ID 生成策略(sequence, identity, uuid 等),大型系統建議採用成熟框架。

適用範圍

資料字典項目 ≤ 100、單字母前綴、需連續編號且重用間隙的輕量級場景。大規模或高併發環境請使用資料庫序列或分散式 ID 生成器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved