JDBC

来源:互联网 发布:关键词优化要多久 编辑:程序博客网 时间:2024/06/06 06:51

JDBC 技术概述


JDBC (Java Database Connectivity)是一种用于执行 SQL 语句的 Java API。它由一组用 Java 编程语
言编写的类和接口组成,为 Java 应用程序与各种不同数据库之间进行对话提供了一种便捷的方法,使得
开发人员能够用纯 Java API 来编写具有跨平台性的数据库应用程序。
23.1.1   JDBC 技术介绍
应用程序可以通过数据库厂商提供的 API 以及 SQL 语句对数据库进行操作,如图 23.1 所示。
图 23.1  应用程序访问数据库 
在此模式下,看到不同的数据库有不同的 API 操作界面。这样的话,对于实现同样功能的应用程序,
针对不同的数据库,开发人员需要编写不同的代码,这样对 Java 设计人员是很不方便的。于是 JDBC 应
运而生。
JDBC 的出现使 Java 程序对各种数据库的访问能力大大增强。通过使用 JDBC,开发人员可以很方
便地将 SQL 语句传送给几乎任何一种数据库。
JDBC 的工作模式如下面的图 23.2 所示。从图中可以看到,应用程序通过调用 JDBC 来操作数据库
的过程,其实是由数据库厂商提供的 JDBC 驱动程序来负责的。Java 提供统一的 JDBC 接口 API,各个
数据库厂商负责开发实现这些接口的 API。那么,如果数据库访问程序要更换数据库的话,只要更换新
的数据库驱动程序,并在 JDBC 中载入新的驱动程序来源,即可完成数据库系统的变更。换句话说,使
用 JDBC 后就没有必要写一个程序访问 Oracle 数据库,同时再写另一个程序访问 SQL  Server 数据库,
再写一个程序访问 DB2 了。 
2
图 23.2   JDBC 工作模式
JDBC 的主要功能如下。
  建立与数据库或者其他数据源的连接;
  向数据库发送 SQL 命令;
  处理数据库的返回结果。
23.1.2   JDBC  的 4 种驱动程序
为了与某个数据库连接,必须要具有适合该数据库的驱动程序。JDBC 驱动程序主要有以下 4 种基
本类型:
1. JDBC-ODBC 桥加 ODBC 驱动程序
JDBC-ODBC 桥产品经由 ODBC 驱动程序供 JDBC 访问数据库。ODBC(开放式数据库连接)的出
现要比 JDBC 早,广泛地应用于连接各种环境中的数据库。 JDBC-ODBC 桥加 ODBC 驱动程序实际是把
所有 JDBC 的调用传递给 ODBC,再由 ODBC 调用本地数据库驱动代码。在本书中,将采用此驱动程序
+Access 数据库进行演示。这种驱动程序的主要优点有 3 个:
  它提供了连接几乎所有平台上的所有数据库的能力。
  它可能是访问低端桌面数据库(例如 Access)和应用的程序的唯一方式。
  操作简单,适应初学才练习。
这种驱动程序的缺点如下。
  ODBC 驱动程序需要安装并加载到目标机器上。
  JDBC 和 ODBC 之间的转换将在很大程度上影响系统的性能。
2.  本地 API 和部分 Java 编写的驱动程序
这种类型的驱动程序是把客户机 API 上的 JDBC 调用转换为对数据库的调用。也就是说,这种类型
的驱动程序是通过调用本地 API 来实现与数据库的通信。这种类型的驱动程序要比采用类型 1 方式的速
度快很多,但它仍然存在着一些缺点:
  它仍然需要在目标机器上安装本地代码。
  JDBC 所依赖的本地接口在不同的 Java 虚拟机供应商以及不同的操作系统上是不同的。
3. JDBC 网络纯 Java 驱动程序
这种驱动程序根据三层结构建立:网络协议驱动、中间件服务器和数据库服务。该类型的驱动程序
由中间件服务器提供,这样客户端程序可以使用数据库无关的协议和中间件服务器进行通信,中间件服
务器再将客户端的 JDBC 调用转发给数据库进行处理。这种方式的驱动程序有以下优点:
  不需要客户机上有任何本地代码。
  不需要客户安装任何程序。
  大部分功能实现都在 server 端,所以这种驱动可以设计的很小,可以非常快速的加载到内存中。    
·3·
缺点为:中间件层仍然需要有配置其他数据库驱动程序,并且由于多了一个中间层传递数据,它的
执行效率还不是最好。
4.  本地协议纯 Java 驱动程序
该类型的驱动程序中包含了特定数据库的访问协议,使得客户端可以直接和数据库进行通信。这种
方式的驱动程序有以下优点:
  效率高,速度快。
  驱动程序可以动态的被下载。
缺点为:对于不同的数据库需要下载不同的驱动程序。
这四种驱动程序的属性如表 23.1 所示
表 23.1  驱动程序的类型及其属性
驱动程序种类  纯Java  网络协议
JDBC-ODBC桥加ODBC  非  直接
本地API和部分Java  非  直接
JDBC网络纯Java  是  要求连接器
本地协议纯Java  是  直接
23.1.3   如何获得 JDBC 驱动程序
要想得到某个数据库的驱动程序,可以从该数据库厂商的网站上进行下载,例如 SQL  Server  2005 
JDBC  Driver 的下载地址为:http://www.microsoft.com 。也可以访问 Oracle 公司的网站(网址是
http://www.oracle.com)下载 Oracle 数据库的 JDBC 驱动数据或 MySQL 数据库的驱动程序。
如 果 本 机 安 装 了 Oracle 数 据 库 的 话 , 可 以 到 本 机 Oracle 安 装 目 录 下 找 。 例 如 ,
E:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar。(jdk 1.6 及以上使用 ojdbc6.jar,jdk 1.5
使用 ojdbc5.jar)
23.1.4   设置环境变量使得驱动程序可被访问
获得驱动程序以后,需要将驱动程序加入 Classpath 的设定之中。例如作者本人的 Oracle 11g 的驱动
程序路径为“ E:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar ”, 则必须在环境变量
CLASSPATH 中添加路径“E:\app\Administrator\product\11.2.0\dbhome_1\jdbc\lib\ojdbc6.jar”。
说明:如果是使用 IDE 的话(如 NetBeans 或 Eclipse 等),可以不用设置环境变量。IDE 中支持将
数据库驱动程序库添加到工程构建路径上。
23.2   java.sql 包
在 JDBC 介绍中可以看到,JDBC 是采用接口和实现分离的思想设计了 Java 数据库编程的框架。接
口由 Java 定义并提供,实现交给各个数据库厂商。
JDBC 的接口包含在 java.sql 及 javax.sql 包中。在 java.sql 包中定义了很多接口和类,其中几个常用
的接口和类如下。 
4
1.驱动程序接口:Driver
在 java.sql 包中定义的 Driver 接口是所有 JDBC 驱动程序必须实现的接口。 在程序中要连接数据库,
必须先加载特定厂商提供的数据库驱动程序。几种主要的数据库驱动程序加载代码如下所示:
Class.forName("oracle.jdbc.driver.OracleDriver");        //加载 Oracle 数据库驱动程序
Class.forName("com.mysql.jdbc.Driver ");           //加载 MySQL 数据库驱动程序
Class.forName("org.postgresql.Driver ");            //加载 PostgreSQL 数据库驱动程序
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver ");  //加载 SQL Server2005 数据库驱动程序
2.  管理驱动程序类:DriverManager
在 java.sql 包中定义的 DriverManager 类是 JDBC 的管理类,作用于用户和驱动程序之间。它跟踪可
用的驱动程序,并在数据库和驱动程序之间建立连接。
当 DriverManager 调用 getConnection()方法时,DriverManager 类首先从它已加载的驱动池中找到一
个可以接受该数据 URL 的驱动程序,然后请求该驱动程序使用相关的数据库 URL 连接到数据库中。于
是,getConnection()方法建立了与数据库的连接。
3.  数据库连接接口:Connection
在 java.sql 包中定义的 Connecton 类的对象代表与数据库的连接,也就是在已经加载的 Driver 和数
据库之间建立连接。必须创建一个 Connection 类的实例,其中包括数据库的信息:连接 URL、数据库
账户和登录密码。
几种主要的数据库的连接 URL 如下:
String ORACLE_CON_URL = "jdbc:oracle:thin:@localhost:1521/orcl";    //Oracle 数据库连接 URL
String MYSQL_CON_URL = "jdbc:mysql://localhost:3306/booklibrary";    //MySQL 数据库连接 URL
String POSTGRESQL_CON_URL = "jdbc:postgresql://localhost:5432/testdb";  //PostgreSQL 数据库连接 URL
String SQLSERVER2005_CON_URL = "jdbc:sqlserver://localhost:1433;DatabaseName=booklibrary";
调用 DriverManager 的 getConnection()方法,并向其传递建立数据库连接的信息,以建立并返回和
数据库的连接。代码如下。
Connection con = DriverManager.getConnection(url, login,password);
其中参数 url 即要连接数据库的连接 URL,参数 login 为连接数据库的合法账户,参数 password 为
连接数据库的密码。
4. SQL 声明接口:Statement
在 java.sql 包中定义的 Statement 类代表要在数据库连接上执行的 SQL 语句,并且提供执行方法。
Connection 接口提供了生成 Statement 对象的方法。在一般情况下,我们通过 connection.createStatement()
方法就可以得到 Statement 的实例。
有三种 Statement 对象,它们都作为在给定连接上执行 SQL 语句的包容器: Statement 、
PreparedStatement (它从 Statement 继承而来)和 CallableStatement (它从 PreparedStatement 继承而来)。
该接口提供了可以被执行的基本的 SQL 语句,作为提高性能的一项措施, PreparedStatement 对象提
供了可以与查询信息一起预编译的一种语句类型。CallableStatement 对象用来封装数据库中存储过程的
执行。
Statement 提供了许多方法,最常用的方法如下。
  execute()  运行语句,返回是否有结果集。
    executeQuery()  运行查询语句,返回 ReaultSet 对象。
    executeUpdate()  运行更新操作,返回更新的行数。
    addBatch()  增加批处理语句。
    executeBatch()  执行批处理语句。 
·5·
    clearBatch()  清除批处理语句。
Statement 对象用于执行不带参数的简单 SQL 语句,它的典型使用如下所示。

Connection conn = DatabaseConnection.getConnection();    //获得数据库连接对象
Statement stmt = conn.createStatement();            //创建 SQL 语句对象
ResultSet rst = stmt.executeQuery(“select * from sometable”);  //执行查询,获得查询结果集

PreparedStatement 对象用于执行带或不带 IN 参数的预编译 SQL 语句,它的典型使用如下所示。

Connection conn = DatabaseConnection.getConnection();  //获得数据库连接对象
//创建预编译语句对象
PrepareStatement pstmt = conn.prepareStatement(“insert into user_info values(?,?,?,?,?,?,?)”;
pstmt.setString(1.”hellking”);              //设置预编译 SQL 语句中的第一个参数
pstmt.setInt(2,20);                  //设置预编译 SQL 语句中的第二个参数
pstmt.setBoolean(3,true);                //设置预编译 SQL 语句中的第三个参数
...
pstmt.executeUpdate();                //执行 SQL 语句
...
CallableStatement 对象用于执行对数据库已存储过程的调用,它的典型使用如下所示。

Connection conn = DatabaseConnection.getConnection();  //获得数据库连接对象
String strSQL = “{call demo_account(?,?,?,?,?,?,?)}”;
java.sql.CallableStatement.sqlStmt = conn.prepareCall(strSQL);
sqlStmt.setString(1,”userid_3”);            //设置调用存储过程 SQL 语句的第一个参数
sqlStmt.setString(2,”userid_1”);            //设置调用存储过程 SQL 语句的第二个参数
...
int I = sqlStmt.executeUpdate();            //执行存储过程

5.  查询结果接口:ResultSet
在 Statement 对象执行 SQL 语句时,有时会返回 ResultSet 结果集。 ResultSet 往往包含的是查询的结
果集。此接口抽象了运行 select 语句的结果,提供了逐行访问结果的方法,通过它访问结果的不同字段。
结果集通常是一张表,其中有查询所返回的列标题及相应的值。
通过 ResultSet.next()方法把当前的指针向下移动一位。最初它位于第一行之前,因此第一次调用 next
将把指针置于第一行上,使它成为当前行。随着每次调用 next()导致指针向下移动,按照从上至下的次
序获取 ResultSet 行。通常情况下,可使用如下的代码遍历 ResultSet 对象内的每一行数据:
...
try{
Connection conn = DatabaseConnection.getConnection();
Statement stmt = conn.createStatement(); 
ResultSet rst = stmt.executeQuery(“select * from User_Info”);
while(rs.next()){
//显示结果集
...
}
}
读取 ResultSet 对象中每一行数据的方法是调用它的 getXXX()方法,XXX 表示 Java 的数据类型。
在使用该方法读取数据时,应该为它指定要读取的列。指定读取的列有两种方法:一种方法是使用列的
6
序号,另一种方法是使用列名。例如,结果集的第 2 列的列名为“StuName”,则下面的两行代码是等
价的。

String name = rs.getString(2);
String name = rs.getString(“StuName”);

如果 XXX 所代表的数据类型与结果集中对应列的数据类型不匹配,将会发生类型转换。例如,结
果集中“StuID”列的数据类型为 int,那么调用 getString(“StuID”)读取 StuID 一列的信息时,将会把
结果集中的 int 类型转化为 String 类型。
0 0