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;
|
从技术上分析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"));
|