PreparedStatement#setInt vs inline SQL有什么优势吗?

时间:2014-01-27 04:32:27

标签: sql prepared-statement

我已多次阅读Give me Parameterized SQL or give me death

参数化SQL对字符串,日期和浮点数的优势非常明显且无可争议。

我的问题是:int s怎么办?

我问,因为通常情况下,如果我正在编写查询或更新,并且唯一的参数是int,我只需编写内联sql并将int附加为快捷方式( "select * from table where id = " + id)。

我的问题:单独为int使用参数化SQL有什么好处吗?

用Java说明:

这有什么好处:

Connection conn;
int id;
String sql = "select * from table where id = ?";
try (PreparedStatement p_stmt = conn.prepareStatement(sql)) {
    p_stmt.setInt(1, id);
    ResultSet results = p_stmt.executeQuery();

    // ...
} catch (SQLException e) {
    // ...
}

对此:

Connection conn;
int id;
String sql = "select * from table where id = " + id;
try (Statement stmt = conn.createStatement()) {
    ResultSet results = stmt.executeQuery(sql);

    // ...
} catch (SQLException e) {
    // ...
}

1 个答案:

答案 0 :(得分:1)

我想说最大的优势就是一致性。如果您认为通过字符串连接构建的所有SQL都是“错误的”,那么与诸如“由字符串连接构建的所有SQL错误,除了将int作为参数处理”之类的规则相比,更容易验证您的代码是“正确的” ”

另一种情况,比如:在线下,您想要对查询进行排序或分组,突然之间,您的行变成了这样的东西:

String sql = "select * from table where id = " + id + " order by somecolumn";

希望你能记住order之前的空间。并且你身后的每个人也都会这样做。

对于只做一种方式的事情有很多话要说,特别是当大多数时候这种方式是正确的时候。