【问题标题】:How can Prepared Statements be used with Apache DBUtils?准备好的语句如何与 Apache DBUtils 一起使用?
【发布时间】:2013-04-01 15:47:09
【问题描述】:

准备好的语句如何与 Apache DBUtils 一起使用?

似乎 org.apache.commons.dbutils.* 的大多数方法都需要字符串参数。令人惊讶的是没有接受 PreparedStatements 的方法。

【问题讨论】:

  • 查看source code of QueryRunner,您会注意到它们确实如此(查看queryupdateinsert 的主要实现)。或者您想为这些方法提供PreparedStatement 的现有实例?
  • 是的,我确实注意到了。这对我来说有点太吸收了,所以我正在努力。我之前使用的是 Prepared Statements,但不是使用这些 QueryRunner 方法。这就是我想做的,这样当我处理我的表单输入时,它就不会因撇号而崩溃。

标签: java prepared-statement apache-commons-dbutils


【解决方案1】:

Prepared Statements 在 DbUtils 内部使用,但是,prepared statement 的重点不是每次更新时都准备一条语句,而是重用它,只更改参数。假设您必须插入 1000 条记录,您想重用相同的准备好的语句,只更改参数。为此,请使用 QueryRunner.batch 而不是 QueryRunner.update。

【讨论】:

  • 但是,如果插入一百万条记录,我非常怀疑 dbutils 是否会成为解决方案,因为 QueryRunner.batch 会初始化准备好的语句。我建议编写自定义实现而不是求助于 dbutils。我不确定是否有任何其他工具可以缓存准备好的语句。
【解决方案2】:

来自examples page

// Execute the query and get the results back from the handler
Object[] result = run.query(
    "SELECT * FROM Person WHERE name=?", h, "John Doe");

表示必须使用 PreparedStatement。在the source for the query method 我们看到

private <T> T query(Connection conn, boolean closeConn, String sql, 
                     ResultSetHandler<T> rsh, Object... params)
...
PreparedStatement stmt = null;
ResultSet rs = null;
T result = null;

try {
    stmt = this.prepareStatement(conn, sql);
    this.fillStatement(stmt, params);
    rs = this.wrap(stmt.executeQuery());
    result = rsh.handle(rs);
} catch (SQLException e) {
...

结论? PreparedStatements正在使用中,完全不用担心。

【讨论】:

    猜你喜欢
    • 2016-05-01
    • 2016-12-17
    • 1970-01-01
    • 2017-07-31
    • 2021-10-11
    • 2018-10-21
    • 2012-02-08
    • 1970-01-01
    • 2011-07-29
    相关资源
    最近更新 更多