Java 报表和准备报表之间的差异
准备好的语句是语句的一个稍微更强大的版本,并且应该始终至少与语句一样快速和易于处理。Java 报表和准备报表之间的差异,java,jdbc,Java,Jdbc,准备好的语句是语句的一个稍微更强大的版本,并且应该始终至少与语句一样快速和易于处理。 准备好的语句可以参数化 大多数关系数据库通过四个步骤处理JDBC/SQL查询: 解析传入的SQL查询 编译SQL查询 规划/优化数据采集路径 执行优化的查询/获取和返回数据 对于发送到数据库的每个SQL查询,语句将始终执行上述四个步骤。准备好的语句预执行上述执行过程中的步骤(1)-(3)。因此,在创建准备好的语句时,会立即执行一些预优化。其效果是在执行时减轻数据库引擎的负载 现在我的问题是,“使用Prepare
准备好的语句可以参数化 大多数关系数据库通过四个步骤处理JDBC/SQL查询:
现在我的问题是,“使用PreparedStatement还有其他好处吗?”
PreparedStatement
是一种很好的防御方法(但不是万无一失的)。绑定参数值是防止进行不必要访问的一种好方法。没什么可添加的
1-如果您想在循环中执行查询(超过1次),由于您提到的优化,prepared语句可以更快
参数化查询是避免SQL注入的好方法。参数化查询仅在PreparedStatement中可用。的优点:
- SQL语句的预编译和DB端缓存导致总体执行速度更快,并且能够在中重用相同的SQL语句
- 通过引号和其他特殊字符的内置转义自动防止错误。请注意,这需要使用任何
PreparedStatement
方法来设置值setXxx()
因此,不逐个串接SQL字符串中的值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();
preparedStatement = connection.prepareStatement("INSERT INTO Person (name, email) VALUES ('" + person.getName() + "', '" + person.getEmail() + "'"); preparedStatement.executeUpdate();
- 简化了SQL字符串中非标准Java对象的设置,例如,()和()。在大多数类型上,您不能像在简单的
语句中那样“仅仅”执行
。您甚至可以将其重构为在循环内使用,如下面的实用程序方法所示:toString()
public static void setValues(PreparedStatement preparedStatement, Object... values) throws SQLException { for (int i = 0; i < values.length; i++) { preparedStatement.setObject(i + 1, values[i]); } }
- 它更容易阅读
- 您可以轻松地将查询字符串设置为常量
- 不能在声明中使用CLOB
和:(OraclePreparedStatement)ps
语句
接口执行无参数的静态sql语句
PreparedStatement
接口(扩展语句)执行带/不带参数的预编译SQL语句
语句将用于执行静态SQL语句,它不能接受inpu
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();