gpt4 book ai didi

java - Statement 和 PreparedStatement 的区别

转载 作者:IT老高 更新时间:2023-10-28 12:16:48 25 4
gpt4 key购买 nike

Prepared Statement 是 Statement 的稍微强大的版本,并且应该始终至少与 Statement 一样快速和易于处理。
Prepared Statement可以被参数化

大多数关系数据库通过四个步骤处理 JDBC/SQL 查询:

  1. 解析传入的 SQL 查询
  2. 编译 SQL 查询
  3. 规划/优化数据采集路径
  4. 执行优化查询/获取并返回数据

对于发送到数据库的每个 SQL 查询,语句将始终执行上述四个步骤。 Prepared Statement预先执行上述执行过程中的步骤(1)-(3)。因此,在创建 Prepared Statement 时,会立即执行一些预优化。其效果是减少执行时数据库引擎的负载。

现在我的问题是:

“使用 Prepared Statement 还有其他好处吗?”

最佳答案

PreparedStatement 的优点:

  • SQL 语句的预编译和 DB 端缓存导致整体执行速度更快,并且能够在 batches 中重用相同的 SQL 语句.

  • 自动预防SQL injection attacks通过引号和其他特殊字符的内置转义。请注意,这要求您使用任何 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)。在大多数这些类型中,您不能像在简单的 Statement 中那样“只”执行 toString()。您甚至可以将其全部重构为使用 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();

关于java - Statement 和 PreparedStatement 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3271249/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com