在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"));

相关文章
相关标签/搜索