最近做一个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 ....