如下,插入一条记录的时候可以这样返回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]
spring这个批量插入有点限制,比如你这个特殊需要,我感觉它实现不了,所以你用我上面说的那个方法迂回实现。我感觉性能方面应该不会有太大的影响。你看spring的批量插入的时候这个BatchPreparedStatementSetter借口的方法setValues(PreparedStatement ps, int i) ,提供了一个索引i,它肯定也遍历了,要么怎么知道i的值。所以有特殊需求的时候就用上面那种方案,没有的时候推荐用spring提供了批量操作,我们项目中就这么做的。
你已经写好了插入一个对象的方法,就是public Test save(Test test),批量插入的时候可以直接使用该方法的。[code="java"]# public List saveOrUpdateAll(final List list) {
List resultList=new ArrayList();
for(Test test:list){
resultList.add(save(test));
}
return resultList;
} [/code]
这样就好了。
嗯。我刚刚给你写完就想看看源代码,发现我这没有,又下载的,还没好呢,网速太慢。。你上面的我看的,采用java.sql包中的自己写方便灵活,可以满足你的要求,你也写出来。看上面的spring源代码,spring的批量插入限制是很大,解耦BatchPreparedStatementSetter只有两个方法,一个是设置,一个是数据的个数,都被用在batchUpdate方法中进行循环setValues啦,最后使用的是java sql API PreparedStatement的批量更新(支持的话,不支持有它自己的批量更新)。。其实spring设计这个只是为了批量更新,不想做其他的事情。看来也合理,速度也不错。不知道以后会不会有可以自定义这种实现,用于满足比如你这样的特殊需要。