oracle數據庫實際上是沒有自增主鍵的,但爲了達到這一效果 ,能夠採起如下方式間接實現: mysql
1、利用sequence自動力產生一個主鍵 ,而後將該值設置到主鍵上,並保存入庫具體代碼以下: sql
insert into t_blog(id,title,content) value(blogseq.nextVal,'測試。。。。','這僅僅是一篇測試文章 ') ; 數據庫
2、利用觸發器實現自將sequence的值設置到主鍵上,這時能夠採用如下方法實現數據錄入 oracle
insert into t_blog(title,content) value('測試。。。。','這僅僅是一篇測試文章 ') ; 測試
方法2與咱們常用mysql等數據錄入方式一式,所以咱們首選方法2,具體建立sequence ,觸發器的腳本以下: google
create table T_BLOG spa
( .net
ID NUMBER not null, code
TITLE VARCHAR2(100), blog
CONTENT VARCHAR2(2000),
constraint PK_BLOG primary key (ID)
);
create sequence BLOG_SEQ
minvalue 1
NOMAXvalue
start with 1
increment by 1
nocache;
CREATE OR REPLACE TRIGGER BLOG_SERIALNUMBER
BEFORE INSERT OR UPDATE OF ID ON T_BLOG
FOR EACH ROW
BEGIN
if ( :new.id = 0 or :new.id is null ) then
SELECT blog_seq.nextval into :new.id from dual;
end if;
END;
在jfinal最新發布的 jfinal-1.1.1-rc-bin.jar 解決 Oracle 下 Model.save() 以及 Db.save(...) 不支持自增主鍵的問題,但測試發現不能獲取到自產生的主鍵,分析緣由以下:
Jfinal-1.1.1裏對於所謂的oracle自增主鍵建議採起手動設置主鍵的方式,代碼以下:
Book book = getModel(Book.class);
book.set("ID", Db.queryBigDecimal("select SEQ_ABC.nextval from dual").intValue());
book.save();
這種手動設置的方法,我的認爲沒有從根本上解決oracle自增的問題,經過查看Model源碼中的save方法,發現其實根本沒有對oracle自增主鍵提供支持,這裏僅僅是避過了這個問題。
Model.save()方法片段:
conn = DbKit.getConnection(); boolean isSupportAutoIncrementKey = DbKit.dialect.isSupportAutoIncrementKey(); if (isSupportAutoIncrementKey) pst = conn.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS); else pst = conn.prepareStatement(sql.toString()); for (int i=0, size=paras.size(); i<size; i++) { pst.setObject(i + 1, paras.get(i)); } result = pst.executeUpdate(); if (isSupportAutoIncrementKey) getGeneratedKey(pst, tableInfo); getModifyFlag().clear(); return result >= 1;
|
從技術上分析jfinal對Oracle自增字段不給予支持緣由是,自增字段保存後,獲取到的主鍵是oracle.sql.RowID。
爲了觖決這個問題,經過google搜索,找到了解決辦法,具體代碼以下:
Connection conn = null; PreparedStatement pst = null; int result = 0; try { conn = DbKit.getConnection(); boolean isSupportAutoIncrementKey = DbKit.dialect .isSupportAutoIncrementKey(); if (conn.getMetaData().getDatabaseProductName().toLowerCase() .indexOf("oracle") > -1) { String generatedColumns[] = { tableInfo.getPrimaryKey() }; pst = conn.prepareStatement(sql.toString(), generatedColumns); } else if (isSupportAutoIncrementKey) { pst = conn.prepareStatement(sql.toString(), Statement.RETURN_GENERATED_KEYS); } else { pst = conn.prepareStatement(sql.toString()); }
for (int i = 0, size = paras.size(); i < size; i++) { pst.setObject(i + 1, paras.get(i)); }
result = pst.executeUpdate(); // if (isSupportAutoIncrementKey) getGeneratedKey(pst, tableInfo); getModifyFlag().clear(); return result >= 1;
|
黃色標註的是核心代碼
具體解釋請看此處:http://blog.csdn.net/wangfang_0728/article/details/6561042
保存入庫時,能夠按以下方式操做:
Blog blog = getModel(Blog.class); System.out.println("保存前的主鍵--->"+blog.getBigDecimal("ID")); blog.save(); System.out.println("新記錄的主鍵--->"+blog.getBigDecimal("ID")); |