JDBC的PreparedStatement是什么?

博客介绍了JDBC的PreparedStatement,它代表预编译的SQL语句,可通过setter方法传入查询变量,能高效执行多次对应SQL语句。同时,它会自动对特殊字符转义,可避免SQL注入攻击,建议尽量使用。

JDBC的PreparedStatement是什么?
PreparedStatement对象代表的是一个预编译的SQL语句。用它提供的setter方法可以传入查询的变量。由于PreparedStatement是预编译的,通过它可以将对应的SQL语句高效的执行多次。由于PreparedStatement自动对特殊字符转 义,避免了SQL注入攻击,因此应当尽量的使用它。

`PreparedStatement` 是 Java 中用于执行预编译 SQL 语句的核心接口之一,属于 JDBC(Java Database Connectivity) API 的一部分。它继承自 `Statement` 接口,但相比普通的 `Statement`,`PreparedStatement` 提供了**参数化查询**的功能,能有效防止 **SQL 注入**,并提高 SQL 执行效率。 --- ## 一、PreparedStatement 的作用 ### ✅ 1. 防止 SQL 注入 通过使用 `?` 作为占位符,`PreparedStatement` 会将用户输入的数据视为**参数值**,而不是 SQL 语句的一部分,从而防止恶意输入篡改 SQL 逻辑。 ### ✅ 2. 提高执行效率 数据库会对预编译的 SQL 语句进行缓存,当多次执行相同结构的 SQL(不同参数)时,可以**减少 SQL 解析和编译的开销**。 ### ✅ 3. 提高代码可读性和可维护性 使用参数化 SQL 可以使 SQL 语句与数据分离,逻辑更清晰。 --- ## 二、PreparedStatement 的使用方法 ### 示例:使用 `PreparedStatement` 查询用户 ```java import java.sql.*; public class PreparedStatementExample { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/mydb"; String user = "root"; String password = "123456"; String username = "alice"; // 假设这是用户输入 String pwd = "password123"; // 假设这是用户输入 try (Connection conn = DriverManager.getConnection(url, user, password)) { String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; try (PreparedStatement pstmt = conn.prepareStatement(sql)) { // 设置参数值(注意索引从 1 开始) pstmt.setString(1, username); pstmt.setString(2, pwd); // 执行查询 try (ResultSet rs = pstmt.executeQuery()) { while (rs.next()) { System.out.println("User found: " + rs.getString("username")); } } } } catch (SQLException e) { e.printStackTrace(); } } } ``` --- ## 三、PreparedStatement 的常用方法 | 方法名 | 说明 | |--------|------| | `setString(int parameterIndex, String x)` | 设置字符串参数 | | `setInt(int parameterIndex, int x)` | 设置整数参数 | | `setDouble(int parameterIndex, double x)` | 设置浮点数参数 | | `setDate(int parameterIndex, Date x)` | 设置日期参数 | | `setObject(int parameterIndex, Object x)` | 设置任意类型参数 | | `executeQuery()` | 执行查询(返回 `ResultSet`) | | `executeUpdate()` | 执行插入、更新、删除操作(返回受影响行数) | --- ## 四、与 Statement 的区别 | 特性 | `Statement` | `PreparedStatement` | |------|-------------|----------------------| | SQL 注入 | ❌ 易受攻击 | ✅ 安全 | | 参数化 | ❌ 不支持 | ✅ 支持 | | 性能 | ❌ 每次都重新编译 SQL | ✅ 可预编译、复用 | | 可读性 | ❌ 拼接麻烦 | ✅ 更清晰 | --- ## 五、PreparedStatement 的内部机制 当你执行 `conn.prepareStatement(sql)` 时: 1. JDBC 会将 SQL 语句发送给数据库进行预编译。 2. 数据库解析 SQL 结构并生成执行计划。 3. 在后续调用 `setXXX()` 方法时,只是替换参数值,不会影响 SQL 结构。 4. 最终执行时,数据库直接使用已编译的计划执行查询。 --- ## 六、总结 | 项目 | 描述 | |------|------| | 类型 | Java JDBC API 的接口 | | 作用 | 防止 SQL 注入、提高性能、参数化 SQL | | 使用方式 | 使用 `?` 作为占位符,配合 `setXXX()` 方法赋值 | | 推荐场景 | 所有需要用户输入参数的 SQL 查询/更新操作 | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值