0

我有两种更新方法:

String query = "update mytable set name = 'new_value' where id ='20' ";
Connection conn;
PreparedStatement pState;
try {
    conn = DriverManager.getConnection(dbUrl, "root", "2323");
    pState = conn.prepareStatement(query);
    pState.executeUpdate();
} catch (SQLException sql) {
    sql.printStackTrace();
}

或者:

String query = "update mytable set name = ?" + "where id = ?";
Connection conn;
PreparedStatement pState;
int s;
try {
    conn = DriverManager.getConnection(dbUrl, "root", "2323");
    pState = conn.prepareStatement(query);
    pState.setStringt(1, "new_value");
    pState.setString(2, "20");
    s = pState.executeUpdate();       // if s = 1 then update done successfully
} catch (SQLException sql) {
    sql.printStackTrace();
}

两种方法都正确更新数据库记录,哪个更好?

4

3 回答 3

3

第二种方法是避免SQL 注入攻击的良好做法。

并且以下足以构造查询字符串,不需要另一个 + 连接。

 String query = "update mytable set name = ? where id = ?";
于 2013-08-19T21:17:40.227 回答
1

我会说第二种方法。

你没有返回任何东西,那么为什么要创建一个结果集并沿着这条路走呢?

编辑:

即使在您发表评论后,我仍然会使用第二个模板。它更灵活。此外,它更快。PreparedStatement 是在数据库中预编译的,它允许数据库使用语句比普通查询更快地执行参数查询。如果您使用字符串连接(如在第一个示例中),则不会发生这种情况。

请参阅:http ://docs.oracle.com/javase/tutorial/jdbc/basics/prepared.html

此外,从该页面:

PreparedStatement 对象的主要特点是,与 Statement 对象不同,它在创建时被赋予一条 SQL 语句。这样做的好处是,在大多数情况下,此 SQL 语句会立即发送到 DBMS,并在其中进行编译。因此,PreparedStatement 对象不仅包含一条 SQL 语句,还包含一条已预编译的 SQL 语句。这意味着当 PreparedStatement 被执行时,DBMS 可以直接运行 PreparedStatement SQL 语句,而无需先编译它。

尽管 PreparedStatement 对象可用于不带参数的 SQL 语句,但您可能最常将它们用于带参数的 SQL 语句。使用带参数的 SQL 语句的优点是您可以使用相同的语句并在每次执行时为其提供不同的值。

于 2013-08-19T21:19:08.687 回答
1

如果您经常使用相同的查询,则第二种方法更快。取决于数据库供应商,查询被缓存,效率高于使用平句。但这一切都取决于 JDBC 驱动程序的实现和数据库提供的服务。

在Java 教程中的使用准备好的语句中查看更多信息。

于 2013-08-19T21:19:45.827 回答