您的当前位置:首页spring jdbcTemplate insert插入Oracle数据库后返回当前主键id

spring jdbcTemplate insert插入Oracle数据库后返回当前主键id

2023-11-12 来源:六九美食网

最近做一个spring版本3.0.4的老项目功能,应用场景要用到jdbctemplate插入oracle表后返回主键ID拿来和其他表关联。

用oralce的可以一直用这种处理方式,高兼容低。

public long insertOraGetId(final QuetInvtHeadVO headVO) { KeyHolder keyHolder = new GeneratedKeyHolder(); jdbcTemplate.update(new PreparedStatementCreator() { public PreparedStatement createPreparedStatement(Connection conn) throws SQLException { String sql = "insert into table values (seq_quet_invt_id.nextval,?,?,?,?,?,?,?,?,?)"; PreparedStatement ps = conn.prepareStatement(sql,new String[] {"id"}); ps.setString(1, headVO.getHeadType()); return ps; } },keyHolder); return keyHolder.getKey().longValue();} 

new string[] {"id"} 就是返回插入数据后序列增长后的主键,我已经应用到老项目中,处理稳定。

 

spring jdbcTemplate insert插入Oracle数据库后返回当前主键id

标签:int   statement   插入数据   seq   java   alc   res   tor   rate   

小编还为您整理了以下内容,可能对您也有帮助:

oracle数据库,表中有id(自增字段,主键), insert 语句插入一条记录后要求,返回当前插入记录的id値。

sequence就是一个序列,你每次执行 select CASE_SEQ.nextval from al 的时候都会返回唯一的一个ID号,因此你可以先执行这个select取到这个ID,如果这个时候有多个用户在执行这个操作,那么他们select到的ID绝对跟你的不一样(sequence就是保证这一点的)。然后你就可以用这个ID插入记录,然后再返回这个ID就OK了。

代码:

string sql = "Select CASE_SEQ.currval from al";

OracleConnection conn = DB.getCon();

OracleCommand cmd = conn.CreateCommand();

conn.Open();

string returnID = null;

cmd.CommandText = sql;

returnID = Convert.ToString(cmd.ExecuteScalar()); //获取ID

sql = "insert into PATIENT_T(pid,name) values(returnID,'黎明')"; //将ID插入数据库

cmd.CommandText = sql;

cmd.ExecuteNonQuery();

conn.Close();

结束了,差不多就是这样,楼主自己调试一下就行了,注意ID在数据库中应该是varcahr类型的

java 用 jdbc 插入一条信息返回当前信息的主键id 怎样写 oracle的数据库 主键序列自增

有两种方法可以设置主键,一种是自增长主键,另一种就是生成唯一序列。

一、自增长主键

--首先建一个表TEST

create table TEST

(

NID int PRIMARY KEY,

test1 varchar2(20),

test2 varchar2(20),

test3 varchar2(20),

test4 varchar2(20),

test5 varchar2(20)

)

-- 再建一个序列SEQ_TEST

create sequence SEQ_TEST

minvalue 1 --最小值

nomaxvalue --不设置最大值

start with 1 --从1开始计数

increment by 1 --每次加1个

nocycle --一直累加,不循环

nocache; --不建缓冲区

以上代码完成了一个序列(sequence)的建立过程,名称为SEQ_TEST,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,如果你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下如果你给出了cache值那么系统将自动读取你的cache值大小个seq,这样在反复操作时会加快运行速度,但如果遭遇意外情况如当机了或Oracle死了,则下次取出的seq值将和上次的不连贯.(如果连不连贯无所谓建议用cache,因为时间就是金钱呀!)

你只有了表和序列还不够,最好再建一个触发器来执行它!代码如下:

CREATE OR REPLACE TRIGGER tg_test

BEFORE INSERT ON test FOR EACH ROW WHEN (new.nid is null)

begin

select seq_test.nextval into:new.nid from al;

end;

下面是测试

select * from test

insert into test(nid,test1) values(6,'aaa')

insert into test(test1) values('bbb')

jdbcTemplate插入MYSQL时怎么返回主键ID

Statement暴露以下方法可以访问到主键:ResultSet getGeneratedKeys() throws SQLException;

为了简化该方法的使用,轻松获得RDBMS生成的主键,Spring内置了KeyHolder接口及GeneratedKeyHolder实现者。

下面的类的内置方法中都使用到了KeyHolder,可以使用他来访问主键。

JdbcTemplate: int update(PreparedStatementCreator psc,KeyHolder generatedKeyHolder) throws DateAccessException;

NamedParameterJdbcTemplate的两个update方法

SimpleJdbcInsert辅助类。

SqlUpdate辅助类。

等。

DataFieldMaxValueIncrementer继承链。

能够返回全局唯一、递增的取值,这种特性是企业应用的常见需求,考虑到RDBMS的不同情况,Spring提供了DataFieldMaxValueIncrementer接口,这些方法返回唯一的、递增的、不同类型的取值。

各个数据库底层都以此类为接口,来实现具体的业务逻辑。

比如:Oracle:OracleSequenceMaxValueIncrementer实现类采用Oracle数据库支持的序列发生器。

HsqlMaxValueIncrementer采用HSQLDB的表实现,从而模拟了序列发生器的行为等。

类似的还有:

MysqlMaxValueIncrementer

DerbyMaxValueIncrementer

SybaseMaxValueIncrementer

SqlServerMaxValueIncrementer

PostgreSqlSequenceMaxValueIncrementer

DB2SequenceMaxValueIncrementer

H2SequenceMaxValueIncrementer等等

Spring JDBC对行集的支持:

RowSet,用于它能够以JavaBean方式同RDBMS数据进行交互,因此比ResultSet更为灵活。

JdbcTemplate内置queryForRowSet()方法集合。

NamedParameterJdbcTemplate内置的queryForRowSet()方法集合。

都可以很方便的获取到RowSet对象,方便数据库的操作。

spring jdbcTemplate 执行update更新后怎样返回更新的记录主键?

KeyHolder keyHolder = new GeneratedKeyHolder();

jdbcTemplate.update( new PreparedStatementCreator(){

@Override

public PreparedStatement createPreparedStatement(Connection conn) throws SQLException{

PreparedStatement ps = conn.prepareStatement(SQL_ADD, new String[] {});

ps = conn.prepareStatement(YOUR_SQL_SCRIPT, Statement.RETURN_GENERATED_KEYS);

ps.setString(1, "TEST");

ps.setInt(2, 1);

//...

return ps;

}

},

keyHolder);

return keyHolder.getKey().intValue();追问。。。。。谢谢,但是有点看不懂啊。。。YOUR_SQL_SCRIPT是什么

追答YOUR_SQL_SCRIPT : insert table ....

显示全文