在jfinal实现oracle”自增主键“保存入库,并获取自生成的主键

oracle数据库其实是没有自增主键的,但为了达到这一效果 ,可以采取以下方式间接实现:

1、利用sequence自动力产生一个主键 ,然后将该值设置到主键上,并保存入库具体代码如下:

insert into t_blog(id,title,content) value(blogseq.nextVal,'测试。。。。','这仅仅是一篇测试文章 ') ;

2、利用触发器实现自将sequence的值设置到主键上,这时可以采用以下方法实现数据录入

insert into t_blog(title,content) value('测试。。。。','这仅仅是一篇测试文章 ') ;

方法2与我们经常使用mysql等数据录入方式一式,因此我们首选方法2,具体创建sequence ,触发器的脚本如下:

create table T_BLOG

(

  ID      NUMBER not null,

  TITLE   VARCHAR2(100),

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

 

 

 

 

你可能感兴趣的:(oralce,jFinal,自增主键)