更新数据库记录哪种方式更好?

时间:2013-08-19 21:16:44

标签: java jdbc

我有两种更新方法:

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();
}

OR:

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();
}

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

3 个答案:

答案 0 :(得分:3)

第二种方法是避免S QL Injection attacks的良好做法。

以下足以构造查询字符串,不需要另外的+连接。

 String query = "update mytable set name = ? where id = ?";

答案 1 :(得分:1)

我会说第二种方法。

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

修改

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

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

此外,从该页面:

  

PreparedStatement对象的主要特征是,与a不同   Statement对象,在创建时给出一个SQL语句。该   这样做的好处是,在大多数情况下,会发送此SQL语句   DBMS立即编译。结果,   PreparedStatement对象不仅包含SQL语句,还包含SQL   已预编译的语句。这意味着当   执行PreparedStatement,DBMS就可以运行了   PreparedStatement SQL语句,无需先编译它。

     

尽管PreparedStatement对象可以用于SQL语句   没有参数,您可能最常使用它们用于SQL语句   拿参数。使用SQL语句的优点   参数是您可以使用相同的语句并提供它   每次执行时都会有不同的值。

答案 2 :(得分:1)

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

Using Prepared Statements中的The Java Tutorials中查看更多内容。