JdbcTemplate下访问Oracle数据库插入数据时返回序列增长的主键

本文介绍如何在使用Spring下的JdbcTemplate操作Oracle数据库时,通过编写特定SQL语句并配合GeneratedKeyHolder来获取由序列增长的主键ID,避免了传统方法在返回主键ID上的局限。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >



JdbcTemplate下访问Oracle数据库插入数据时返回序列增长的主键

最近由于 使用的是Spring下的JdbcTemplate 来操作Oracle数据库,主键使用的是序列,但是一般的query和update虽然都能执行INSERT操作语句,但是在碰到需要返回主键ID的情况下时就没办法了。然后百度和Google了很多资料,有的方法完全不行,特别是百度排前面的一些资料。可能是版本问题吧。


环境:
Spring 3.1.2

Oracle 9/10g


首先是写SQL语句:

  1. INSERT INTO TEST (TEST_ID, TEST_NAME) VALUES (SEQ_TEST.NEXTVAL, :testName)  
INSERT INTO TEST (TEST_ID, TEST_NAME) VALUES (SEQ_TEST.NEXTVAL, :testName)


然后最好后面不要加分号(;),碰到过加了分号反而不能运行的情况。


然后给要插入的Bean创建好并赋值:

  1. Test test = new Test();  
  2. test.setTestName("Test");  
Test test = new Test();
test.setTestName("Test");


然后执行下面的代码

  1. JdbcTemplate jt = *******;  
  2.   
  3. NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jt);  
  4.           
  5. GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();  
  6. SqlParameterSource paramSource = new BeanPropertySqlParameterSource(test);  
  7.           
  8. namedParameterJdbcTemplate.update(sql, paramSource, generatedKeyHolder, new String[]{"TEST_ID"});  
  9.           
  10. Number number = generatedKeyHolder.getKey();  
  11.           
  12. // 返回的主键  
  13. Long id = number.longValue();  
	JdbcTemplate jt = *******;

	NamedParameterJdbcTemplate namedParameterJdbcTemplate = new NamedParameterJdbcTemplate(jt);
			
	GeneratedKeyHolder generatedKeyHolder = new GeneratedKeyHolder();
	SqlParameterSource paramSource = new BeanPropertySqlParameterSource(test);
	        
	namedParameterJdbcTemplate.update(sql, paramSource, generatedKeyHolder, new String[]{"TEST_ID"});
	        
	Number number = generatedKeyHolder.getKey();
			
	// 返回的主键
	Long id = number.longValue();


上面的那个 new String[]{"TEST_ID"} 就是表示要返回的值的表的列名。JdbcTemplate 就使用你们自己的方法获取就可以了。


评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值