先各自简单介绍一下ODBC和JDBC。
ODBC(Open Database Connectivity)是一组对数据库访问的标准API,这些API通过SQL来完成大部分任务,而且它本身也支持SQL语言,支持用户发来的SQL。ODBC定义了访问数据库API的一组规范,这些API独立于形色各异的DBMS和编程语言。
也就是说,一个基于ODBC的应用程序,对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由对应的DBMS的ODBC驱动程序完成。不论是SQL Server、Access还是Oracle数据库,均可用ODBC API进行访问。
由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。
JDBC(JavaDatabase Connectivity)是Java与数据库的接口规范,JDBC定义了一个支持标准SQL功能的通用低层API,它由Java 语言编写的类和接口组成,旨在让各数据库开发商为Java程序员提供标准的数据库API。
JDBC API定义了若干Java中的类,表示数据库连接、SQL指令、结果集、数据库元数据等。它允许Java程序员发送SQL指令并处理结果。
其实JDBC和ODBC总的来说还是有更多的共同点:
比如,JDBC与ODBC都是基于X/Open的SQL调用级接口;
从结构上来讲,JDBC的总体结构类似于ODBC,都有四个组件:应用程序、驱动程序管理器、驱动程序和数据源,工作原 理亦大体相同;
在内容交互方面,JDBC保持了ODBC的基本特性,也独立于特定数据库. 而且都不是直接与数据库交互,而是通过驱动程序管理器。
他们二者之间的区别:
windows7中的ODBC
控制面板-》管理工具-》 ODBC
用JAVA连接数据库主要有两种方式,
一是用JDBC-ODBC桥来连接,二是用相关厂商提供的相应驱动程序来连接,首先谈谈第一种连接。
JDBC-ODBC桥接器是用JdbcOdbc.Class和一个用于访问ODBC驱动程序的本地库实现的。对于WINDOWS平台,该本地库是一个动态连接库DLL(JDBCODBC.DLL)。
由于JDBC在设计上与ODBC很接近。在内部,这个驱动程序把JDBC的方法映射到ODBC调用上,这样,JDBC就可以和任何可用的ODBC驱动程序进行交互了。这种桥接器的优点是,它使JDBC目前有能力访问几乎所有的数据库。通行方式如图所示:
应用程序---JDBC API---JDBC-ODBC---ODBC API---ODBC层---数据源
具体操作方法为:
首先打开控制面板的管理工具,打开数据源(ODBC),在用户DSN里面添加数据源(即你要连接的数据库的名字),在这里假定连接SQL SERVER 2000的GoodsSupply数据库。名称填写你要连接的数据库的名称(GoodsSupply),然后逐步设置,如果选用了使用SQL-SERVER密码认证的话,就要输入相应的用户名及密码连接到数据库。一路下一步设置完成。
在JAVA里面编写程序进行测试,在这里我的程序是让用户输入任意的表名与与列名,把该列的所有数据输出。源代码如下:
代码:
package test;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.sql.Connection;
import java.sql.DatabaseMetaData;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class OdbcDataSourceLinkDemon {
public static void main(String[] args) {
String url = "jdbc:odbc:zhxyk";
Statement sm = null;
String command = null;
ResultSet rs = null;
String tableName = null;
String cName = null;
String result = null;
BufferedReader input = new BufferedReader(new InputStreamReader(
System.in));
try {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // 加载驱动
} catch (ClassNotFoundException e) {
System.out.println("Can not load Jdbc-Odbc Bridge Driver");
System.err.print("ClassNotFoundException:");
System.err.println(e.getMessage());
}
Connection con = DriverManager.getConnection(url, "root",
"ljf895359"); // 使用SQL-SERVER2000认证
DatabaseMetaData dmd = con.getMetaData(); // DMD为连接的相应情况
System.out.println("连接的数据库:" + dmd.getURL());
System.out.println("驱动程序:" + dmd.getDriverName());
sm = con.createStatement();
System.out.println("输入表名");
tableName = input.readLine();
while (true) {
System.out.println("输入列名(为空时程序结束):");
cName = input.readLine();
if (cName.equalsIgnoreCase(""))
break;
command = "select " + cName + " from " + tableName;
rs = sm.executeQuery(command); // 执行查询
if (!rs.next())
System.out.println("表名或列名输入有误");
else {
System.out.println("查询结果为:");
do {
result = rs.getString(cName);
// 数据库语言设置为中文,不用转换编码
// result=new
// String(result.getBytes("ISO-8859-1"),"GB2312");
System.out.println(result);
} while (rs.next());
}
}
} catch (SQLException ex) {
System.out.println("SQLException:");
while (ex != null) {
System.out.println("Message:" + ex.getMessage());
ex = ex.getNextException();
}
} catch (Exception e) {
System.out.println("IOException");
}
}
}