Statement 和 PreparedStatement 详解

43 篇文章 0 订阅
9 篇文章 0 订阅

Statement 和 PreparedStatement 详解

一、定义

在 Java 数据库编程中,StatementPreparedStatement 是两种用于执行 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 语句结构清晰,参数通过方法进行设置,代码更易读,更容易维护。

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值