JDBC与ODBC

时间:2023-12-16 10:18:14

 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的基本特性,也独立于特定数据库. 而且都不是直接与数据库交互,而是通过驱动程序管理器。

他们二者之间的区别:

ODBC几乎能在所有平台上连接几乎所有的数据库。为什么 Java 不使用 ODBC?

 答案是:Java 可以使用 ODBC,但最好是以JDBC-ODBC桥的形式使用(Java连接总体分为Java直连和JDBC-ODBC桥两种形式)。
 那为什么还需要 JDBC?
 因为ODBC 不适合直接在 Java 中使用,因为它使用 C 语言接口。从Java 调用本地 C代码在安全性、实现、坚固性和程序的自动移植性方面都有许多缺点。从 ODBC C API 到 Java API 的字面翻译是不可取的。例如,Java 没有指针,而 ODBC 却对指针用得很广泛(包括很容易出错的指针"void *")。
 另外,ODBC 比较复杂,而JDBC 尽量保证简单功能的简便性,同时在必要时允许使用高级功能。如果使用ODBC,就必须手动地将 ODBC 驱动程序管理器和驱动程序安装在每台客户机上。如果完全用 Java 编写 JDBC 驱动程序则 JDBC代码在所有 Java 平台上(从网络计算机到大型机)都可以自 动安装、移植并保证安全性。
 总之,JDBC 在很大程度上是借鉴了ODBC的,从他的基础上发展而来。JDBC 保留了 ODBC 的基本设计特征,因此,熟悉 ODBC 的程序员将发现 JDBC 很容易使用。它们之间最大的区别在于:JDBC 以 Java 风格与优点为基础并进行优化,因此更加易于使用。

JDBC连接数据库

  jdbc:使用Java代码发送sql语句的技术就是jdbc技术。即jdbc是一个接口,用于不同的数据库(oracle、mysql、sqlserver。。)的操作。使用jdbc发送sql语句的前提: 
登录数据库服务器(连接数据库服务器)

(数据库的)IP地址 
      端口 
(数据库)用户名 
密码

JDBC与ODBC
JDBC的URL=协议名+子协议名+数据源名。 
a 协议名总是“jdbc”。 
b 子协议名由JDBC驱动程序的编写者决定。 
c 数据源名也可能包含用户与口令等信息;这些信息也可单独提供。 
几种常见的数据库连接

——————————-oracle—————— 
驱动:oracle.jdbc.driver.OracleDriver 
URL:jdbc:oracle:thin:@machine_name:port:dbname 
注:machine_name:数据库所在的机器的名称; 
port:端口号,默认是1521

——————————-mysql——————- 
驱动:com.mysql.jdbc.Driver 
URL:jdbc:mysql://machine_name:port/dbname 
注:machine_name:数据库所在的机器的名称(本机一般默认为localhost); 
port:端口号,默认3306

—————————SQL Server—————— 
驱动:com.microsoft.jdbc.sqlserver.SQLServerDriver 
URL:jdbc:microsoft:sqlserver://<:port>;DatabaseName= 
注:machine_name:数据库所在的机器的名称; 
port:端口号,默认是1433

————————–DB2————————– 
驱动:com.ibm.db2.jdbc.app.DB2Driver 
URL:jdbc:db2://<:port>/dbname 
注:machine_name:数据库所在的机器的名称;(port默认5000) 
这里以Mysql为例。 
所需jar包:mysql-connector-java-5.1.7-bin.jar 
代码如下:

import java.sql.Connection;
import java.sql.Driver;
import java.sql.DriverManager;
import java.util.Properties; import org.junit.Test;
public class Demo1{
//首先连接到数据库的URL
private String url = "jbdc:mysql://localhost:3306/demo";/*jdbc协议:数据库子协议:主机:端口/连接的数据库*/
private String user = "root";//数据库用户名
private String password = "root";//数据库密码
/*
第一种方法
*/
@Test
public void test1() throws Exception{
//1.创建驱动程序类对象
Driver driver = new com.mysql.jdbc.Driver();//需要导入上面提到的jar包
//设置用户名和密码
Properties pro = new Properties();
pro.setProperty("user",user);
pro.setProperty("password",password);
//2.连接数据库
Connection conn = driver.connect(url,pro);
//测试是否连接成功
System.out.println(conn);
}
/*
第二种方法(使用驱动管理器类连接数据库)
*/
@Test
public void test2() throws Exception{
//创建驱动程序类对象
Dirver dirver = new com.mysql.jdbc.Dirver(); /*Mysql*/
//Driver driver2 = new com.oracle.jdbc.Driver();/*oracle*/
//1.注册驱动程序(可以注册多个)
DirverManager.registerDirver(dirver);
//2.建立连接到数据库
Connection conn = DriverManager.getConnection(url, user, password);
//测试是否连接成功
System.out.println(conn);
} }

运行后,成功结果应该会显示类似信息: 
JDBC与ODBC


分析:在test2方法中,创建驱动程序类对象new com.mysql.jdbc.Dirver(); 后在进行注册驱动程序DirverManager.registerDirver(dirver); 实际上已经注册了两次。因为在Driver.class文件中有如下一段静态代码块:

// ---------------------------------------------

    //
// Register ourselves with the DriverManager
//
static {
try {
java.sql.DriverManager.registerDriver(new Driver());
} catch (SQLException E) {
throw new RuntimeException("Can't register driver!");
}
}

即在进行创建驱动程序类对象Driver的时候就执行了registerDriver(new Driver());,所以第二种方法中省略DirverManager.registerDirver(dirver);语句也正确。


基于以上分析,可以采用 通过得到字节码对象的方式加载静态代码块,从而注册驱动程序,即把创建驱动类对象语句换成Class.forName(“com.mysql.jdbc.Driver”);括号内双引号语句为Dirver.Class文件所在的包名(上面所提到的jar包里面)即可。完整代码如下:

@Test
public void test3() throws Exception{
//通过得到字节码对象的方式加载静态代码块,从而注册驱动程序
Class.forName("com.mysql.jdbc.Driver");
//2.连接到具体的数据库
Connection conn = DriverManager.getConnection(url, user, password);
System.out.println(conn);
}

  据此,这部分的连接已经成功了。对代码进行简单的分析有助于理解记忆而不是死记硬背达到活学活用。本例以Mysql数据库进行,其他数据库类似。

两者之间的联系

JDBC和ODBC都是用来连接数据库的启动程序。JDBC和ODBC因为具有数据库独立性甚至平台无关性,因而对Internet上异构数据库的訪问提供了非常好的支持。

两者之间的差别

1.JDBC比ODBC更easy理解

从事编程工作的朋友都知道Java比C语言更好学,主要是由于Java语言是面向对象的更接近人的思维认识。更easy被人接受。而C语言就较为抽象,跟人的认识思维相差较大,其开发出来的产品也具有类似特点。在ODBC中一个的简单的查询。也需求分为好几块内容;而在ODBC驱动程序内部再去整合,做一些复杂的操作。这不仅减少了数据库启动程序的性能,并且也给程序开发人员开发实际运用程序带来了确定的负面效果。

而JDBC数据库启动程序在设计的时间就包括了大部份基本数据操作功能,为此在编写一些常规的数据库操作语句时,如查询、更新等等,其所需求的源码比 ODBC要少的多。故从这方面来说。JDBC数据库启动程序要比ODBC简易理解。

2.JDBC数据库驱动程序是面向对象的

JDBC全然遵循Java语言的优良特性。

通常情况下,仅仅要有Java功能需设计基础的用户都能在最短时间内了解JDBC驱动程序的架构,较量简易上手,能轻而易举的开发出强悍的数据库实际运用程序。

而ODBC的话。因为其内部功能复杂,源码编写要求高。为此即使是一个的C语言的高手,仍然需求花费不少的时间去了解那个数据库启动程序;在编写源码的时间,还离不开有关的參考书本。

3.JDBC的移植性要比ODBC要好。

通常情况下,安装完ODBC驱动程序之后。还需求经过确定的配置才可以应用。而不同样的配置在不同样数据库server之间不可以通用。也那是说,装一次需求配置一次。可是JDBC数据库驱动程序则不同样。

假如採用JDBC数据库驱动程序的话,则仅仅须要选取适当的 JDBC数据库驱动程序,就不须要额外的配置。在安装过程中,JDBC数据库驱动程序会自己完毕有关的配置。为此JDBC的移植性要比ODBC要好。

从ODBC向JDBC过度

或许数据库编程曾经採用的是ODBC驱动程序。而假如数据库编程眼下须要採用JDBC驱动程序,那么是否能出现顺利过渡呢?

答案是肯定的。

在JDBC驱动程序中有一类叫作JDBC-ODBC桥接启动程序。这样的类别的JDBC数据库驱动程序其底层是经过ODBC驱动程序来连接数据库的。

假如原先的实际运用程序是基于ODBC数据库驱动程序的,或者数据库没有帮助相应的JDBC驱动程序,则数据库编程能利用JDBC-ODBC桥接驱动程序来实现。也那是说。桥接驱动程序能利用现有的ODBC驱动程序来存取联系型数据库。为此者不仅能保留先前的开发架构(经过ODBC来存取数据),还能马上应用Java作为新的开发环境,从而出现ODBC数据库驱动程序到JDBC的顺利转型。

只是在採用这样的桥接驱动程序的时间,需求留意几个难点。一是那个桥接驱动程序仍然须要用到ODBC数据库驱动程序。

因为桥接驱动程序直接联系的对象是ODBC驱动程序。然后再经过ODBC驱动程序去訪问数据库。为此在client必需先安装并配置好ODBC驱动程序。假如採用的是三层式的开发框架,也需求安装ODBC驱动程序。其次,在这样的模式下。实际运用程序先调用JDBC,然后再经过JDBC调用ODBC。最后再跟数据库通信。

显然当中间多了几个环节。因为当中间环节较量多,但数据訪问出现难点的时候,就不太好查难点。这就好像一道水管,假如中间的接口多了的话,则除了漏水的几率就较量高。假如真的除了漏水的话。则查询漏水点的时间也会较量困难。为此笔者以为。採用桥接类别的JDBC驱动程序仅仅是权宜之计。在适当的时间,数据库开发还是须要调整原先的开发架构,所有都转到JDBC驱动程序上来。

桥接程序仅仅是为数据库开发争取确定的时间。尽管那个转型过程中的阵痛是较痛的,但确是不可避免的。长痛不如短痛,笔者意见数据库开发还是及早停止过渡为好。并在预计的情况下,把曾经的开发架构也停止调整,以採用真正意义上的JDBC驱动程序。