是否值得为int值创建PreparedStatement?

Jos*_*ior 1 java optimization jdbc query-optimization prepared-statement

我创建的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();
    }
}
Run Code Online (Sandbox Code Playgroud)

是否值得准备该声明?是否会增加安全性?

如果我用正常的声明做什么怎么办?这有风险吗?它会执行得更快吗?

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
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

编辑:这个问题是不是重复的准备好的语句显着减缓程序?因为:

  • 另一个问题是多次重复使用预准备语句,我打算只使用一次,文档已经指定重用更快 PreparedStatements
  • 我打算只将这个语句用于整数,我担心SQL注入但同时我不确定是否可以用原始int参数注入SQL,微速度增强只是一个小的加分,我不是因为表现而问.另一个问题只是想加快速度,可能正在使用字符串,日期或其他非基本类型.

Ghe*_*ham 7

来自java文档:

预编译SQL语句并将其存储在PreparedStatement对象中.然后,可以使用此对象多次有效地执行此语句.

回答你的问题:是非常值得的,重要的是使用准备好的语句,这是保护你免受注入攻击(如sql注入)的最佳方法,正常的声明将无法防止这些类型的攻击,即使你制作了自己的"好"sql解析器,它可能无法抵御某些攻击.

  • 关注的是,有人可以找到一种方式,也许......谁知道?准备好的声明防范它.这就像是说你到街上之前不必戴安全带,因为车道上没有被撞的危险.不,你可以.对于它所擅长的安全性而言,必须付出代价.准备好的陈述也是如此 (3认同)
  • 另外,开始质疑你是否需要它们是一个糟糕的主意,因为总有一天你会忽视某些东西并弄错它 - 这是不可避免的.如果你总是使用它们,你不能犯这样的错误. (2认同)
  • 这不是"在原始int上注入SQL"的问题.这更像是一个问题"这个代码可以复制/粘贴到另一个区域,或者用作示例,然后修改为使用字符串参数." 如果它完全可能(即,总是),那么在这里使用'PreparedStatement`****将自动意味着**将使用'PreparedStatement`**,并且您已经获得了安全性. (2认同)