gpt4 book ai didi

java - 语句和PreparedStatement的区别

转载 作者:行者123 更新时间:2023-11-29 15:31:41 26 4
gpt4 key购买 nike

准备好的语句是语句的稍微强大的版本,并且应该始终至少与语句一样快速且易于处理。
准备好的语句可以参数化

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

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

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

现在我的问题是:

“使用准备好的语句还有其他优点吗?”

最佳答案

PreparedStatement 的优点:

  • SQL 语句的预编译和数据库端缓存可提高整体执行速度,并能够在 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 - 语句和PreparedStatement的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58679163/

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