用JDBC编写查询Access和FoxPro数据库

发表于:2007-07-14来源:作者:点击数: 标签:
用JDBC编写查询Access和FoxPro数据库 ----JDBC(Java 数 据 库 连 接:Java Database Connectivity) 是用于执行SQL语句的Java 应用 程 序 接 口(Java Application Programming Interface:Java API), 它 由 一 组 用Java 语 言 写 的 类 与 接 口 组 成
用JDBC编写查询Aclearcase/" target="_blank" >ccess和FoxPro数据库

----JDBC(Java 数 据 库 连 接:Java Database Connectivity) 是用于执行SQL语句的Java 应用 程 序 接 口(Java Application Programming Interface:Java API), 它 由 一 组 用Java 语 言 写 的 类 与 接 口 组 成。JDBC 是 一 种 规 范, 其 宗 旨 是 让 各 数 据 库 开 发 商 为Java 程 序 员 提 供 标 准 的 数据库访问类和接口。JDBC与Java结合,使用户可以很容易地把SQL语句传送到任何关系数据库中,程序员用它编写的数据库应用软件,可在各种数据库系统上运行。本文通过一个实例讨论用JDBC编写在中文Win95下访问Access(包括Access2.0, Access7.0) 和FoxPro( 包括FoxPro2.6, FoxBase2.1, dBase3.0, dBase4.0 等)数据库的Java应用程序,从中体会JDBC 在数据库应用上实现"一次编程,处处运行"的功能,

安 装JDBC
---- JDBC 类 库 已 放 入JDK1.1, 若 使 用JDK1.1, 则 无 须 安 装JDBC 及 下 面 的JDBC-ODBC; 因 目 前JDK1.1 暂 不 支 持 中 文, 固 本 文 主 要 介 绍 使 用JDK1.02 时 的JDBC 访 问 数 据 库 编 程, 此 时 需 要 安 装JDBC, 可 通 过 访 问 下 列 地 址 获 得JDBC 软 件 包( 目 前 已 有JDBC1.2 版, 本 文 使 用JDBC1.1):
---- http://splash.javasoft.com/jdbc/

---- 得到JDBC 软件(Windows 的zip 文件) 包, 用WinZip 解压, 生 成 目录JDBC,JDBC 的 所 有 内 容 都 在 这 个 目 录 中。

---- 为 在 编 译Java 程 序 时 调 用JDBC 得SQL 类 库, 应 在autoexec.bat 批 处 理 文 件 中 环 境 变 量 的:\jdbc\classes。

建 立 数 据 库 和 设 置 数 据 源
---- Access 具 备 完 善 的 数 据 库 功 能, 可 以 作 为 独 立 的DBMS 使 用, 是PC 微 机 上 开 发 客 户/ 服 务 器 型 数 据 库 应 用 的 优 秀 工 具;FoxPro(FoxBase、dBase) 是 国 内PC 微 机 用 户 常 用 的 数 据 库 软 件, 已 用 它 建 立 了 大 量 数 据 库 挡 案 资 料; 讨 论 用Java SQL API 编 写 访 问Access 和FoxPro 数 据 库 的Java 应 用 程 序 是 十 分 有 意 义 的。
---- 现 在 对 概 念 已 作 了 根 本 的 修 改: 传 统 的( 例 如:dBase3.0、FoxBase、FoxPro2.6 等) 用 于 存 贮 数 据 的*.dbf 文 件 不 再 被 称 为 数 据 库 而 被 称 为 表(table)。Access 将 若 干 个 相 关 联 的 表(Table) 组 成 一 个 数 据 库(.mdb), 每 一 个 表 相 当 于 通 常(Foxbase,Foxpro,dBase) 定 义 的 一 个 数 据 库(.dbf); 而 对FoxPro(FoxBase、dBase), 则 将 放 在 某 个 目 录 里 的 所 有 相 关 联 的*.dbf 文 件 看 作 一 个 相 当 于Access 的*.mdb 的 数 据 库。 在 下 面 的 例 子 里, 我 们 要 使 用 的 数 据 库 有 两 个 表:table1 与table2;

table1
编 号 软 件 名 姓 名 通 信 地 址 电 话
1 Access7.0 赵 一 北 京 (01)623-2731
2 Access7.0 钱 二 上 海 (21)443-6998
3 Access7.0 孙 三 天 津 (22)578-8535
4 Access7.0 李 四 长 春 (431)885-9854


table2 如 下: SupplierID Software SupplierName Address PhoneNumber
1 Access7.0 Piter France (33)687-9354
2 Access7.0 John America (1)675-4398
3 Access7.0 Tanaka Japen (81)854-3952
4 Access7.0 Hesai Mexico (52)257-5793


---- 如 下 建 立 数 据 库 与 数 据 源:

---- 1 用Access7.0 建 立 名 为acs70db.mdb 的 数 据 库 文 件, 其 中 建 有 上 面 两 个 表; 将 文 件acs70db.mdb 存 盘 到 目 录c:\datas\acs70 中; 数 据 源 名 为acs70db.mdb;

---- 2 用Access2.0 建 立 名 为acs20db.mdb 的 数 据 库 文 件, 其 中 建 有 上 面 两 个 表; 将 文 件acs20db.mdb 存 盘 到 目 录c:\datas\acs20 中; 注 意 此 时 表table1 的 字 段 名 要 改 用 英 文; 数 据 源 名 为acs20db.mdb;

---- 3 用FoxPro2.6 将 上 面 两 个 表 分 别 建 为 文 件table.dbf 与table2.dbf, 并 将 这 两 个 文 件 存 盘 到 目 录c:\datas\foxp26 中;

---- 4 用FoxBase2.1 将 上 面 两 个 表 分 别 建 为 文 件table.dbf 与table2.dbf, 并 将 这 两 个 文 件 存 盘 到 目 录c:\datas\foxb21 中;

---- 5 用dBase3.0 将 上 面 两 个 表 分 别 建 为 文 件table.dbf 与table2.dbf, 并 将 这 两 个 文 件 存 盘 到 目 录c:\datas\dbs3 中;

---- 上 列 数 据 库 制 好 后, 打 开Win95 的" 设 置" 菜 单 中 的" 控 制 面 板?* 从 中 启 动 微 软 的ODBC 设 置 相 应 的ODBC 驱 动 器 和 数 据 源( 下 面 分 别 用axs70、acs20、foxp26、foxb21 和dbs3 作 数 据 源 名)。

配 置JDBC-ODBC 驱 动 器
---- ODBC( 开 放 式 数 据 库 互 连:Open Database Connectivity) 是 用C 语 言 写 的 在 多 种 不 同 的DBMS( 数 据 库 管 理 系 统) 中 存 取 数 据 的 标 准 应 用 程 序 接 口; 目 前 应 用 最 广 的 是 微 软 的ODBC, 它 几 乎 可 将 所 有 平 台 的 所 有 数 据 库 连 接 起 来。ODBC 在 应 用 程 序 与 特 定 数 据 库 之 间 插 入 一 个 驱 动 程 序 管 理 器, 每 种 数 据 库 引 擎 都 需 要 向 驱 动 程 序 管 理 器 注 册 它 自 己 的ODBC 驱 动 程 序, 驱 动 程 序 管 理 器 将 与ODBC 兼 容 的SQL 请 求 从 应 用 程 序 传 给ODBC 驱 动 程 序 并 由ODBC 驱 动 程 序 把SQL 请 求 翻 译 为 对 数 据 库 的 固 有 调 用, 从 而 达 到 应 用 程 序 访 问 操 作 数 据 库 的 目 的。
---- JDBC 采 用JDBC-ODBC 桥 接 方 式 使Java 应 用 程 序 使 用ODBC。JDBC-ODBC Bridge 软 件 包 可 通 过 下 列 地 址 得 到:

---- http://splash.javasoft.com/jdbc/

---- 用WinZip 解 压 后 形 成jdbc-odbc 目 录, 目 录 中 包 括 了 所 需 内 容, 同 时 在autoexec.bat 批 处 理 文 件 中 将?:\jdbc-odbc\classes" 加 进?et CLASSPATH?" 中; 将?:\jdbc-odbc\classes\sun\jdbc\odbc" 加 进?et PATH?" 中**

使 用SQL
---- SQL( 结 构 化 查 询 语 言:) 提 供 了 一 个 查 询 不 同 数 据 源 数 据 的 标 准 方 式, 在1986 年 被 采 纳 为 工 业 标 准, 在1992 年 经 全 面 调 整 后 称 为SQL92( 或SQL2), 目 前SQL3 正 处 于 研 制 中。 下 面 简 要 介 绍SQL 的 主 要 命 令 及 其 意 义:
---- COMMIT: 大 多 数 关 系 数 据 库 系 统RDBMS 以 事 务 为 处 理 单 位, 一 个 事 务 可 包 含 多 个 动 作。COMMIT 命 令 指 示 数 据 库 记 录 到 当 前 点 时 执 行 的 所 有 动 作 和 重 置 事 务;
---- INSERT: 指 示 数 据 库 在 表 中 插 入 行;
---- DELETE: 指 示 数 据 库 在 表 中 删 除 行;
---- SELECT: 指 示 数 据 库 从 表 中 返 回 行;
---- UPDATA: 指 示 数 据 库 修 改 表 中 的 行。

编 写 访 问 数 据 源 的Java 应 用 程 序
---- 很 容 易 用JDBC 编 写 访 问、 操 作 数 据 库 的Java 应 用 程 序; 应 用 程 序 一 般 作 下 面 三 件 事:
---- (1) 加 载JDBC-ODBC bridge 驱 动 程 序;

---- (2) 建 立 与 数 据 库 的 连 接、 发 送 访 问、 操 作 数 据 库 的SQL 语 句;

---- (3) 处 理(2) 对 数 据 库 访 问、 操 作 的 结 果。

---- 对 此, 可 如 下 使 用Class.forName 方 法 显 式 加 载 驱 动 程 序 来 完 成(1):

---- Class.forName("sun.jdbc.odbc.JdbsOdbcDriver");

---- 为 使 程 序 通 用, 编 写 一 个 方 法( 函 数) 来 完 成(2):

---- static ResultSet creatResultSet(String s1,String s2)

---- 该 方 法 中 的 两 个 参 数 是 字 符 串s1( 数 据 源 名) 与s2(SQL 语 句), 返 回 对 数 据 源s1 进 行s2 访 问 操 作 的 结 果; 因 此 调 用 该 方 法 即 实 现" 与 数 据 源s1 连 接 并 向 其 中 进 行s2 的SQL 查 询 并 返 回 查 询 结 果?* 为 完 成**3), 设 计 方 法:

---- static void showResultSet(ResultSet rs)

---- 该 方 法 将 查 询 结 果rs 在 屏 幕 上 显 示 出 来。

---- 综 上, 我 们 在 下 面 的 源 程 序 中 调 用 方 法creatResultSet(String s1,String s2) 两 次: 一 次 查 询FoxPro2.6 数 据 库 的 表 二, 另 一 次 查 询Access7.0 数 据 库 的 表 一; 并 调 用 方 法showResultSet(ResultSet rs) 将 结 果 显 示( 见 附 图):

class test{
public static void main(String args[]) {
try {
//数据源与查询语句:
String sjy1="acs70",sjy2="acs20",sjy3="foxp26",
sjy4="foxb21",sjy5="dbs3";
String sql1="SELECT * FROM table1 WHERE编号<5";
String sql2="SELECT * FROM table2 WHERE SupplierID<5";
//加载(sun公司的)JDBC-ODBC bridge驱动程序:
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
//与数据源sjy*连接进行sql*查询,返回查询结果rs1:
ResultSet rs1=creatResultSet(sjy3,sql2);
ResultSet rs2=creatResultSet(sjy1,sql1);
//显示查询结果:
System.out.println("\n下面是您查询FoxPro2.6
数据库的结果: ");
System.out.println("=================== ");
showResultSet(rs1);
System.out.println("====================");
System.out.println("\n下面是您查询Access7.0数据库的结果: ");
System.out.println("=================== ");
showResultSet(rs2);
System.out.println("====================");

//关闭对象:
rs1.close();rs2.close();
}
catch (SQLException ex) {
System.out.println("\n***SQL异常!***\n");
}
catch (java.lang.Exception ex){
ex.printStackTrace();
}
}
//与数据源s1连接并向其中进行s2的SQL
查询并返回查询结果的方法:
private static ResultSet creatResultSet(String s1,String s2)
throws SQLException {
//指定数据源:
String datasr=s1; //数据源名
//建立与数据的连接:
//与数据源datasr连接
(因方法getConnection为静态的,故以类名调用):
Connection con1 = DriverManager.getConnection
("jdbc:odbc:"+datasr);
System.out.println("\nOK!连接成功!");
//发送SQL语句,对数据源进行操作:
//要执行SQL查询语句,首先需创建Statement对象:
Statement stmt1=con1.createStatement();
//对数据源中的数据表tables在Statement对象上
使用方法executeQuery执行一个查询语句:
//该语句将在rs1中返回表中的所有行(记录):
return stmt1.executeQuery(s2);
}

private static void showResultSet(ResultSet rs)
throws SQLException {
int i;
String tmpstr;
ResultSetMetaData rsmd = rs.getMetaData();
int numCols =rsmd.getColumnCount();
//
for(i=1;i<=numCols;i++){
if(i>1)System.out.print(", ");
System.out.print(rsmd.getColumnLabel(i));
}
System.out.println("");
System.out.println("------------------- ");
//
while(rs.next()){
for(i=1;i<=numCols;i++){
if(i>1)System.out.print(", ");
tmpstr=rs.getString(i);
if(rs.wasNull())System.out.print("NULL");
else System.out.print(tmpstr);
}
System.out.println("");
}
}
}

原文转自:http://www.ltesting.net