陈述与预备陈述的区别准备好的语句是语句的一个稍微更强大的版本,并且应该始终与语句一样快速和容易处理。准备好的报表可能是参数化的。大多数关系数据库分四个步骤处理JDBC/SQL查询:解析传入的SQL查询编译SQL查询计划/优化数据采集路径执行优化的查询/获取和返回数据对于发送到数据库的每个SQL查询,一条语句将始终执行上述四个步骤。准备好的语句预执行上述执行过程中的步骤(1)-(3)。因此,在创建准备好的语句时,会立即执行一些预优化。其效果是在执行时减少数据库引擎的负载。现在我的问题是-“使用预先准备的陈述还有其他好处吗?”
3 回答
慕尼黑5688855
TA贡献1848条经验 获得超2个赞
PreparedStatement
:
预编译和sql语句的DB端缓存将导致总体上更快的执行和重用 批次 .自动预防 SQL注入 攻击 通过内置转义引号和其他特殊字符。请注意,这要求您使用任何 PreparedStatement
setXxx()
方法来设置值。 preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email, birthdate, photo) VALUES (?, ?, ?, ?)"); preparedStatement.setString(1, person.getName());preparedStatement.setString(2, person.getEmail()); preparedStatement.setTimestamp(3, new Timestamp(person.getBirthdate().getTime())); preparedStatement.setBinaryStream(4, person.getPhoto());preparedStatement.executeUpdate();
因此 别通过字符串连接将SQL字符串中的值内联。 preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email) VALUES ('" + person.getName() + "', '" + person.getEmail() + "'");preparedStatement.executeUpdate();
简化了SQL字符串中非标准Java对象的设置。 Date
,Time
,Timestamp
,BigDecimal
,InputStream
(Blob
)和 Reader
(Clob
)。在大多数这些类型中,您不能“只做”一个 toString()
就像你在一个简单的 Statement
..您甚至可以将其全部重构为 PreparedStatement#setObject()
在循环内部,如下面的实用程序方法所示: public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException { for (int i = 0; i < values.length; i++) { preparedStatement.setObject(i + 1, values[i]); }}
如下所示: preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email, birthdate, photo) VALUES (?, ?, ?, ?)");setValues(preparedStatement, person.getName(), person.getEmail(), new Timestamp(person.getBirthdate().getTime()), person.getPhoto());preparedStatement.executeUpdate();
添加回答
举报
0/150
提交
取消