數據庫的自增字段代碼生成器——解決不同數據庫自增字段的差異機制

數據庫的ID自增字段代碼生成器——解決不同數據庫自增字段的差異機制

問題:

在設計數據庫字段時,有時需要一個int型的id主鍵,讓它能自動遞增,每次插入一條數據,它都能夠自動增1或者規定的自增數n。對於特定的數據庫,要實現這個很簡單,比如mysql是用auto_incrementSql Server是用identity。但是如果在代碼中使用和特定數據庫有關的特性,那麼代碼就不能移植,比如把數據庫從mysql換成sql server,那麼代碼就要更改,就不能實現移植擴展。

解決思路:

既然要實現代碼的移植擴展,就不能使用和數據庫相關的特性,那該怎麼辦呢?這就是本篇要介紹的ID生成器。

思路是這樣的:在數據庫中另外建立一張表ID_Main,其包含兩個字段:一個字段是要實現ID自增的所屬表名(table_name),另一個字段是該表中自增字段對應的現在最大的記錄值(id_max)。假設現在要在數據表(user_info)中插入一條數據時,先使表ID_Main中對應字段table_name爲的user_infoid_max的值加1,然後再取出該值,就是自動增1後的值。以後每次要插入一條記錄,都會先使ID_Main表中對應的id值加1,再返回,其也就是保持了id的自增。

ID_Main的設計如下:

/*==============================================================*/

/* Table: ID_Main                                           */

/*==============================================================*/

create table ID_Main  (

   TABLE_NAME           VARCHAR2(20)                    not null,

   ID_MAX               NUMBER(10)                      not null,

   constraint PK_ ID_Main primary key (TABLE_NAME)

);

comment on table ID_Main is '用於維護各個表中的記錄條數';

 

 

以下就是代碼層,以Java分析爲例:

其中的DbUtility類是連接數據庫操作的封裝類,其代碼詳細參見《分頁技術原理與實現()》。代碼使用了connection的事務操作,保證事務的一致性,也就是當ID_MAX的值自增1時,應該在相應的表中插入一條記錄,以保證自增值一致。如果出錯,這應該回滾事務。

通過以上分析與代碼示例,就簡單的實現了一個IDGeneratorID生成器,它與數據庫的特性隔離,實現了代碼層的移植性。

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章