传送给数据库的 SQL 语句通过一个包含两个步骤的过程来返回结果。首先准备它们,然后处理它们。借助 Statement 对象,这两个阶段对应用程序而言变成一个阶段。PreparedStatement 允许将这两个步骤分开。准备步骤在创建对象时发生,而处理步骤在对 PreparedStatement 对象调用 executeQuery、executeUpdate 或 execute 方法时发生。
如果不添加参数标记,能够将 SQL 处理分割成单独的阶段并没有意义。参数标记放在应用程序中,从而使它能够告诉数据库它在准备时并不具有特定的值,但它在处理之前提供一个值。在 SQL 语句中,参数标记是使用问号表示的。
通过使用参数标记,有可能创建用于特定请求的一般 SQL 语句。例如,给定以下 SQL 查询语句:
SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME = 'DETTINGER'
这是一个特定的 SQL 语句,它只返回一个值;即关于名为 Dettinger 的雇员的信息。通过添加参数标记,可以使语句更为灵活:
SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME = ?
通过简单地将参数标记设置为某个值,可以获取关于表中的任何雇员的信息。
由于前一个 Statement 示例可以只经过一次准备阶段并接着使用不同的参数值来重复地进行处理,所以 PreparedStatement 能够提供比 Statement 更高的性能。
注意:要支持本机 JDBC 驱动程序的语句合用,必须使用 PreparedStatement。
prepareStatement 方法用来创建新的 PreparedStatement 对象。与 createStatement 方法不同,创建 PreparedStatement 对象时必须提供 SQL 语句。在那个时候,对 SQL 语句进行预编译以供使用。例如,假定已存在名为 conn 的 Connection 对象,以下示例将创建 PreparedStatement 对象并准备要在数据库中处理的 SQL 语句。
PreparedStatement ps = conn.prepareStatement("SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME = ?");
与 createStatement 方法相同,重载 prepareStatement 方法的目的是提供对指定 ResultSet 特征的支持。prepareStatement 方法还具有变体,可使用自动生成的键。以下是有效 prepareStatement 方法调用的一些示例:
示例:prepareStatement 方法
注意:请阅读代码示例不保证声明以了解重要的法律信息。
// New in JDBC 2.0 PreparedStatement ps2 = conn.prepareStatement("SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME = ?", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATEABLE); // New in JDBC 3.0 PreparedStatement ps3 = conn.prepareStatement("SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME = ?", ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATEABLE, ResultSet.HOLD_CURSOR_OVER_COMMIT); PreparedStatement ps4 = conn.prepareStatement("SELECT * FROM EMPLOYEE_TABLE WHERE LASTNAME = ?", Statement.RETURN_GENERATED_KEYS);
在可以处理 PreparedStatement 对象之前,必须将每个参数标记设置为一些值。PreparedStatement 对象提供了许多个用于设置参数的方法。所有这些方法的格式均为 set<Type>,其中 <Type> 是 Java 数据类型。这些方法的一些示例包括 setInt、setLong、setString、setTimestamp、setNull 和 setBlob。几乎所有这些方法都有两个参数:
有关更多信息,请查阅 java.sql 包的 Javadoc。通过对 ps 给出在先前示例中准备的 SQL 语句,以下代码说明了如何在处理之前指定参数值:
ps.setString(1,'Dettinger');
如果尝试处理带有尚未设置的参数标记的 PreparedStatement,则将抛出 SQLException。
注意:在设置参数标记之后,除非发生下列情况,否则参数标记将保持具有同一个值。
clearParameters 方法将所有参数都标记为尚未设置。在进行 clearParameters 调用之后,在执行下一个过程之前,必须再次对所有参数调用 set 方法。
新的 ParameterMetaData 接口允许检索关于参数的信息。此支持与 ResultSetMetaData 相符并且类似。提供了全面的诸如精度、标度、数据类型、数据类型名以及该参数是否允许空值之类的信息。