传送给数据库的 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。几乎所有这些方法都有两个参数:
第一个参数是该参数在语句中的索引。参数标记具有从 1 开始的编号。
第二个参数是要对第一个参数设置的值。有几个 set<Type> 方法具有附加的参数,如 setBinaryStream 上的长度参数。
有关更多信息,请查阅 java.sql 包的 Javadoc。通过对 ps 给出在先前示例中准备的 SQL 语句,以下代码说明了如何在处理之前指定参数值:
ps.setString(1,'Dettinger');
如果尝试处理带有尚未设置的参数标记的 PreparedStatement,则将抛出 SQLException。
注意:在设置参数标记之后,除非发生下列情况,否则参数标记将保持具有同一个值。
另一个 set 方法调用更改了该值。
调用 clearParameters 方法时除去了该值。
clearParameters 方法将所有参数都标记为尚未设置。在进行 clearParameters 调用之后,在执行下一个过程之前,必须再次对所有参数调用 set 方法。
新的 ParameterMetaData 接口允许检索关于参数的信息。此支持与 ResultSetMetaData 相符并且类似。提供了全面的诸如精度、标度、数据类型、数据类型名以及该参数是否允许空值之类的信息。
分享到:
相关推荐
**JDBC(用PrepareStatement实现)** Java Database Connectivity (JDBC) 是Java平台中的一个标准API,用于在Java应用程序和各种数据库之间建立桥梁。它允许Java开发者执行SQL语句,进行数据查询、更新和删除等操作。...
下面我们将详细介绍 `PreparedStatement` 的基本概念、如何创建 `PreparedStatement` 对象以及如何设置参数。 #### 一、概述 `PreparedStatement` 是 JDBC API 中用于执行预编译 SQL 语句的对象。相比于普通的 `...
prepareStatement和Statement是 Java 中两个常用的数据库操作接口,它们都可以用来执行 SQL 语句,但是它们之间有着明显的区别。 首先,从创建时的区别开始,Statement 需要通过 Connection 对象的 createStatement...
这个资源提供的示例代码将帮助开发者深入理解如何在实际项目中运用JDBC的PrepareStatement进行MySQL操作,无论是简单的查询、更新,还是复杂的批量处理,都有详细的示例作为参考。学习并掌握这些内容,对于提升Java...
本文将详细介绍如何通过传递参数的方法实现对SQLite数据库的添加和查询操作,避免直接拼接SQL语句,从而提高代码的安全性和可读性。 首先,确保你的项目已经引入了SQLite的JDBC驱动,如`sqlite-jdbc-3.27.2.1.jar`...
PreparedStatement ps = connection.prepareStatement(sql); ps.setInt(1, 10); ``` 在这个例子中,我们想知道实际执行的SQL语句是"SELECT * FROM table WHERE id = 10"。为了实现这个需求,我们可以自定义一个辅助...
PreparedStatement pstmt = con.prepareStatement("INSERT INTO Table1 (a, b) VALUES (?, ?)"); pstmt.setInt(1, 1); pstmt.setString(2, "value"); pstmt.executeUpdate(); ``` ### CallableStatement `...
JAVA连接FileMaker完整工程 包函FileMaker数据库Java连接驱动 修改工程中的FileMaker安装地址就 可以用JAVA操作FileMaker ... prepareStatement = con.prepareStatement(insertSQL); b = prepareStatement.execute();
perstmt = con.prepareStatement("insert into tb_name (col1,col2,col2,col4) values (?,?,?,?)"); perstmt.setString(1,var1); perstmt.setString(2,var2); perstmt.setString(3,var3); perstmt.setString(4,var4)...
【数据库原理:为什么PrepareStatement性能更好更安全】 在数据库编程中,我们经常遇到两种执行SQL语句的方法:Statement和PreparedStatement。尽管Statement看起来更简洁,但在实际应用中,尤其是在使用ORM框架如...
In Oracle Metalink (Oracle's support site - Note ID 736273.1...Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 12 at oracle.jdbc.driver.OracleSql.computeBasicInfo(OracleSql.java:950)
本文将详细介绍这两种方法的使用方式及注意事项。 #### 一、`PreparedStatement`简介 `PreparedStatement`是`Statement`接口的子接口,用于预编译SQL语句,并可以重复执行这些预编译过的SQL语句。这不仅能够提高...
本文将详细介绍如何使用Java连接到Access的MDB文件,并执行基本的读写操作。 首先,要实现这一功能,我们需要依赖JDBC-ODBC桥接驱动,它允许Java应用程序通过JDBC(Java Database Connectivity)接口与ODBC(Open ...
public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency, int resultSetHoldability) throws SQLException { return null;} public CallableStatement prepareCall...
### Java对象持久化的详细介绍 #### 一、对象持久化概念 **对象持久化**是指将对象的状态信息(即对象的数据成员)保存到某种持久性存储介质(如硬盘、磁盘等)上的过程。这种方式可以确保即使在应用程序关闭后,...
下面将详细介绍这个主题。 1. **JDBC基础**: JDBC是Java API,它为Java程序员提供了一组接口和类,用于与各种数据库进行通信。JDBC允许我们连接到不同的数据库系统,执行SQL语句,并处理返回的结果。 2. **...
本文将详细介绍如何在Java中实现这些基本操作,并提供具体的代码示例。 #### 一、环境准备 在开始之前,确保已经安装了以下组件: - Java 开发工具包 (JDK) - 一个支持Java的数据库(如 MySQL、Oracle 或 ...
PreparedStatement pstmt = conn.prepareStatement("INSERT INTO employees VALUES (?, ?)"); pstmt.setString(1, "John Doe"); pstmt.setInt(2, 30); pstmt.executeUpdate(); ``` 5. **处理结果集ResultSet**...
ps = conn.prepareStatement(DBSql.SELECT_CLASS_STU_SNO_SNAME_EXAM); ps.setInt(1, examVo.getC_id()); rs = ps.executeQuery(); while (rs.next()) { sNum[i] = rs.getInt(1); sName[i] = ...