文章目录
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不允许我们为单个占位符(