Sql 使用hibernateTemplate、JdbcTemplate的spring批插入

Sql 使用hibernateTemplate、JdbcTemplate的spring批插入,sql,hibernate,spring,batch-processing,Sql,Hibernate,Spring,Batch Processing,我有几个关于春季批量插入的问题 当我这样做的时候: 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 St

我有几个关于春季批量插入的问题

当我这样做的时候:

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日志文件中,我看到:

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(选项卡)
时,我可以看到:

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 (?, ?)
1094[main]DEBUG org.springframework.jdbc.core.JdbcTemplate-执行3条语句的SQL批更新 1110[main]调试org.springframework.jdbc.datasource.DataSourceUtils-从数据源获取jdbc连接 1110[main]DEBUG org.springframework.jdbc.datasource.DriverManager数据源-创建到[jdbc:mysql://localhost:3306/test?useServerPrepStmts=true] 1610[main]DEBUG org.springframework.jdbc.support.JdbcUtils-jdbc驱动程序支持批量更新

在mysql日志中:

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中寻找类似的东西。我可以这样做:

  getHibernateTemplate().saveOrUpdateAll(Arrays.asList(new Car(4, "infinity"), new Car(5, "ford")));
在这种情况下,我可以在日志文件中看到:

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(…)


如果我错了,请纠正我。

要产生类似于Hibernate的结果(使用准备状态),您应该使用
JdbcTemplate.batchUpdate(String,BatchPreparedStatementSetter)
。大概是这样的:

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++;
        }
    });
final List cars=Arrays.asList(…);
getJdbcTemplate().batchUpdate(“插入汽车(名称、id)值(?,);”,
新的BatchPreparedStatementSetter(){
私有整数i=0;
public int getBatchSize(){return cars.size();}
公共无效设置值(准备的声明ps){
ps.setString(1,cars.get(i.getName());
ps.setInt(2,cars.get(i).getId());
i++;
}
});