### PreparedStatement 的“close”与 Connection 之间的关系
在使用 Java 进行数据库操作时,使用 `PreparedStatement` 可以有效地执行预编译的 SQL 语句,并防止 SQL 注入攻击。而 `Connection` 则是与数据库建立连接的重要接口。在进行这两者的操作时,了解二者之间的关系是至关重要的。### PreparedStatement 与 Connection 的关系`PreparedStatement` 是通过 `Connection` 接口创建的。当我们创建一个 `PreparedStatement` 对象时,实际上是在特定的 `Connection` 上执行了预编译的 SQL 语句。这意味着 `PreparedStatement` 与它的创建者 `Connection` 存在一种关联关系。当我们关闭 `Connection` 时,与之相关联的 `PreparedStatement` 也会相应地关闭。### 示例代码:以下是一个简单的示例,演示了如何使用 `PreparedStatement` 执行 SQL 查询,并在完成操作后正确关闭 `PreparedStatement` 和 `Connection`。假设我们有一个名为 `students` 的数据库表,包含 `id` 和 `name` 列。javaimport java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;public class PreparedStatementExample { public static void main(String[] args) { Connection connection = null; PreparedStatement preparedStatement = null; ResultSet resultSet = null; try { // 建立数据库连接 connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/database", "username", "password"); // 创建 PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM students WHERE id = ?"); preparedStatement.setInt(1, 1); // 设置参数 // 执行查询 resultSet = preparedStatement.executeQuery(); // 处理结果集 while (resultSet.next()) { System.out.println("ID: " + resultSet.getInt("id") + ", Name: " + resultSet.getString("name")); } } catch (SQLException e) { e.printStackTrace(); } finally { // 关闭资源 try { if (resultSet != null) { resultSet.close(); } if (preparedStatement != null) { preparedStatement.close(); } if (connection != null) { connection.close(); } } catch (SQLException e) { e.printStackTrace(); } } }}在这个例子中,首先建立了与数据库的连接,然后创建了一个 `PreparedStatement` 对象,执行了查询操作,并在最后通过关闭 `Connection` 对象来正确关闭相关的 `PreparedStatement`。通过正确地关闭 `Connection`,我们确保了与之相关联的 `PreparedStatement` 也被关闭,从而释放了资源并防止了可能的内存泄漏。这种正确的资源管理对于程序的稳定性和性能至关重要。