在jfinal實現oracle」自增主鍵「保存入庫,並獲取自生成的主鍵

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;

 

 

         從技術上分析jfinalOracle自增字段不給予支持緣由是,自增字段保存後,獲取到的主鍵是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"));

相關文章
相關標籤/搜索