Statement 和 PreparedStatement 详解
文章目录
一、定义
在 Java 数据库编程中,Statement
和 PreparedStatement
是两种用于执行 SQL 语句的接口
理解:在Java语句里执行SQL语句。
二、 Statement
1、定义: Statement
用于执行不带参数的静态 SQL 语句。它适合于执行一次性的 SQL 查询。
2、优点:
- 简单直接,适合执行不带参数的静态 SQL 语句。
3、缺点:
- 每次执行 SQL 语句时,数据库必须重新解析和编译 SQL 语句,这会影响性能。
- 容易受到 SQL 注入攻击。
4、用法:
// 创建 Statement 对象
Statement stmt = connection.createStatement();
// 执行 SQL 查询
ResultSet rs = stmt.executeQuery("SELECT * FROM student_table");
// 处理结果集
while (rs.next()) {
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("name"));
}
三、PreparedStatement
1、定义: PreparedStatement
用于执行带参数的预编译 SQL 语句。它可以多次高效地执行,尤其适合重复执行相同的 SQL 语句但使用不同参数的情况。
理解:
2、优点:
- 预编译 SQL 语句,提高性能。编译后的 SQL 语句可以多次执行而不需要重新解析。
- 防止 SQL 注入攻击。参数使用占位符 (
?
),确保传递的参数不会被解释为 SQL 代码。
3、缺点:
- 稍微复杂一些,需要先准备 SQL 语句并设置参数。
4、用法
// 创建 PreparedStatement 对象
PreparedStatement pstmt = connection.prepareStatement("SELECT * FROM student_table WHERE id = ?");
// 设置参数
pstmt.setInt(1, 123);
// 执行查询
ResultSet rs = pstmt.executeQuery();
// 处理结果集
while (rs.next()) {
System.out.println(rs.getInt("id"));
System.out.println(rs.getString("name"));
}
四、Statement 和 PreparedStatement的区别
在JDBC应用中,如果你已经是稍有水平开发者,你就应该始终以PreparedStatement代替Statement.也就是说,在任何时候都不要使用Statement。
1、 PreparedStatement 实例包含已编译的 SQL 语句, 所以其执行速度要快于 Statement 对象。
2、 Statement为一条Sql语句生成执行计划, 如果要执行两条sql语句 select colume from table where colume=1;select colume from table where colume=2; 会生成两个执行计划 一千个查询就生成一千个执行计划! PreparedStatement用于使用绑定变量重用执行计划 select colume from table where colume=:x; 通过set不同数据只需要生成一次执行计划,可以重用。
3、Statement执行一次性的、不带参数的 SQL 语句。SQL 语句内容是动态生成的,不适合预编译的场景。
PreparedStatement用于执行预编译的 SQL 语句,可以多次执行带有参数的 SQL 语句。特别适用对于重复执行相同查询的情况。
4、 Statement更容易受到 SQL 注入攻击的威胁,因为 SQL 查询是动态构建的。
PreparedStatement更安全,能有效防止 SQL 注入,因为参数是通过占位符(?
)进行绑定的,数据和查询逻辑是分开的。
5、Statement由于 SQL 语句和参数混合在一起,代码可读性较差,维护起来也较为繁琐。
PreparedStatementSQL 语句结构清晰,参数通过方法进行设置,代码更易读,更容易维护。