准备好的语句如何与 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,您会注意到它们确实如此(查看query
、update
和insert
的主要实现)。或者您想为这些方法提供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)
...
结论? PreparedStatement
s正在使用中,完全不用担心。
【讨论】:
以上是关于准备好的语句如何与 Apache DBUtils 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章
使用没有语句的 apache dbutils 获取自动增量生成的密钥 [重复]
如何将准备好的语句与 OleDbDataAdapter 一起使用?