首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用hibernateTemplate、JdbcTemplate进行spring batch插入

问使用hibernateTemplate、JdbcTemplate进行spring batch插入
EN

Stack Overflow用户
提问于 2010-02-27 22:12:17
回答 1查看 11.7K关注 0票数 2

我有几个关于Spring中批量插入的问题。

当我这样做的时候:

代码语言:javascript
复制
public void save(Car car) {
  String sql1 = "insert into Car values (1, 'toyota')";
  String sql2 = "insert into Car values (2, 'chrysler')";
  String sql3 = "insert into Car values (3, 'infinity')";

  String[] tab = new String[2];
  tab[0] = sql1;
  tab[1] = sql2;
  tab[2] = sql3;

  getJdbcTemplate().update(sql1);
  getJdbcTemplate().update(sql2);
  getJdbcTemplate().update(sql3);

  // getJdbcTemplate().batchUpdate(tab);
}

在mysql日志文件中,我看到:

代码语言:javascript
复制
1  Query       insert into Car values (1, 'toyota')
2  Query       insert into Car values (2, 'chrysler')
3  Query       insert into Car values (3, 'infinity')

所以我们有3个insert语句(和3个网络调用)。

当我在日志文件中使用getJdbcTemplate().batchUpdate(tab)时,我可以看到:

1094主调试org.springframework.jdbc.datasource.DataSourceUtils -执行SQL批量更新3条语句1110主调试org.springframework.jdbc.datasource.DriverManagerDataSource -从JDBC 1110获取JDBC连接主调试org.springframework.jdbc.datasource.DriverManagerDataSource-创建到jdbc:mysql://localhost:3306/test?useServerPrepStmts=true 1610的新JDBC DriverManager连接主调试org.springframework.jdbc.support.JdbcUtils -JDBC驱动程序支持批量更新

在mysql日志中:

代码语言:javascript
复制
1  Query       insert into Car values (1, 'toyota')
1  Query       insert into Car values (2, 'chrysler')
1  Query       insert into Car values (3, 'infinity')

我知道在后台,addBatch方法是在语句对象上调用的,所有这些操作都是同时执行的。额外的好处是减少了网络调用。我的推理正确吗?

我在HibernateTemplate中寻找类似的东西。我可以这样做:

代码语言:javascript
复制
  getHibernateTemplate().saveOrUpdateAll(Arrays.asList(new Car(4, "infinity"), new Car(5, "ford")));

在这种情况下,在日志文件中我可以看到:

代码语言:javascript
复制
3  Prepare     select car_.id, car_.name as name0_ from Car car_ where car_.id=?
3  Prepare     select car_.id, car_.name as name0_ from Car car_ where car_.id=?
3  Prepare     insert into Car (name, id) values (?, ?)

因此,似乎所有的事情都是在一次操作中完成的,就像getJdbcTemplate().updateBatch(...)

如果我说错了,请纠正我。

EN

回答 1

Stack Overflow用户

发布于 2010-02-27 23:47:47

要产生类似于Hibernate的结果(带有准备好的语句),您应该使用JdbcTemplate.batchUpdate(String, BatchPreparedStatementSetter)。如下所示:

代码语言:javascript
复制
final List<Car> cars = Arrays.asList(...);

getJdbcTemplate().batchUpdate("insert into Car (name, id) values (?, ?);",
    new BatchPreparedStatementSetter() {
        private int i = 0;
        public int getBatchSize() { return cars.size(); }
        public void setValues(PreparedStatement ps) {
            ps.setString(1, cars.get(i).getName());
            ps.setInt(2, cars.get(i).getId());
            i++;
        }
    });
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2347592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档