JDBC

日期:2003 5 月 14 日

如何使用 JDBC 和 Oracle9i 数据库存储和检索多语言数据

在看完本方法文档后,您应该能够理解数据库如何支持多语言数据以及如何使用 JDBC 检索这样的数据。

简介

Oracle9I 数据库支持各同级别的全局化。我们将集中讨论使用列类型 NVARCHAR2 存储和检索多语言数据的独有特性。SQL NCHAR/NVARCHAR2 数据类型中使用的编码被指定为本地数据库字符集。编码可以是 AL16UTF16 或 UTF8。该列类型存储 Unicode 字符。

Unicode 是一种通用编码字符集,它允许您使用一种字符集来存储任何语言的信息。Unicode 为每一个字符提供唯一的编码,而不管是什么平台、程序或语言。

所以 NVARCHAR2 这种数据类型可用于那些需要存储多语言数据的字段

运行示例的前提条件

为了运行这里提供的示例,您需要

  • Oracle9i JDeveloper 9.0.3(可从 OTN 下载)
  • Oracle9iAS Containers for J2EE ( OC4J ) 版本 9.0.3(可从 OTN 下载)
  • Oracle 9i 数据库服务器(可从 OTN 下载
  • Apache Ant 1.4.x,如果您准备部署在 OC4J 上(可从 Apache 下载)。
  • 源文件(可从此处下载。

说明

我们将有一个叫做 Products 的表,表中的列定义如下所示

id - VARCHAR2(10) — 产品 id
lang_id — VARCHAR2(10) — 产品描述的语言 id
description — NVARCHAR2(2000) — Unicode 编码的产品描述

我们将有两个类来操纵该表。

  • 一个简单的 Javabean Product,它代表 Products 表中的一个记录。这个 bean 有用于该字段的 getter 和 setter。
  • ProductManager 类定义对该表的一些操作,如 addProduct、deleteProduct 和 getProduct。

JSP 文件 display.jspadd.jsp 将被用于显示/添加/删除产品。

JDBC 允许 Java 程序访问 Oracle9i 数据库中的 NVARCHAR2 数据类型的列。Oracle JDBC 驱动程序把 SQL NCHAR/NVARCHAR2 列中的数据从本地字符集编码(UTF8 或 AL16UTF16)直接转化为 UTF-16 编码的 Java 字符串。
为此,我们需要把 Java 字符串绑定到一个 NVARCHAR2 列。下面的代码段显示了完成这项任务的代码。


// Get an Oracle preparedstatement
OraclePreparedStatement orastmt =(OraclePreparedStatement)connection.prepareStatement(
"INSERT INTO PRODUCTS VALUES(?,?,?)")
;
// Bind the 3rd parameter to NVARCHAR2 form so that the data is stored as unicode
orastmt.setFormOfUse(3,OraclePreparedStatement.FORM_NCHAR);

orastmt.setString(1,product.getId());
orastmt.setString(2,product.getLangId());
orastmt.setString(3,product.getDescription());
orastmt.executeUpdate();
orastmt.close();

我们使用 orastmt.setFormOfUse() 方法来指定列的类型是 NVARCHAR2。这将确保数据将以 Unicode 编码存储。

从该列检索数据很简单,只需使用普通的 JDBC 代码。

PreparedStatement stmt = connection.prepareStatement("SELECT * PRODUCTS WHERE ID=?"); stmt.setString(1,id);
ResultSet rSet = stmt.executeQuery();
if(rSet.next()){
Product product = new Product();
product.setId(rSet.getString("ID"));
product.setLangId(rSet.getString("LANG_ID"));
product.setDescription(rSet.getString("DESCRIPTION"));
rSet.close();
stmt.close();
return product;
}

当在 JSP 中显示 Unicode 数据时,我们要在页面的开始把字符设置为 UTF 8。

<%@ page contentType="text/html;charset=UTF-8"%>

当接受来自 HTML 表单的用户输入时,我们把用于请求的字符编码设置为 UTF 8。

request.setCharacterEncoding("UTF-8");

运行示例

从 Oracle9i JDeveloper 运行
  • 连接到 Oracle9i 数据库并运行脚本 create_table.sql
  • 在 Oracle9i JDeveloper 中打开文件 Globalization.jws
  • 修改 ProductManager.java 中的变量 JDBC_URL,USERPASSWORD 的值
  • 选择 Globalization.jpr 并选择 Run。这将把应用程序部署到嵌入的 OC4J。您可以在浏览器中看见一列产品,有些是英文的,有些是日文的。您可以使用 'Add new product' 链接,以您希望的语言输入一个新产品的明细。
在 OC4J 上运行,
  • 启动 OC4J。
  • 在命令提示符,设置环境变量 ANT_HOME、JAVA_HOME、OC4J_HOMEOC4J_HOST
例如: c:\Globalization\set ANT_HOME=d:\ant141
c:\Globalization\set JAVA_HOME=d:\jdk1.3.1_01
c:\Globalization\set OC4J_HOME=d:\oc4j903
c:\Globalization\set OC4J_HOST=localhost:23791
  • 运行 ant
例如: c:\Globalization\ant
  • 使浏览器指向 http://:/Globalization/display.jsp

总结

在这份方法文档中您学习了如何使用字符编码模式和 NVARCHAR2 数据类型从 Oracle9i 存储和检索各种不同语言的数据。

资源


寄送此页面
Printer View 打印机视图