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

Posted

技术标签:

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

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

【问题讨论】:

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

【讨论】:

以上是关于准备好的语句如何与 Apache DBUtils 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

MySQL上的LIMIT关键字与准备好的语句[重复]

使用没有语句的 apache dbutils 获取自动增量生成的密钥 [重复]

如何将准备好的语句与 OleDbDataAdapter 一起使用?

如何将多个 INSERT INTO 与准备好的语句结合起来?

如何将 MySQLi 准备好的语句与存储过程一起使用

QueryRunner类