我有两种更新方法:
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();
}
两种方法都能正确更新数据库记录,哪个更好?
答案 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中查看更多内容。