JDBC API 4.2(六):PreparedStatement 接口源码分析

1、简述

Java JDBC PreparedStatement 表示预编译的SQL语句的对象,SQL语句已预编译并存储在PreparedStatement对象中。 然后可以使用该对象多次有效地执行该语句。

让我们看一下参数化查询的简单示例:

String sql = "insert into users values(?,?,?)";  

如您所见,我们正在为值传递参数(?)。 它的值将通过调用PreparedStatement的setter方法进行设置。

注意:用于设置IN参数值的setter方法(setShort,setString等)必须指定与输入参数的已定义SQL类型兼容的类型。 例如,如果IN参数的SQL类型为INTEGER,则应使用setInt方法。

如果需要任意参数类型转换,则应将setObject方法与目标SQL类型一起使用。

在以下设置参数的示例中,con表示活动连接:

PreparedStatement pstmt = con.prepareStatement("UPDATE EMPLOYEES
                                     SET SALARY = ? WHERE ID = ?");
   pstmt.setBigDecimal(1, 153833.00)
   pstmt.setInt(2, 110592)

Java JDBC PreparedStatement的主要功能有:

  • 易于在SQL语句中插入参数。
  • 易于重新使用带有新参数值的PreparedStatement。
  • 可能会提高执行语句的性能。
  • 使批量更新更容易。

2、PreparedStatement 类图

通过类图,我们可知 PreparedStatement 继承于 Statement,可以看作是对 Statement 对象功能的增强。其中最终要的一条是,PreparedStatement 接口采用参数的SQL语句,您可以使用同一条语句,在每次执行时为其提供不同的值。

PreparedStatement 比 Statement 性能好,因为 使用PreparedStatement接口的SQL仅被编译一次, 当我们重复使用PreparedStatement或将其批处理方法用于执行多个查询时,它会变得更加明显。

在这里插入图片描述

3、为什么要使用PreparedStatement?

  • PreparedStatement 帮助我们防止SQL注入攻击,因为它会自动转义特殊字符。
  • PreparedStatement 允许我们使用参数输入执行动态查询。
  • PreparedStatement 提供了不同类型的setter方法,以设置查询的输入参数。
  • PreparedStatement 帮助我们使用setter方法编写面向对象的代码,而使用Statement,则必须使用String Concatenation 创建查询。 如果要设置多个参数,则使用String串联编写Query看起来非常难看并且容易出错。
  • 与Java数组或列表不同,PreparedStatement变量的索引从1开始。

尽管 PreparedStatement 相比于 Statement 具有一定的优势,但是 PreparedStatement 也有局限性。我们不能将其用于带有IN子句的SQL查询,因为PreparedStatement不允许我们为单个占位符(

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值