是否值得为 int 值创建 PreparedStatement?

Is it worth to create a PreparedStatement for int values?

我创建 PreparedStatement 当我需要将参数传递给答案时,那里没有解决您的问题,请编辑以详细解释您问题的独特部分。 标题

是否值得为 int 值创建 PreparedStatement? SQL 查询,但是是否值得准备一个语句来传递 int 参数并在执行后关闭?

void delete(int key, int orElse) throws SQLException
{
    try(PreparedStatement pst = this.connection.prepareStatement(
        "DELETE FROM a_table WHERE the_int_primary_key=? OR random_int_field=?"
    ))
    {
        pst.setInt(1, key);
        pst.setInt(2, orElse);
        pst.executeUpdate();
    }
}

准备这份声明是否值得?无论如何都会增加安全性吗?

如果我用普通语句来做呢?它有任何风险吗?会不会执行的快一点?

void delete(int key, int orElse) throws SQLException
{
  try(Statement stm = this.connection.createStatement())
  {
    stm.executeUpdate(
      "DELETE FROM a_table WHERE the_int_primary_key="+key+" OR random_int_field="+orElse
    );
  }
}

编辑: 此问题与 Do prepared statements slow down program conspicuously? 不重复,因为:

来自 java 文档:

A SQL statement is precompiled and stored in a PreparedStatement object. This object can then be used to efficiently execute this statement multiple times.

回答您的问题:是的,非常值得,使用准备好的语句很重要,这是保护您免受注入攻击(如 sql 注入)的最佳方式,普通语句将无济于事防止这些类型的攻击,即使你自己制作 "good" sql 解析器,它也可能无法防止某些攻击。

改为提问:"Is is more complicated to use prepared statement?"。只使用普通的 JDBC,它稍微长了一点。所以几乎没有任何收获。所以不要冒任何风险(SQL 注入)并且不要在其中混合普通(未经准备的)语句。

如果你觉得它太冗长,那么寻找一个提供更好语法的库,或者自己编写一个实用程序,允许像

这样的东西
try (MyPreparedStatement pst = new MyPreparedStatement(connection, 
    "DELETE FROM a_table WHERE the_int_primary_key=? OR random_int_field=?"
))
{
    pst.executeUpdate(1, 2);
}