有了JDBC从而可以使Java程序员用Java语言来编写完整的数据库方面的应用程序。另外也可以操作保存在多种不同的数据库管理系统中的数据,而与数据库管理系统中数据存储格式无关。同时Java语言的与平台的无关性,不必在不同的系统平台下编写不同的数据库应用程序。
9.1.2 JDBC
设计的目的 (1)ODBC:微软的ODBC是用C编写的,而且只适用于Windows平台,无法实现跨平台地操作数据库。 (2)SQL语言:SQL尽管包含有数据定义、数据操作、数据管理等功能,但它并不是一个完整的编程语言,而且不支持流控制,需要与其它编程语言相配合使用。 (3)JDBC的设计:由于Java语言具有健壮性、安全、易使用并自动下载到网络等方面的优点,因此如果采用Java语言来连接数据库,将能克服ODBC局限于某一系统平台的缺陷;将SQL语言与Java语言相互结合起来,可以实现连接不同数据库系统,即使用JDBC可以很容易地把SQL语句传送到任何关系型数据库中。 (4)JDBC设计的目的:它是一种规范,设计出它的最主要的目的是让各个数据库开发商为Java程序员提供标准的数据库访问类和接口,使得独立于DBMS的Java应用程序的开发成为可能(数据库改变,驱动程序跟着改变,但应用程序不变)。9.1.3 JDBC
的主要功能:(1)创建与数据库的连接;(2)发送SQL语句到任何关系型数据库中;(3)处理数据并查询结果。 编程实例:try
{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //
(1)创建与数据库的连接Connection con=DriverManager.getConnection("jdbc:odbc:DatabaseDSN","Login","Password");
Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("select * from DBTableName");//
(2)发送SQL语句到数据库中while(rs.next())
{ String name=rs.getString("Name") ; //
(3)处理数据并查询结果。int age=rs.getInt("age");
float wage=rs.getFloat("wage");
}
rs.close(); //
(4)关闭stmt.close();
con.close();
}
catch(SQLException e)
{ System.out.println("SQLState:"+ e.getSQLState());
System.out.println("Message:" + e.getMessage());
System.out.println("Vendor:" + e.getErrorCode());
}
9.1.4 JDBC
与ODBC的对比,从而体会JDBC的特点 (1)ODBC是用C语言编写的,不是面向对象的;而JDBC是用Java编写的,是面向对象的。 (2)ODBC难以学习,因为它把简单的功能与高级功能组合在一起,即便是简单的查询也会带有复杂的任选项;而JDBC的设计使得简单的事情用简单的做法来完成。 (3)ODBC是局限于某一系统平台的,而JDBC提供Java与平台无关的解决方案。 (4)但也可以通过Java来操作ODBC,这可以采用JDBc-ODBC桥接方式来实现(因为Java不能直接使用ODBC,即在Java中使用本地C的代码将带来安全缺陷)。9.1.5 JDBC
驱动程序的类型: 目前比较常见的JDBC驱动程序可分为以下四个种类: (1)JDBC-ODBC桥加ODBC驱动程序JavaSoft
桥产品利用ODBC驱动程序提供JDBC访问。注意,必须将ODBC二进制代码(许多情况下还包括数据库客户机代码)加载到使用该驱动程序的每个客户机上。因此,这种类型的驱动程序最适合于企业网(这种网络上客户机的安装不是主要问题),或者是用Java编写的三层结构的应用程序服务器代码。JDBC-ODBC
桥接方式利用微软的开放数据库互连接口(ODBC API)同数据库服务器通讯,客户端计算机首先应该安装并配置ODBC driver 和JDBC-ODBC bridge两种驱动程序。 (2)本地API 这种类型的驱动程序把客户机API上的JDBC调用转换为Oracle、Sybase、Informix、DB2或其它DBMS的调用。注意,象桥驱动程序一样,这种类型的驱动程序要求将某些二进制代码加载到每台客户机上。 这种驱动方式将数据库厂商的特殊协议转换成Java代码及二进制类码,使Java 数据库客户方与数据库服务器方通信。例如:Oracle用SQLNet协议,DB2用IBM 的数据库协议。数据库厂商的特殊协议也应该被安装在客户机上。 (3)JDBC网络纯Java驱动程序 这种驱动程序将JDBC转换为与DBMS无关的网络协议,之后这种协议又被某个服务器转换为一种DBMS协议。这种网络服务器中间件能够将它的纯Java客户机连接到多种不同的数据库上。所用的具体协议取决于提供者。通常,这是最为灵活的JDBC驱动程序。有可能所有这种解决方案的提供者都提供适合于Intranet用的产品。为了使这些产品也支持Internet访问,它们必须处理Web所提出的安全性、通过防火墙的访问等方面的额外要求。几家提供者正将JDBC驱动程序加到他们现有的数据库中间件产品中。 这种方式是纯Java driver。数据库客户以标准网络协议(如HTTP、SHTTP)同数据库访问服务器通信,数据库访问服务器然后翻译标准网络协议成为数据库厂商的专有特殊数据库访问协议(也可能用到ODBC driver)与数据库通信。对Internet 和Intranet 用户而言这是一个理想的解决方案。Java driver 被自动的,以透明的方式随Applets自Web服务器而下载并安装在用户的计算机上。 (4)本地协议纯Java驱动程序 这种类型的驱动程序将JDBC调用直接转换为DBMS所使用的网络协议。这将允许从客户机机器上直接调用DBMS服务器,是Intranet访问的一个很实用的解决方法。 这种方式也是纯Java driver。数据库厂商提供了特殊的JDBC协议使Java数据库客户与数据库服务器通信。然而,将把代理协议同数据库服务器通信改用数据库厂商的特殊JDBC driver。这对Intranet 应用是高效的,可是数据库厂商的协议可能不被防火墙支持,缺乏防火墙支持在Internet 应用中会存在潜在的安全隐患。9.2 JDBC
的工作原理JDBC
的设计基于X/Open SQL CLI(调用级接口)这一模型。它通过定义出一组 API对象和方法以用于同数据库进行交互。 在Java程序中要操作数据库,一般应该通过如下几步(利用JDBC访问数据库的编程步骤): (1)加载连接数据库的驱动程序 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); (2)创建与数据源的连接String url="jdbc:odbc:DatabaseDSN";
Connection con=DriverManager.getConnection(url,"Login","Password");
(3)查询数据库:创建Statement对象并执行SQL语句以返回一个ResultSet对象。Statement stmt=con.createStatement();
ResultSet rs=stmt.executeQuery("select * from DBTableName");
(4)获得当前记录集中的某一记录的各个字段的值String name=rs.getString("Name");
int age=rs.getInt("age");
float wage=rs.getFloat("wage");
(5)关闭查询语句及与数据库的连接(注意关闭的顺序先rs再stmt最后为con)rs.close();
stmt.close();
con.close();
9.3 JDBC
的结构JDBC
主要包含两部分:面向Java程序员的JDBC API及面向数据库厂商的JDBC Drive API。 (1)面向Java程序员的JDBC API:Java程序员通过调用此API从而实现连接数据库、执行SQL语句并返回结果集等编程数据库的能力,它主要是由一系列的接口定义所构成。java.sql.DriveManager
:该接口主要定义了用来处理装载驱动程序并且为创建新的数据库连接提供支持。java.sql.Connection
:该接口主要定义了实现对某一种指定数据库连接的功能。java.sql.Statement
:该接口主要定义了在一个给定的连接中作为SQL语句执行声明的容器以实现对数据库的操作。它主要包含有如下的两种子类型。java.sql.PreparedStatement
:该接口主要定义了用于执行带或不带 IN 参数的预编译 SQL 语句。java.sql.CallableStatement
:该接口主要定义了用于执行数据库的存储过程的雕用。java.sql.ResultSet
:该接口主要定义了用于执行对数据库的操作所返回的结果集。 (2)面向数据库厂商的JDBC Drive API:数据库厂商必须提供相应的驱动程序并实现JDBC API所要求的基本接口(每个数据库系统厂商必须提供对DriveManager、Connection、Statement、ResultSet等接口的具体实现),从而最终保证Java程序员通过JDBC实现对不同的数据库操作。9.4
数据库应用的模型 (1)两层结构(C/S):在此模型下,客户端的程序直接与数据库服务器相连接并发送SQL语句(但这时就需要在客户端安装被访问的数据库的JDBC驱动程序),DBMS服务器向客户返回相应的结果,客户程序负责对数据的格式化。client
端 ODBC/JDBC Server端(DBMS) 或数据库专用协议 主要的缺点:受数据库厂商的限制,用户更换数据库时需要改写客户程序;受数据库版本的限制,数据库厂商一旦升级数据库,使用该数据库的客户程序需要重新编译和发布;对数据库的操作与处理都是在客户程序中实现,使客户程序在编程与设计时较为复杂。 (2)三(或多)层结构(B/S):在此模型下,主要在客户端的程序与数据库服务器之间增加了一个中间服务器(可以采用C++或Java语言来编程实现),隔离客户端的程序与数据库服务器。客户端的程序(可以简单为通用的浏览器)与中间服务器进行通信,然后由中间服务器处理客户端程序的请求并管理与数据库服务器的连接。 客户端程序 HTTP RMI CORBA 中间服务器 JDBC 数据库服务器9.5
通过JDBC 实现对数据库的访问 (1)引用必要的包import java.sql.*; //
它包含有操作数据库的各个类与接口 (2)加载连接数据库的驱动程序类为实现与特定的数据库相连接,JDBC必须加载相应的驱动程序类。这通常可以采用Class.forName()方法显式地加载一个驱动程序类,由驱动程序负责向DriverManager登记注册并在与数据库相连接时,DriverManager将使用此驱动程序。
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
注意:这条语句直接加载了sun公司提供的JDBC-ODBC Bridge驱动程序类。 (3)创建与数据源的连接String url="jdbc:odbc:DatabaseDSN";
Connection con=DriverManager.getConnection(url,"Login","Password");
注意:采用DriverManager类中的getConnection()方法实现与url所指定的数据源建立连接并返回一个Connection类的对象,以后对这个数据源的操作都是基于该Connection类对象;但对于Access等小型数据库,可以不用给出用户名与密码。String url="jdbc:odbc:DatabaseDSN";
Connection con=DriverManager.getConnection(url);
System.out.println(con.getCatalog()); //
取得数据库的完整路径及文件名JDBC
借用了url语法来确定全球的数据库(数据库URL类似于通用的URL),对由url所指定的数据源的表示格式为jdbc::[ database locator]
jdbc---
指出要使用JDBCsubprotocal---
定义驱动程序类型database locator---
提供网络数据库的位置和端口号(包括主机名、端口和数据库系统名等) jdbc:odbc://host.domain.com:port/databasefile 主协议jdbc 驱动程序类型为odbc,它指明JDBC管理器如何访问数据库,该例指名为采用JDBC-ODBC桥接方式;其它为数据库的位置表示。 例如:装载mySQL JDBC驱动程序Class.forName("org.gjt.mm.mysql.Driver ");
String url
="jdbc:mysql://localhost/softforum?user=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1"
Connection conn= DriverManager.getConnection(url); 例如:装载Oracle JDBC OCI驱动程序(用thin模式)
Class.forName("oracle.jdbc.driver.OracleDriver ");
String url="jdbc:oracle:thin:@localhost:1521:orcl";
String user="scott";
String password="tiger";
Connection conn= DriverManager.getConnection(url,user,password); 注意:也可以通过con.setCatalog("MyDatabase")来加载数据库。 例如:装载DB2驱动程序
Class.forName("com.ibm.db2.jdbc.app.DB2Driver ")
String url="jdbc:db2://localhost:5000/sample";
String user="admin";
String password="";
Connection conn= DriverManager.getConnection(url,user,password); 例如:装载MicroSoft SQLServer驱动程序
Class.forName("com.microsoft.jdbc.sqlserver.SQLServerDriver ");
String url="jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=pubs";
String user="sa";
String password="";
Connection conn= DriverManager.getConnection(url,user,password); (4)查询数据库的一些结构信