我创建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
答案 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);
}