JDBC 3.0 特性:命名参数 — 在 PreparedStatement 中使用 Oracle Database 10g JDBC API
日期:2004 年 1 月 14 日
目标
| 本文档将帮助您了解: |
? 如何使用新推出的 Oracle Database 10g JDBC API,以便在 Java 类的 PreparedStatement 中使用命名参数。 ? 如何运行示例 Java 应用程序,演示在 JDBC 代码中用于命名参数的 Oracle 专用 JDBC API。 |
目录
引言 必要条件 所需软件 在 JDBC 中使用 Oracle 专用 API 来绑定 PreparedStatement 的参数 运行示例 Java 应用程序 有用参考
引言
JDBC(Java 数据库连接)是连接 Java 与关系数据库的标准 Java 接口。JDBC 标准由 Sun Microsystems 定义,允许独立供应商自行实施和扩展该标准。
除了支持标准 JDBC API,Oracle 驱动程序还拥有支持 Oracle-专用数据类型并提高性能的扩展。本文档介绍了新的 Oracle JDBC 10g 专用 API,用于在 JDBC 类中设置 PreparedStatement 对象的命名参数。有关 Oracle JDBC 的详细信息,请参阅本文档中有用参考部分。
必要条件
要完成本方法文档,必须简要了解 JDBC 的基本概念以及如何使用 JDBC API 连接数据库进行基本的 CRUD(创建、读取、更新和删除)操作 — 这是基本的数据库操作。此外,您需要了解基本的 Oracle 数据库概念。
所需软件
- Oracle Database 10g.可以从此处下载数据库。
- Oracle Database 10g JDBC 驱动程序。可以从此处下载。
- JDK1.4.x 或更高版本可以从 此处下载。
注意:JDBC 驱动程序类在 Oracle 客户端或数据库安装版本中提供,不需要单独下载。
在 JDBC 中使用 Oracle 专用 API 来绑定 PreparedStatement 的参数
说明
Oracle JDBC 10g 通过提供两套 API 来支持命名参数。
-
set(String, ...)
-
setAtName((String, ...)
set(String, ...) 是用于 CallableStatement 特性的 JDBC 3.0 命名参数的一部分,并且只能用于 CallableStatement。参数名是 IN、OUT 或 INOUT 参数的实际名称。可以参考此 OTN 示例: "NamedParameters”,该示例演示如何在 CallableStatement 中使用命名参数。
setAtName(String,...) 是 Oracle Database 10g JDBC 驱动程序的一部分;这些驱动程序是在 PreparedStatement 中使用的 Oracle 专用 API。参数的 SQL 语法举例来说,应该是 ”:num” 用于名为 ”num” 的参数。 "SELECT * FROM table1 WHERE column3 < :num AND column5 > :num"
使用 setAtName(String,...) 的好处在于,如果变量显示一次以上,您只需将其绑定一次。对于先前提到的 SQL 语句,您只需调用一次 setIntAtName("num", 100)。
示例情况:
让我们来看一个数据库表:PRODUCT_INFORMATION 存储产品信息,如:产品标识号、名称、说明、最低价格、定价等。我们应该使用 Oracle 专用 API 从 Java 类的 PreparedStatement 中检索产品信息。 以下 SQL 语句在数据库中创建 "PRODUCT_INFORMATION” 表以及几条记录。
注意:该表在 Oracle 数据库安装版本的 ”OE” 模式中提供。
SQL 脚本:
SQL> CREATE TABLE product_information(PRODUCT_ID NUMBER(6) NOT NULL, PRODUCT_NAME VARCHAR2(50) NOT NULL, PRODUCT_DESCRIPTION VARCHAR2(2000) NOT NULL, MIN_PRICE NUMBER(8,2), LIST_PRICE NUMBER(8,2)); SQL> INSERT INTO product_information VALUES(2400, 'DIMM - 512 MB', '512 MB DIMM memory. Improved memory upgrade granularity', 380, 448); SQL> INSERT INTO product_information VALUES(2401, 'DIMM - 64MB', 'Memory DIMM: RAM, 64MB (100-MHz Unregistered ECC SDRAM)', 202, 247); SQL> INSERT INTO product_information VALUES(2402, 'EDO - 32MB', 'Memory EDO SIM: RAM, 32 MB (100-MHz Unregistered ECC SDRAM)', 149, 179);
|
|
以下代码段演示如何使用 Oracle Database 10g JDBC API 进行 ”SELECT” 操作。请参阅 UsingOracleNamedParameters.java 文件,以得到完整的可运行 Java 类。
..........
//Database Connection object Connection conn = null;
// OraclePreparedStatement object OraclePreparedStatement pstmt = null;
// ResultSet object ResultSet rst = null; .......
// Create SQL query statement to retrieve records from product_information // table in the database. String sqlString = "SELECT product_id, product_name, product_description," + "list_price, min_price FROM product_information " + "WHERE product_name LIKE :pname AND " + "list_price <= :price AND min_price <= :price";
// Connect to the database. ...... // Use OraclePreparedStatement pstmt = (OraclePreparedStatement)conn.prepareStatement(sqlString);
String val = "%"+name+"%";
// Use Oracle Specific APIs to set the values for the bind parameters // in the SQL statement. Note that price is bound only once. pstmt.setStringAtName("pname",val); pstmt.setIntAtName("price", priceVal);
// Execute the query. rst = pstmt.executeQuery(); ............
|
|
运行示例 Java 应用程序
- 将类文件
UsingOracleNamedParameters.java 从此处复制到一个目录,例如 UsingOracleNamedParameters
- 在
UsingOracleNamedParameters 目录中,将 JDBC 驱动程序类包括在 CLASSPATH 中。
- 在 JDK 1.4.x 中使用
ojdbc14.jar。
- 还要将当前目录 (.) 包括在 CLASSPATH 中。
- 确保已经创建了含有几条记录的数据库表 ”product_information”。参阅 SQL 脚本以了解详细信息。
- 编辑文件
UsingOracleNamedParameters.java 设置数据库详细信息。更改文件中的以下各行:
// Set database URL details. String url = "jdbc:oracle:thin:@localhost:1521:orcl"; // Get the database connection. conn = DriverManager.getConnection(url,"oe","oe");
提供创建该表的用户名和口令。保存此文件。
- 使用以下命令编译 Java 文件:
javac -d .UsingOracleNamedParameters.java
- 使用以下命令运行该类:
java oracle.otnsamples.jdbc.UsingOracleNamedParameters 该命令将输出显示如下:
name:DIMM - 512 MB listprice:448 minprice:380 name:DIMM - 64MB listprice:247 minprice: 202
有用的参考
请在 OTN 示例代码论坛中发表您对此示例的意见。 |