shijiebao 2010-07-01 17:46
浏览 1014
已采纳

spring JdbcTemplate批量插入 怎么获得数据库自动增长的id

如下,插入一条记录的时候可以这样返回id(一下代码只是说明事例):
[code="java"]
//保存一个test对象,并返回该对象
public Test save(Test test){
KeyHolder keyHolder = new GeneratedKeyHolder();
getJdbcTemplate().update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(
Connection con) throws SQLException {
PreparedStatement ps = con.prepareStatement("insert into tb_test (name,sex) values (?,?)",
Statement.RETURN_GENERATED_KEYS);
ps.setString(1, test.getName());
ps.setString(2, test.getSex());
return ps;
}
}, keyHolder);
//这里可以获得数据库id
test.setId(Integer.valueOf(keyHolder.getKeyList().get(0)
.toString()));
return test;
}
// 批量插入,
public List saveOrUpdateAll(final List list) {
getJdbcTemplate().batchUpdate(
"insert into tb_test (name,sex) values (?,?)",
new BatchPreparedStatementSetter() {
@Override
public void setValues(PreparedStatement ps, int i)
throws SQLException {
ps.setString(1, list.get(i).getName());
ps.setString(2, list.get(i).getSex());
}
@Override
public int getBatchSize() {
return list.size();
}
});
//哪个方法可以获得list中每个test对象的id?我不想重新进行查询
return list;
}
[/code]

  • 写回答

3条回答 默认 最新

  • 「已注销」 2010-07-02 11:19
    关注

    spring这个批量插入有点限制,比如你这个特殊需要,我感觉它实现不了,所以你用我上面说的那个方法迂回实现。我感觉性能方面应该不会有太大的影响。你看spring的批量插入的时候这个BatchPreparedStatementSetter借口的方法setValues(PreparedStatement ps, int i) ,提供了一个索引i,它肯定也遍历了,要么怎么知道i的值。所以有特殊需求的时候就用上面那种方案,没有的时候推荐用spring提供了批量操作,我们项目中就这么做的。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

悬赏问题

  • ¥20 matlab yalmip kkt 双层优化问题
  • ¥15 如何在3D高斯飞溅的渲染的场景中获得一个可控的旋转物体
  • ¥88 实在没有想法,需要个思路
  • ¥15 MATLAB报错输入参数太多
  • ¥15 python中合并修改日期相同的CSV文件并按照修改日期的名字命名文件
  • ¥15 有赏,i卡绘世画不出
  • ¥15 如何用stata画出文献中常见的安慰剂检验图
  • ¥15 c语言链表结构体数据插入
  • ¥40 使用MATLAB解答线性代数问题
  • ¥15 COCOS的问题COCOS的问题