JDBC是Java用于访问各种数据库DBMS的标准方法,由JDBC驱动程序和JDBC API两部分组成。
一、JDBC驱动程序
Java程序对特定数据库的访问操作,要被与其对应的JDBC驱动程序翻译成该数据库的本地操作才能实现,所以JDBC驱动程序担当了一个翻译器的角色。不同的数据库拥有不同的JDBC驱动程序,JDBC提供一个java.sql.Driver接口,各个数据库厂商根据自己数据库产品的特点来实现这个接口(即不同数据库产品的JDBC驱动由其本身提供),Java程序仅通过标准接口来访问各种数据库,从而实现代码的数据库平台无关性。在Java程序访问数据之前,需要通过Class.forName("")的方式来装载JDBC驱动程序(例如Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"),之所以用Class.forName而没有用ClassLoader.load(),就是因为需要JVM完成Driver的初始化工作,而不仅仅是装载),然后通过一个统一的工厂类Java.sql.DriverManager来取得数据库连接,并执行各种操作。
JDBC驱动程序根据其实现方式分为4种类型,我从网上找了篇说明,如下:
1、JDBC-ODBC bridge plus ODBC driver: JDBC-ODBC桥驱动程序,将JDBC调用转换为ODBC的调用。( This combination provides JDBC access via ODBC drivers. ODBC binary code--and in many cases, database client code-- must be loaded on each client machine that uses a JDBC-ODBC Bridge. Sun provides a JDBC-ODBC Bridge driver, which is appropriate for experimental use and for situations in which no other driver is available.)注意,必须将ODBC二进制代码(许多情况下还包括数据库客户机代码)加载到使用该驱动程序的每个客户机上。这种类型的驱动程序最适合于企业网(这种网络上客户机的安装不是主要问题),或者是用Java编写的三层结构的应用程序服务器代码。
2、Native-API partly-Java driver: 将JDBC调用转换为对数据库客户端API的调用。(A native-API partly Java technology-enabled driver: This type of driver converts JDBC calls into calls on the client API for Oracle, Sybase, Informix, DB2, or other DBMS. Note that, like the bridge driver, this style of driver requires that some binary code be loaded on each client machine.)这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。注意,象桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。
3、 Pure Java Driver for Database Middleware: 先将JDBC调用转换为DBMS-independent网络协议,然后由服务器端的中间件转换为具体数据库服务器可以接收的网络协议。(net- protocol fully Java technology-enabled driver #This style of driver translates JDBC calls into the middleware vendor's protocol, which is then translated to a DBMS protocol by a middleware server. The middleware provides connectivity to many different databases.)这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。所用的具体协议取决于提供者。通常,这是最为灵活的 JDBC驱动程序。有可能所有这种解决方案的提供者都提供适合于Intranet用的产品。为了使这些产品也支持Internet访问,它们必须处理 Web所提出的安全性、通过防火墙的访问等方面的额外要求。几家提供者正将JDBC驱动程序加到他们现有的数据库中间件产品中。
4、 Direct-to-Database Pure Java Driver: 将JDBC调用直接转换为具体数据库服务器可以接收的网络协议。(native-protocol fully Java technology-enabled driver #This style of driver converts JDBC calls into the network protocol used directly by DBMSs, allowing a direct call from the client machine to the DBMS server and providing a practical solution for intranet access.)这将允许从客户机机器上直接调用DBMS服务器,是Intranet访问的一个很实用的解决方法。由于许多这样的协议都是专用的,因此数据库提供者自己将是主要来源,有几家提供者已在着手做这件事了。
第3、4类驱动程序将成为从JDBC访问数据库的首选方法。第1、2类驱动程序在直接的纯Java驱动程序还没有上市前将会作为过渡方案来使用。对第1、 2类驱动程序可能会有一些变种,这些变种要求有连接器,但通常这些是更加不可取的解决方案。第3、4类驱动程序提供了Java的所有优点,包括自动安装(例如,通过使用JDBC驱动程序的applet 来下载该驱动程序)。
从这篇文章,我们可以看出,第1类JDBC-ODBC桥的方式主要是Sun公司为了Java程序方便访问已有ODBC数据源而提供的,由于要经过JDBC、ODBC两次翻译才能访问到DBMS,因此性能和效率不高。第2类,需要在本地安装数据库的客户端程序,由Java程序通过JDBC驱动访问数据库客户端API来执行数据库操作,说白了就是模拟你用数据库客户端程序远程操作数据库时的操作,可见效率也不高。第3类和第4类应该是目前常用的方式,即通过协议直接访问数据库服务器DBMS,效率也最高,而这两种方式的安全性有所差别。
二、JDBC API
JDBC API由核心Java API和扩展Java API两部分组成。核心API位于java.sql包中,包括建立DBMS连接和访问DBMS数据所需的基本Java数据对象;扩展API位于javax.sql包中,是J2EE的一部分,包括一些JDBC高级特性(如数据库连接池管理),以及与JNDI进行交互的Java数据对象。Java程序使用JDBC API来访问JDBC驱动程序,JDBC驱动程序再把这些访问消息翻译成能被DBMS理解和处理的底层消息,并完成交互。
三、JDBC URL
Java程序访问数据库之前,需要先装载JDBC驱动程序(用Class.forName()的方式),然后,为了与指定的数据库/数据源建立连接,还需要用JDBC URL来告知数据库或数据源的位置。
JDBC URL 的格式如下:jdbc:<subprotocol>:<subname>
可见JDBC URL由三个部分组成:1、协议,由jdbc表示,它是唯一的,JDBC只有这一种协议;2、子协议(subprotocol),主要用于识别数据库驱动程序,也就是说,对于不同的数据库,这里要填写的驱动程序子协议不同;3、子名(subname),更进一步的参数,不同的数据库,这里要填的内容也不同,由各个数据库自己确定。
例如,对于Oracle数据库的访问,如下:
Class.forName("Oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:Oracle:thin:@主机:端口号:数据库名", "用户名", "密码");
四、其他
JDBC其他方面还包括事务处理和连接池等内容。
比如事务处理可以通过setAutoCommit()来设定自动提交事务,也可以通过Statement的addBatch()、executeBatch()的方式来批量处理操作并执行事务,还可以通过setSavepoint()、releaseSavepoint()的方式来增加临时保存点,这样事务回滚时可以通过rollback(savepoint)的方式来回滚到指定的保存点。
连接池方面,JDBC2.0后引入了数据源的概念,在JDBC扩展包中定义了javax.sql.DataSource接口,它是一个用于产生管理数据库连接的工厂。通常,J2EE应用服务器都提供了连接池的配置方法,配置后的数据源被绑定到JNDI名称空间,Java程序可以通过JNDI来访问。
以上就是我看书后,对JDBC的一些总结,现在有很多ORM的产品,如Hibernate,都对JDBC进行了封装,并提供了更灵活、更便捷的访问数据库的方式,不过了解一下JDBC本来的样子总还是有好处的。
一、JDBC驱动程序
Java程序对特定数据库的访问操作,要被与其对应的JDBC驱动程序翻译成该数据库的本地操作才能实现,所以JDBC驱动程序担当了一个翻译器的角色。不同的数据库拥有不同的JDBC驱动程序,JDBC提供一个java.sql.Driver接口,各个数据库厂商根据自己数据库产品的特点来实现这个接口(即不同数据库产品的JDBC驱动由其本身提供),Java程序仅通过标准接口来访问各种数据库,从而实现代码的数据库平台无关性。在Java程序访问数据之前,需要通过Class.forName("")的方式来装载JDBC驱动程序(例如Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"),之所以用Class.forName而没有用ClassLoader.load(),就是因为需要JVM完成Driver的初始化工作,而不仅仅是装载),然后通过一个统一的工厂类Java.sql.DriverManager来取得数据库连接,并执行各种操作。
JDBC驱动程序根据其实现方式分为4种类型,我从网上找了篇说明,如下:
1、JDBC-ODBC bridge plus ODBC driver: JDBC-ODBC桥驱动程序,将JDBC调用转换为ODBC的调用。( This combination provides JDBC access via ODBC drivers. ODBC binary code--and in many cases, database client code-- must be loaded on each client machine that uses a JDBC-ODBC Bridge. Sun provides a JDBC-ODBC Bridge driver, which is appropriate for experimental use and for situations in which no other driver is available.)注意,必须将ODBC二进制代码(许多情况下还包括数据库客户机代码)加载到使用该驱动程序的每个客户机上。这种类型的驱动程序最适合于企业网(这种网络上客户机的安装不是主要问题),或者是用Java编写的三层结构的应用程序服务器代码。
2、Native-API partly-Java driver: 将JDBC调用转换为对数据库客户端API的调用。(A native-API partly Java technology-enabled driver: This type of driver converts JDBC calls into calls on the client API for Oracle, Sybase, Informix, DB2, or other DBMS. Note that, like the bridge driver, this style of driver requires that some binary code be loaded on each client machine.)这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。注意,象桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。
3、 Pure Java Driver for Database Middleware: 先将JDBC调用转换为DBMS-independent网络协议,然后由服务器端的中间件转换为具体数据库服务器可以接收的网络协议。(net- protocol fully Java technology-enabled driver #This style of driver translates JDBC calls into the middleware vendor's protocol, which is then translated to a DBMS protocol by a middleware server. The middleware provides connectivity to many different databases.)这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。所用的具体协议取决于提供者。通常,这是最为灵活的 JDBC驱动程序。有可能所有这种解决方案的提供者都提供适合于Intranet用的产品。为了使这些产品也支持Internet访问,它们必须处理 Web所提出的安全性、通过防火墙的访问等方面的额外要求。几家提供者正将JDBC驱动程序加到他们现有的数据库中间件产品中。
4、 Direct-to-Database Pure Java Driver: 将JDBC调用直接转换为具体数据库服务器可以接收的网络协议。(native-protocol fully Java technology-enabled driver #This style of driver converts JDBC calls into the network protocol used directly by DBMSs, allowing a direct call from the client machine to the DBMS server and providing a practical solution for intranet access.)这将允许从客户机机器上直接调用DBMS服务器,是Intranet访问的一个很实用的解决方法。由于许多这样的协议都是专用的,因此数据库提供者自己将是主要来源,有几家提供者已在着手做这件事了。
第3、4类驱动程序将成为从JDBC访问数据库的首选方法。第1、2类驱动程序在直接的纯Java驱动程序还没有上市前将会作为过渡方案来使用。对第1、 2类驱动程序可能会有一些变种,这些变种要求有连接器,但通常这些是更加不可取的解决方案。第3、4类驱动程序提供了Java的所有优点,包括自动安装(例如,通过使用JDBC驱动程序的applet 来下载该驱动程序)。
从这篇文章,我们可以看出,第1类JDBC-ODBC桥的方式主要是Sun公司为了Java程序方便访问已有ODBC数据源而提供的,由于要经过JDBC、ODBC两次翻译才能访问到DBMS,因此性能和效率不高。第2类,需要在本地安装数据库的客户端程序,由Java程序通过JDBC驱动访问数据库客户端API来执行数据库操作,说白了就是模拟你用数据库客户端程序远程操作数据库时的操作,可见效率也不高。第3类和第4类应该是目前常用的方式,即通过协议直接访问数据库服务器DBMS,效率也最高,而这两种方式的安全性有所差别。
二、JDBC API
JDBC API由核心Java API和扩展Java API两部分组成。核心API位于java.sql包中,包括建立DBMS连接和访问DBMS数据所需的基本Java数据对象;扩展API位于javax.sql包中,是J2EE的一部分,包括一些JDBC高级特性(如数据库连接池管理),以及与JNDI进行交互的Java数据对象。Java程序使用JDBC API来访问JDBC驱动程序,JDBC驱动程序再把这些访问消息翻译成能被DBMS理解和处理的底层消息,并完成交互。
三、JDBC URL
Java程序访问数据库之前,需要先装载JDBC驱动程序(用Class.forName()的方式),然后,为了与指定的数据库/数据源建立连接,还需要用JDBC URL来告知数据库或数据源的位置。
JDBC URL 的格式如下:jdbc:<subprotocol>:<subname>
可见JDBC URL由三个部分组成:1、协议,由jdbc表示,它是唯一的,JDBC只有这一种协议;2、子协议(subprotocol),主要用于识别数据库驱动程序,也就是说,对于不同的数据库,这里要填写的驱动程序子协议不同;3、子名(subname),更进一步的参数,不同的数据库,这里要填的内容也不同,由各个数据库自己确定。
例如,对于Oracle数据库的访问,如下:
Class.forName("Oracle.jdbc.driver.OracleDriver");
Connection conn = DriverManager.getConnection("jdbc:Oracle:thin:@主机:端口号:数据库名", "用户名", "密码");
四、其他
JDBC其他方面还包括事务处理和连接池等内容。
比如事务处理可以通过setAutoCommit()来设定自动提交事务,也可以通过Statement的addBatch()、executeBatch()的方式来批量处理操作并执行事务,还可以通过setSavepoint()、releaseSavepoint()的方式来增加临时保存点,这样事务回滚时可以通过rollback(savepoint)的方式来回滚到指定的保存点。
连接池方面,JDBC2.0后引入了数据源的概念,在JDBC扩展包中定义了javax.sql.DataSource接口,它是一个用于产生管理数据库连接的工厂。通常,J2EE应用服务器都提供了连接池的配置方法,配置后的数据源被绑定到JNDI名称空间,Java程序可以通过JNDI来访问。
以上就是我看书后,对JDBC的一些总结,现在有很多ORM的产品,如Hibernate,都对JDBC进行了封装,并提供了更灵活、更便捷的访问数据库的方式,不过了解一下JDBC本来的样子总还是有好处的。