在 Java 中使用参数传递 SQL 语句通常是为了防止 SQL 注入,并提高代码的可读性和维护性。最常见的方法是使用 PreparedStatement 来执行带参数的 SQL 语句。

使用 PreparedStatement 传递参数

PreparedStatement 是 Java 中执行参数化查询的主要类。通过使用 ? 作为占位符,然后将参数值传递给 PreparedStatement,您可以安全地构建和执行 SQL 语句。

示例代码

以下是一个完整的示例,展示了如何使用 PreparedStatement 传递参数执行 SQL 查询:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class DatabaseExample {
    public static void main(String[] args) {
        // 数据库连接信息
        String url = "jdbc:mysql://localhost:3306/your_database_name";
        String username = "your_username";
        String password = "your_password";

        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;

        try {
            // 1. 建立数据库连接
            connection = DriverManager.getConnection(url, username, password);

            // 2. 定义 SQL 查询,使用 ? 作为参数占位符
            String sql = "SELECT * FROM users WHERE age > ? AND city = ?";

            // 3. 创建 PreparedStatement 对象
            preparedStatement = connection.prepareStatement(sql);

            // 4. 设置参数
            preparedStatement.setInt(1, 30); // 将第一个 ? 设置为 30
            preparedStatement.setString(2, "New York"); // 将第二个 ? 设置为 "New York"

            // 5. 执行查询
            resultSet = preparedStatement.executeQuery();

            // 6. 处理结果集
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                int age = resultSet.getInt("age");
                String city = resultSet.getString("city");
                System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age + ", City: " + city);
            }

        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            // 7. 关闭资源
            try {
                if (resultSet != null) resultSet.close();
                if (preparedStatement != null) preparedStatement.close();
                if (connection != null) connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }
}

详细步骤解析

  1. 建立数据库连接: 使用 DriverManager.getConnection(url, username, password) 来建立数据库连接。
  2. 定义 SQL 查询: 使用 ? 作为占位符来定义 SQL 语句中的参数。
  3. 创建 PreparedStatement 对象: 使用 Connection.prepareStatement(sql) 方法创建 PreparedStatement 对象。
  4. 设置参数: 使用 preparedStatement.setInt()preparedStatement.setString() 等方法为 SQL 语句中的每个 ? 占位符设置参数值。占位符的索引从 1 开始。
  5. 执行查询: 使用 executeQuery() 方法执行查询。对于 INSERTUPDATEDELETE 语句,可以使用 executeUpdate()
  6. 处理结果集: 遍历 ResultSet 对象来处理查询结果。
  7. 关闭资源: 使用 try-finally 块确保数据库连接和其他资源在操作完成后被正确关闭。

参数类型方法列表

以下是一些常用的 PreparedStatement 参数设置方法:

  • setInt(int parameterIndex, int x): 设置 int 类型的参数。
  • setString(int parameterIndex, String x): 设置 String 类型的参数。
  • setDouble(int parameterIndex, double x): 设置 double 类型的参数。
  • setDate(int parameterIndex, java.sql.Date x): 设置 Date 类型的参数。
  • setBoolean(int parameterIndex, boolean x): 设置 boolean 类型的参数。

小结

使用 PreparedStatement 来传递 SQL 语句中的参数,可以有效防止 SQL 注入攻击,并使代码更具可维护性。这是 Java 应用程序中与数据库交互的最佳实践之一。