【发布时间】:2011-03-11 02:13:51
【问题描述】:
如何使用在 mySQL 上运行的 JdbcTemplate 以可扩展的方式执行以下 SQL。在这种情况下,可扩展意味着:
- 服务器上只执行一条 SQL 语句
- 它适用于任意数量的行。
声明如下:
INSERT INTO myTable (foo, bar) VALUES ("asdf", "asdf"), ("qwer", "qwer")
假设我有一个带有 foo 和 bar 字段的 POJO 列表。我意识到我可以遍历列表并执行:
jdbcTemplate.update("INSERT INTO myTable(foo, bar) VALUES (?, ?)", paramMap)
但这并没有满足第一个标准。
我相信我也可以执行:
jdbcTemplate.batchUpdate("INSERT INTO myTable(foo, bar) VALUES (?, ?)", paramMapArray)
但据我所知,这只会编译 SQL 一次并执行多次,再次失败第一个标准。
似乎同时满足这两个标准的最后一种可能性是自己使用StringBuffer 简单地构建 SQL,但我想避免这种情况。
【问题讨论】:
-
我们可以只使用 JDBC 做同样的事情吗??
-
这与 JdbcTemplate 甚至 JDBC 无关。你不能在 SQL、句号(或标准 SQL,无论如何)中做到这一点,所以你当然不能在 JdbcTemplate 中做到。
-
@skaffman:我更新了我的问题,说我正在使用 mySQL。也许这是一个 mySQL-only 功能,但它在dev.mysql.com/doc/refman/5.1/en/insert.html 中描述了大约四分之一:“使用 VALUES 语法的 INSERT 语句可以插入多行。为此,请包含多个列值列表,每个列表都包含在括号中并用逗号分隔。示例:“
-
@Teja:是的,可以在纯 JDBC 中完成,但这不是问题所在。我已经用第三种可能性更新了这个问题,那就是手动构建 SQL。
-
如果您使用 InnoDB,那么 batchUpdate 应该 仅在最后一次插入后更新索引表。使用单个语句获得的唯一效率提升是您必须向 MySQL 服务器发送更少的数据。我怀疑您是否能够使用标准 JdbcTemplate 进行多次插入,但您始终可以扩展 JdbcTemplate 并滚动您自己的批量插入方法,该方法手动构建插入字符串。
标签: java sql spring jdbc jdbctemplate