是否值得为 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? 不重复,因为:
- 另外一个问题是多次复用prepared statement,我打算只用一次,文档已经说明复用更快
PreparedStatements
- 我打算只对整数使用该语句,我担心 SQL 注入,但同时我不确定是否可以用原语注入 SQL int 参数,微速度增强只是一个小的加分,我不是因为性能而问。另一个问题只是想加快速度,可能会使用字符串、日期或其他 non-primitive 类型。
来自 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);
}
我创建 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? 不重复,因为:
- 另外一个问题是多次复用prepared statement,我打算只用一次,文档已经说明复用更快
PreparedStatements
- 我打算只对整数使用该语句,我担心 SQL 注入,但同时我不确定是否可以用原语注入 SQL int 参数,微速度增强只是一个小的加分,我不是因为性能而问。另一个问题只是想加快速度,可能会使用字符串、日期或其他 non-primitive 类型。
来自 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);
}