在 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();
}
}
}
}
详细步骤解析
- 建立数据库连接: 使用
DriverManager.getConnection(url, username, password)
来建立数据库连接。 - 定义 SQL 查询: 使用
?
作为占位符来定义 SQL 语句中的参数。 - 创建
PreparedStatement
对象: 使用Connection.prepareStatement(sql)
方法创建PreparedStatement
对象。 - 设置参数: 使用
preparedStatement.setInt()
、preparedStatement.setString()
等方法为 SQL 语句中的每个?
占位符设置参数值。占位符的索引从 1 开始。 - 执行查询: 使用
executeQuery()
方法执行查询。对于INSERT
、UPDATE
、DELETE
语句,可以使用executeUpdate()
。 - 处理结果集: 遍历
ResultSet
对象来处理查询结果。 - 关闭资源: 使用
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 应用程序中与数据库交互的最佳实践之一。