jdbc theory

The JDBC API is the industry standard for database-independent connectivity between the java program language and a
wide range of databases.
The JDBC API provides a call-level API for sql-based databases access.

 

编辑 | 删除 java如何访问数据库

别问我是谁 发布于: 2008-01-09 14:52

随着Web的迅猛发展,数据库连接产品与Internet/Intranet的结合已成为一种典型的计
算模式,Java的兴起又为这一领域的发展提供了更为有效的支持。Java发明者Sun微系统公司
的子公司Javasoft适时推出了Java数据库连接规范——JDBC(Java Database Connectivity
),于是各数据库厂商纷纷遵循这一规范研制和开发各自数据库产品对Java的支持。在这一方
面IBM公司始终走在最前面,其DB2系列产品是最先提供Java支持的产品之一。
DB2对Java语言的支持包括以下两个方面:
·开发用于访问DB2数据库的Java应用程序(Application)和Java小应用程序(Applet)。
·创建用户定义函数(UDF:User-Defined Function)和存储过程(Stored Procedure)。
本文简要介绍JDBC的原理、实现及应用,并以DB2为例说明如何通过JDBC在Java程序中对
数据库进行访问。

JDBC的工作原理
利用Java编程语言访问数据库是通过JDBC——Java Database Connectivity,即Java数
据库连接机制实现的。JDBC是一种Java数据库连接API(Application Programming Interfc
e:应用编程接口),它作为Java Enterprise API的一部分由JavaSoft于1996年5月推出。JBC
为Java程序员提供了一种在Java代码中访问关系数据库的标准方法。
JDBC的设计基于X/Open SQL CLI(Call Level Interface)这一模型。JDBC定义了一组P
I对象和方法用于同基本数据库进行交互。一个Java程序要访问数据库,需通过以下几步来完
成:第一,打开一数据库连接;第二,建立语句对象;第三,通过该语句对象将SQL语句传送给数
据库,进行数据库操作;第四,获取结果及有关结果集的信息。

JDBC的实现
JDBC的实现包括两个方面,一个是JDBC API,一个是数据库方的JDBC驱动程序支持。
JDBC API的所有实现都包含在java.sql包中,即该包中包括了JDBC API的所有类和方法
。表1给出了JDBC所有类及其功能的简要说明。
在这些类中最为重要的几部分及其关系见图1。
@@39H10000.GIF;图1 JDBC几个重要的类及其关系@@
可以看出最上层的类为DriverManager。这个类用于处理驱动程序的装入,为新数据库连
接的建立提供支持。一个驱动程序装载时,它要向该类进行注册。当要打开一个连接时,该类
就会根据JDBC URL选择驱动程序(后面将会谈到JDBC URL)。
java.sql.Connection 表示一个到特定数据库的连接。
java.sql.Statement 在一个给定的连接中,为执行一条SQL语句提供一个容器。
java.sql.Statement接口有两个重要的子类型:一个是java.sql.PrepareStatement,用
于执行预编译的SQL语句;一个是java.sql.CallableStatement,用于调用数据存储过程。
java.sql.ResultSet用于控制结果列的存取。
JDBC API驱动程序用于提供与数据源的接口,解释和执行来自应用程序中的SQL语句,并
返回结果。它既可全部用Java编写,作为Applet的一部分在网上下载,又可以是一种本地模块
,与现有数据库建立起桥接关系。例如,由Sun和Intersolv合作开发的JDBC-ODBC Bridge-JB
CODBC.DLL(用于Windows下)就是一种JDBC到ODBC的转换模块,用它可以实现对支持ODBC的数
据库的访问。
编程人员并不需要知道数据库方JDBC驱动程序的细节,而只需关心用于指定所要访问的
数据源的URL。JDBC URL的格式如下:
jdbc::
subprotocol是指一种由一个或多个驱动程序支持的数据库连接机制。例如,DB2数据库
的subprotocol为db2。其JDBC URL格式如下:
jdbc:db2:数据源名
或:
jdbc:db2:主机名:端口号/数据源名
又如,ODBC类型的数据源,其subprotocol为odbc。一般的ODBC数据库JDBC URL格式如下
jdbc:odbc:;User=;PW=
对于Internet/Intranet上的数据库,subname指的是包含网络URL的数据源名,其格式如
下:
//主机名:端口号/数据源名

JDBC应用方案
JDBC有两种常用的应用方式:一种是Java Applet,一种是Java Application。
Applet是作为Web文档的一部分在网络上进行传输的小应用程序,是Java语言目前应用较
为活跃的一面。用于数据库访问的Applet正是使用JDBC来与数据库进行交互的,如图2:
@@39H10001.GIF;图2 JDBC Applet与数据库的交互@@
Java也能用来建立通常的应用程序,即Java Application。这种独立的应用通常可以位
于客户机上,其最常用的方式是应用在企业Intranet中,见图3:
@@39H10002.GIF;表1 JDBC AIP及其功能秒述@@
@@39H10003.GIF;图3 JDBC Application与数据库的交互@@
Java Application与Applet存在着许多方面的差异。例如,Java Application定义数据
库最常用的方式是由用户或应用程序声明一个数据库名,即由系统来寻找指定的机器、DBM、
JDBC驱动程序和数据库。而Java Applet是在程序中直接指定这些内容的。
但不论是Java Applet还是Java Application,访问数据库的步骤基本类似。下文将通过
基于DB2数据库访问的Java Applet和Java Application具体说明JDBC的应用。


编者注:本文共分三个部分:"JDBC简介"、"编写基于DB2的Java Application和Java Ap
let"、"编译和运行基于DB2的Java Application和Java Applet"。

 


如同上期所述,利用DB2的JDBC支持也可以建立两类应用:Java Application(应用程序和
Java Applet(小应用程序)。前者通常位于客户端,通过CAE(Client Application Enablr),
即客户应用使能器与DB2建立联系,从而实现对数据库的访问。后者则不需要任何客户端DB2
部件,而只需要支持Java的浏览器在客户端解释执行,于是对数据库的访问就可以在任何一种
带有浏览器使能的平台上进行。
下面我们来具体说明Java Application和Java Applet的编程。首先假设要访问的数据
源名为mydb,JDBC Applet服务器运行于TCP/IP端口号为2222的端口上,JDBC服务器所在的服
务器为cherry.ncic.ac.cn,操作系统为AIX 4.1。

1.引入适当的Java类
若是Java Application,需引入java.net.URL, jva.sql.*, ibm.sql.*;
若是Java Applet,需引入tempjava.sql.*, ibm.netsql.*。

2.装载适当的JDBC驱动程序
若是Java Application,需装入ibm.sql.DB2Driver;相应的语句为:
Class.forName("ibm.sql.DB2Driver");
若是Java Applet,需装入ibm.netsql.DB2Driver;相应的语句为:
Class.forName("ibm.netsql.DB2Driver");

3.与数据库建立连接
通过URL与数据库建立连接,在URL中需提供数据库位置、子协议名(subprotocol)。对于
DB2,子协议名为db2。
若是Application,其URL为:jdbc:db2:mydb。所建立的连接对象格式如下:
Connection con = DriverManager.getConnection("jdbc:db2:mydb");
若是Applet,其URL为:jdbc:db2://cherry.ncic.ac.cn:2222/mydb。所建立的连接对象
格式如下:
Connection con=DriverManager.getConnection(jdbc:db2://cherry.ncic.ac.cn:222
/mydb,userid, password );
这里需特别指出的是,对于Applet,访问端口号必须大于1024。

4.向数据库传递SQL语言,执行查询,并返回结果
例如,可创建一SQL语句对象stmt:
Statement stmt = con.createStatement
执行查询,并返回结果:
ResultSet rs = stmt.executeQuery("SQL语句");

5.关闭连接
将所建立的连接对象关闭:
con.close();
从上述过程可以看出Java Applet与Java Application的编程基本类似,主要不同点表现
在JDBC URL上。由于Java Application与数据库的通信是交由CAE来完成的,所以在其JDBCU
RL中,不再包含主机名和端口号这一部分,而这些信息对于Applet来说则是必须的。
当然,JDBC驱动程序的实现也不同,例如,对于Java Applet来说,JDBC驱动程序为ibm.nt
sql.DB2Driver,而对于Java Application,其JDBC驱动程序为ibm.sql.DB2Driver。
下面给出一个完整的例子程序,说明在Java Applet中如何通过JDBC访问DB2数据库。至
于Java Application,通过上面的叙述相信读者不难写出。
Java Applet例子程序源代码清单:
// 源文件名:MyDB2Applet.java
// 功能:该样例程序用于说明如何利用JDBC Applet驱动程序编写访问
// DB2数据库的Java Applet
import java.net.URL;
import tempjava.sql.*;
import ibm.netsql.*;
import java.awt.Graphics;
public class DB2Applet extends java.Applet.Applet {
static {
try {
// 向DriverManager注册驱动程序
Class.forName("ibm.netsql.DB2Driver");
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public void init() {
resize(200,100);
}
public void paint(Graphics g) {
try {
// JDBC服务器所在的机器的名字为//cherry.ncic.ac.cn
// JDBC服务器所监听的端口号为2222
// 数据源名为mydb
// 构造URL
String url = "jdbc:db2://cherry.ncic.ac.cn:2222/mydb";
// 要访问的数据库的用户id为myid
String userid = "myid";
// 与上面的id相对应的口令为mypassword
String password = "mypassword";
Connection con = DriverManager.getConnection(url, userid, passwor
);
// 从数据库中提取数据
Statement stmt = con.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * from employee");
g.drawString("查询结果:", 10, 25);
// 显示结果集
// 当不再有记录行时,rs.next()返回false
int y = 50;
int i = 0;
while (rs.next() && (i<2)) {
i++;
String a= rs.getString(1);
String str = rs.getString(2);
String neLine = "empno= " + a + "firstname= " + str;
g.drawString(oneLine, 20, y );
y = y + 15;
}
stmt.close();
// 更新数据库
g.drawString("开始更新数据...",10, 100);
stmt = con.createStatement();
int rowsUpdated = stmt.executeUpdate("UPDATE employee set firstnme =SI
LI‘where empno = 000010’");
// 显示被更新的记录行的行号
String msg = "更新的行 " + rowsUpdated;
if (1 == rowsUpdated) msg = msg +" 单行";
else msg = msg +"多行";
y = y + 40;
g.drawString(msg, 20, y);
stmt.close();
// 关闭连接
con.close();
}
catch( Exception e ) {
e.printStackTrace();
}
}
}

 

 

Java编译环境的建立及源代码的编译
Java应用的源代码必须由Java编译器来编译,以生成中间代码,即字节代码(byte-code,
所以,在使用DB2的JDBC支持开始编程前,必须在开发用的机器上安装和配置Java开发工具DK
。在以下平台上都有相应的Java开发工具JDK:
·JDK 1.0.2 for Sun Solaris,由Sun提供
·JDK 1.0.2 for Win32,由Sun提供
·JDK 1.0.2 for AIX 4.1,由IBM提供
·JDK 1.0.1 for OS/2,由IBM提供
如果是Java Application,那么,必须从DB2 Client Pack中安装DB2 CAE(由DB2产品提供
)。CAE版本必须为2.1.0或以后版本。DB2版本若是V2.1.2(指DB2 Common Server,下同),则
JDBC驱动程序已被内置于其中。
另外,还必须确保CLASSPATH环境变量中包括$DB2PATH\java\db2java.zip这一目录。这
样Java编译器才能找到DB2特别提供的有关JDBC的类。
编写好的Java源程序,可用Java编译器javac进行编译,从而生成字节代码。其语法格式
为:
javac 源程序名
例如,要编译上述例子MyDB2Appl.java,只需键入:
javac MyDB2Appl.java
所生成的字节代码为MyDB2Appl.class。
Java Application的运行
由于Java Application使用DB2的CAE与DB2服务器通信,所以用户不必考虑安全性问题。
有关的授权和验证是交由CAE来处理的。要在客户机上运行一个Java Application,必须在此
机器上安装:

1.Java Application解释器,用于运行Java代码;

2.DB2 CAE,包括DB2 JDBC驱动程序。
当Application启动后,DB2 JDBC驱动程序就会处理来自应用程序中的JDBC API调用,并
通过CAE将请求发送给服务器,然后获取返回结果。
Java Application的运行非常简单,例如,只需在命令行键入:
Java MyDB2Appl
Java Applet的运行
像所有Java Applet一样,要在Web上发布自己的JDBC Applet,还需要写一个HTL页面文件
,然后将该Applet嵌入其中。例如,要调用例子MyDB2Applt,可以在一个HTML文件中写入以下
语句:


要运行该Applet,只需在客户端有一个支持Java的Web浏览器。当HTML页被装载时,Appe
t标签将Java Applet下载至本地,然后下载Java类文件(包括tempjava.sql.*、ibm.netsq.*
类),以及DB2的JDBC驱动程序。当Applet调用JDBC API连接DB2时,JDBC驱动程序就会通过DB
2服务器上的JDBC Applet服务器与DB2数据库建立起独立而专有的通信过程。
由于Applet要在Web上传输,所以还必须保证:

1.DB2(服务器或客户)与Web服务器安装在同一台机器上。Java Applet与JDBC支持是作
为DB2一部分而安装的。

2.必须使用tempjava.sql包代替java.sql包。因为所有的DB2 JDBC Aplet类要引用这个
文件。
展开sqllib\java\db2java.zip文件,以生成tempjava.sql和ibm.netsql包,并将它们移
到Web服务器上适当的目录下。例如,上例中DB2Applt.class所在的目录结构可以是:
./MyDB2Applet.class
./tempjava/sql/
./ibm/netsql/
将tempjava.sql类存放在./tempjava/sql/目录下,将ibm.netsql类存放在./ibm/netsl
/目录下。

3.建立HTML文件,并与类文件放在同一目录下。

4.在Web服务器上启动DB2的JDBC Applet服务器,键入:
db2jstrt portno
其中portno是Applet要用到的端口号。例如,在例子MyDB2Applt.java中,端口号为222,
那么就执行:
db2jstrt 2222
以上步骤完成后,在客户端运行Applet,只需在其机器上启动Web浏览器,装入相应的HTL
文件,即可看到该Applet的运行结果。
对DB2 JDBC驱动程序的补充说明
使用图形对象和大对象
在JDBC规范中,没有明确地提到大对象(LOB)或图形类型。LOB可以认为是LONGVAR类型。
因为LOB类型在SQL中是以最大长度声明的,所以要确保返回的数组或字符串的长度不超过所
声明的最大长度。这种考虑也适用于SQL字符串类型。
若在LOB列中要存放长度大于32767字节(longvar的最大值),则必须把longdatacompat开
关设置为1。可通过以下两种方法中的任何一种来实现:
·在db2cli.ini文件中增加一项。
·调用DB2Connection类中的方法setLongDataCompat。该方法的语法格式如下:
setLongDataCompat(boolean value)
将value指定为"TRUE"时,longdatacompat即被设置为1。
至于GRAPHIC和DBCLOB类型,可将它们看作CHAR类型。只有在DB2最新版本2.1.2中,JDB驱
动程序才能正确地处理和转换这些类型。

安全性问题
安全性总是一个重要的问题,尤其是当数据库处于激活状态时,这一问题更为突出。JDC
遵循了标准的安全性模型。在这个安全性模型下,Applet(远程)只能与装载它的服务器连接
,而不能与本地数据库连接。对于Application来说,没有连接限制。对于纯Java驱动程序,安
全性检查是自动进行的,否则驱动程序必须有安全性检查机制。在Java 1.1和Java Securiy
API中就具备了建立"信任关系"的能力,程序设计人员可以利用它对站点进行信任性验证。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25951437/viewspace-700897/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/25951437/viewspace-700897/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值