是否值得为int值创建PreparedStatement?

时间:2016-07-28 21:05:35

标签: java optimization jdbc prepared-statement query-optimization

我创建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?不重复,因为:

  • 另一个问题是多次重复使用预准备语句,我打算只使用一次,文档已经指定重用PreparedStatements
  • 的速度更快
  • 我计划仅将该语句用于整数,并且我担心SQL注入但同时我不确定是否可以使用原语注入SQL int参数,微速度增强只是一个小小的优点,我不仅仅因为性能问题。另一个问题只是想加快速度,可能会使用字符串,日期或其他非基本类型。

2 个答案:

答案 0 :(得分:7)

来自java docs:

  

预编译SQL语句并将其存储在PreparedStatement中   宾语。然后可以使用该对象有效地执行此操作   声明多次。

回答你的问题:是非常值得的,使用准备好的声明很重要,它是保护你免受注射攻击的最好方法(比如sql注入),一个正常的声明会做没有什么可以防止这些类型的攻击,即使你自己创造了好的"好的" sql解析器它可能无法抵御某些攻击。

答案 1 :(得分:1)

要求:“使用准备好的陈述是否更复杂?”除了简单的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);
}