我有几个与 Spring 中的批量插入有关的问题。
当我做这样的事情时:
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 个插入语句(和 3 个网络调用)。
当我getJdbcTemplate().batchUpdate(tab)
在日志文件中使用时,我可以看到:
1094 [main] DEBUG org.springframework.jdbc.core.JdbcTemplate - 执行 3 个语句的 SQL 批量更新 1110 [main] DEBUG org.springframework.jdbc.datasource.DataSourceUtils - 从 DataSource 获取 JDBC 连接 1110 [main] DEBUG org.springframework .jdbc.datasource.DriverManagerDataSource - 创建新的 JDBC 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(...) 一样一次性完成
如果我错了,请纠正我。