58
http://www.wenyuan.com.cn/webnew/ 11 11 JDBC JDBC 第第 第第 第第第 (: 2 第第4 第第

第 11 章 JDBC 编程

  • Upload
    dugan

  • View
    123

  • Download
    0

Embed Size (px)

DESCRIPTION

第 11 章 JDBC 编程. (时间: 2 次课, 4 学时). 第 11 章 JDBC 编程. 教学提示: JDBC 是一种用于执行 SQL 语句的 Java API ,是一组用 Java 编写的类和接口。它为 Java 应用提供了一种与各种不同数据库进行对话的方式。使用 JDBC 可以很容易地把 SQL 语句传送到任何关系型数据库中。 本章主要介绍: JDBC 简介、 JDBC 基本编程和 JDBC 编程实例. 第 11 章 JDBC 编程. 11.1 JDBC 简介 11.2 JDBC 基本编程 11.3 JDBC 编程实例 - PowerPoint PPT Presentation

Citation preview

http://www.wenyuan.com.cn/webnew/

第第 1111 章 章 JDBCJDBC 编程编程

(时间: 2 次课, 4 学时)

http://www.wenyuan.com.cn/webnew/

第第 1111 章 章 JDBCJDBC 编程编程 教学提示: JDBC 是一种用于执行 SQL 语句的 Java API ,

是一组用 Java 编写的类和接口。它为 Java 应用提供了一种与各种不同数据库进行对话的方式。使用 JDBC 可以很容易地把 SQL 语句传送到任何关系型数据库中。

本章主要介绍: JDBC 简介、 JDBC 基本编程和 JDBC 编程实例

http://www.wenyuan.com.cn/webnew/

第第 1111 章 章 JDBCJDBC 编程编程

11.1 JDBC 简介 11.2 JDBC 基本编程 11.3 JDBC 编程实例 11.4 课后练习

http://www.wenyuan.com.cn/webnew/

11.1 JDBC11.1 JDBC 简介 简介

11.1.1 从 ODBC 到 JDBC 11.1.2 JDBC 的特点 11.1.3 JDBC 驱动程序 11.1.4 JDBC API

http://www.wenyuan.com.cn/webnew/

11.1 JDBC11.1 JDBC 简介 简介

JDBC 为访问不同的数据库提供了一种统一的途径,像 ODB

C(Open Database Connectivity) 一样, JDBC 对开发者屏蔽了一些细节问题。

JDBC 的目标是使应用程序开发人员使用 JDBC 可以连接任何提供了 JDBC 驱动程序的数据库系统,使得开发人员能够用纯 Java API 来编写具有平台无关性的数据库应用程序,增强了数据库访问能力,大大简化和加快了开发过程。

http://www.wenyuan.com.cn/webnew/

11.1.1 11.1.1 从从 ODBCODBC 到到 JDBC JDBC

基于 C 语言的开放数据库互连 (ODBC) 是为了实现异构数据库互连而由 Microsoft 公司推出的一种标准,它是一个单一的、公共的编程接口。 ODBC 提供不同的程序以存取不同的数据库,但只提供一种应用编程接口 (API) 给应用程序,如图 11-1 所示。

http://www.wenyuan.com.cn/webnew/

11.1.1 11.1.1 从从 ODBCODBC 到到 JDBC JDBC

图 11-1 JDBC 的结构体系

http://www.wenyuan.com.cn/webnew/

11.1.1 11.1.1 从从 ODBCODBC 到到 JDBC JDBC ODBC 的体系结构含有 4 个层次。 (1) 应用程序 (Application) :执行 ODBC 函数的调用和处理,

提交 SQL 语句并检索结果。 (2) 驱动程序管理器 (Driver Manager) :为应用程序装载驱动

程序。 (3) 驱动程序 (Driver) :驱动程序是实现 ODBC 函数调用和

同数据源交互作用的动态链接库,它执行 ODBC 函数调用,提交 SQL 请求到指定的数据源,并把结果返回给应用程序。如果需要,驱动程序也可改变应用程序的请求,以与特定的DBMS 的语法匹配。

(4) 数据源 (Data Source) :由用户需要存取的数据和与之相连的操作系统、 DBMS 及存取 DBMS 的网络平台组成。

http://www.wenyuan.com.cn/webnew/

11.1.2 JDBC11.1.2 JDBC 的特点 的特点 与 ODBC 相比, JDBC 直接在应用程序中加载驱动程序并连接特定的数据库。 JDBC 的体系结构如图11-2 所示。在体系结构中, JDBC API 屏蔽不同的数据库驱动程序之间的差别,为开发者提供一个标准的、纯 Java 的数据库程序设计接口,为在 Java 中访问不同类型的数据库提供技术支持。驱动程序管理器 (Driver Manager) 为应用程序装载数据库驱动程序 (JDBC Driver) ,数据库驱动程序是与具体的数据库相关的,由数据库开发商提供,用于向数据库提交 SQL 请求,完成对数据库的访问。

http://www.wenyuan.com.cn/webnew/

11.1.2 JDBC11.1.2 JDBC 的特点 的特点

图 11-2 JDBC 的体系

http://www.wenyuan.com.cn/webnew/

11.1.2 JDBC11.1.2 JDBC 的特点 的特点

与 ODBC 相类似, JDBC 接口 (API) 包含两层。 (1) JDBC API :抽象接口,负责与 JDBC 驱动程序管理器 API 进行通信,供应用程序开发人员使用( 连接数据库,发送 SQL 语句,处理结果 ) 。

(2) JDBC 驱动程序 API : JDBC 驱动程序管理器与实际连接到数据库的第三方驱动程序进行通信( 执行 SQL 语句,返回查询信息 ) 。供各开发商开发数据库驱动程序 (JDBC Driver) 使用。 JDBC Driver 是一个类的集合,实现了 JDBC 所定义的类和接口,提供了一个能实现 java.sql.Driver 接口的类。

http://www.wenyuan.com.cn/webnew/

11.1.3 JDBC11.1.3 JDBC 驱动程序 驱动程序 JDBC 驱动可以分为下面四种类型,如图 11-3 所示。

图 11-3 四种类型的 JDBC 驱动程序

http://www.wenyuan.com.cn/webnew/

11.1.3 JDBC11.1.3 JDBC 驱动程序 驱动程序 1. JDBC-ODBC 桥,加上 ODBC 驱动程序 ( 类型 1) 此驱动程序负责将 JDBC 转换为 ODBC, 通过 ODBC 驱动程

序来获得对数据库的 JDBC 访问。 Sun 公司的 Java 2 JDK 提供 JDBC/ODBC 桥接器 (sun.jdbc.odbc.JdbcOdbcDriver) 。使用时必须先安装 ODBC 驱动程序和配置 ODBC 数据源。在 JDBC 刚推出时,桥接器可以方便地用于测试,并不用于生产性的应用。目前,有很多更好的驱动程序,不建议使用桥接器。仅当特定的数据库系统没有相应的 JDBC 驱动程序时使用。

2. 本地 API ,部分 Java 驱动程序 ( 类型 2) 此驱动程序是个部分使用 Java 编程语言编写和部分使用本机

代码编写的驱动程序,用于与数据库的客户机 API 进行通信。本地 API 驱动程序将 JDBC 命令转换为本地数据库系统的本地库方法,调用第三方数据库函数。使用时,除了安装 Java库外,还必须安装某个特定数据库平台的代码 ( 二进制代码,非 Java) 。

http://www.wenyuan.com.cn/webnew/

11.1.3 JDBC11.1.3 JDBC 驱动程序 驱动程序 3. JDBC-Net ,纯 Java 驱动程序 ( 类型 3) 此驱动程序是个纯粹的 Java 客户程序库,使用跨数据库协议,

将数据库访问请求传输给一个服务器组件,然后该中间件服务器将访问请求转换为特定数据库系统的协议,发送给数据库系统。该客户程序库是独立于实际数据而运行的,因此简化了对它的配置,如图 11-4 所示。

4. 本地协议,纯 Java 驱动程序 ( 类型 4) 此驱动程序是个纯粹的 Java 驱动程序,直接与特定的数据库

系统通信,直接将 JDBC 命令转换为数据库系统的本地协议。其优点是没有中间的转换或者是中间件。通常用于提高数据库访问的性能,如图 11-5 所示。

http://www.wenyuan.com.cn/webnew/

11.1.3 JDBC11.1.3 JDBC 驱动程序驱动程序

图 11-4 第 3 种类型的 JDBC 驱动程序

http://www.wenyuan.com.cn/webnew/

11.1.3 JDBC11.1.3 JDBC 驱动程序驱动程序

图 11-5 第四种类型的 JDBC 驱动程序

http://www.wenyuan.com.cn/webnew/

11.1.4 JDBC API 11.1.4 JDBC API JDBC 为 Java 语言提供一个调用级的接口,主要完成三个方面的功能:建立与数据库的连接;向数据库发送 SQL 语句;处理数据库返回结果。 JDBC API 调用流程关系如图 11-6 所示。

这些功能由一系列 API 实现,其中主要的接口有驱动程序管理器 (DriverManager) 、驱动 (Driver) 、连接 (Connection) 、 SQL 语句 (Statement) 和结果集(ResultSet) 。

http://www.wenyuan.com.cn/webnew/

11.1.4 JDBC API 11.1.4 JDBC API

图 11-6 JDBC API 调用流程关系图

http://www.wenyuan.com.cn/webnew/

11.1.4 JDBC API 11.1.4 JDBC API 1. DriverManager DriverManager(java.sql.DriverManager) 类处理驱动程序的加

载,建立和管理应用程序与驱动程序之间的连接。它跟踪可用的驱动程序,并在数据库与相应的驱动程序之间建立连接,处理驱动程序的登录时间等相关事务。

建立与数据的连接,首先要创建指定数据库的 URL ,设定数据库的来源。数据库的 URL 对象与网络资源的统一资源定位类似,格式如下:

jdbc:subProtocol:subName://hostname:port;DatabaseName=XXX;

http://www.wenyuan.com.cn/webnew/

11.1.4 JDBC API 11.1.4 JDBC API 2. Driver 每个数据库驱动程序必须实现 Driver 接口。驱动程序由开

发商提供,将应用程序的 JDBC API 请求转换为特定的数据库请求。在编程时要连接数据库,必须先装载特定厂商提供的数据库驱动程序 (Driver) ,即调用 Class.forname()创建一个 JDBC 驱动器的实例。驱动程序的装载:

import java.sql.*; Class.forName(driverName); //创建一个 JDBC 驱动器的实例 【例 11.2】加载驱动程序。 import java.sql.*; Class.forName("com.Microsoft.jdbc.sqlserver.SqlServerDriver"); // 装载 MS SQLServer 驱动 Class.forName("oracle.jdbc.driver.OracleDriver");// 装载 Oracle

驱动 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // 装载 JDBC-ODBC Bridge 驱动,在 Java 2 SDK 中提供

http://www.wenyuan.com.cn/webnew/

11.1.4 JDBC API 11.1.4 JDBC API 3. Connection Connection(java.sql.Connection) 用来表示数据连接的对象,对数据库的

一切操作都是在这个连接的基础上进行的。它将应用程序连接到特定的数据库。可以使用 Driver.connect 方法建立连接。

Connection con=Driver.connect(urlString, propertiesInfo); 【例 11.3】使用 Driver.connest 方法建立连接。 Driver drv=new COM.cloudscape.coreRmiJdbcDrive(); Connection con=null; try{ con=drv.connect(Jdbc:cloudscape:rmi:biceadb,null); }catch(SQLException e){…} Connection 类的主要的成员方法有以下几个。 Statement createStatement() :创建一个 Statement 对象。 void commit() :提交对数据库的改动并释放当前连接的锁。 void rollback() :回滚当前事务中的所有改动并释放持有的数据库锁。 void setReadOnly() :设置连接的只读模式。 void close() :立即释放连接对象的数据库和 JDBC 资源。

http://www.wenyuan.com.cn/webnew/

11.1.4 JDBC API11.1.4 JDBC API 4. Statement Statement(java.sql.Statement) 是在已经建立的连接上,向数据

库发送 SQL 语句的对象。它只是一个接口的定义,其中包括了执行 SQL 语句和获取返回结果的方法。

有如下 3 种 Statement 对象。 Statement :用于执行不带参数的简单 SQL 语句。 PreparedStatement :用于执行带 IN 参数和不带 IN 参数的预编译 SQL 语句。

CallableStatement :用于执行对数据库存储过程的调用。 它们都作为在给定连接上执行 SQL 语句的容器,用于发送

特定类型的 SQL 语句。 (1) Statement 对象的创建方法为: Statement stmt=con.createStatement();

http://www.wenyuan.com.cn/webnew/

11.1.4 JDBC API11.1.4 JDBC API 主要的成员方法如下。 boolean execute(String sql) :执行 SQL 语句。 ResultSet executeQuery(String sql) :执行 SELECT语句,数据库查询,返回结果集。

int executeUpdate(String sql) :执行 INSERT 、 UPDATE 、 DELETE 、 DDL 语句,数据库更新。

Connection getConnection() :获取对数据库的连接。 int getMaxRows() :返回结果集的最大行数。 ResultSet getResultSet() :获取结果集。 void close() :关闭 Statement 语句指定的数据库连接。

http://www.wenyuan.com.cn/webnew/

11.1.4 JDBC API11.1.4 JDBC API (2) PreparedStatement PreparedStatement 继承了 Statement 接口。 PreparedStateme

nt 语句中包含预编译的 SQL 语句,因此可以获得更高的执行效率。特别是当需要反复调用某些 SQL 语句时,使用 PreparedStatement 语句具有明显优势。

另一方面, PreparedStatement 语句中,可以包含多个“ ?”代表的字段,在程序中利用 set 方法设置该字段的内容,从而增强了程序的动态性。

对象的创建方法为: PreparedStatement pstm=con.PrepareStatement(SQL 语句 );

http://www.wenyuan.com.cn/webnew/

11.1.4 JDBC API11.1.4 JDBC API (3) CallableStatement CallableStatement 继承了 PreparedStatement 接口。 CallableS

tatement 对象用于执行对数据库中的存储过程的调用。在调用过程中可以使用设置 IN参数向调用的存储过程提供执行所需的参数,通过 OUT参数获取存储过程的执行结果。

对象的创建方法为: CallableStatement cstm=con.prepareCall(sqlString); 对象参数中调用以下存储过程。 {call procedure_name} :不需要参数的存储过程调用。 {call procedure_name[(?,?,?…)]} :需要若干参数的存储过程

调用。 {? = call procedure_name[(?,?,?…)]} :需要若干参数并有一个

返回值的存储过程调用。

http://www.wenyuan.com.cn/webnew/

11.1.4 JDBC API11.1.4 JDBC API 5. ResultSet ResultSet(java.sql.ResultSet) 类用来暂时存放查询操作返回的数据结果集 ( 包括行、列 ) 。

它包含符合 SQL 语句条件的所有行,使用 get() 方法对这些行的数据进行访问。对象的创建方法为:

Connection con=DriverManager.getConnection(urlString);

Statement stm=con.createStatement(); ResultSet rs=stm.executeQuery(sqlString);

http://www.wenyuan.com.cn/webnew/

11.1.4 JDBC API11.1.4 JDBC API

此外, DatabaseMetadata 类和 ResultSetMetadata 类(java.sql.DatabaseMetadata; java.sql.Result SetMetadata) 用于查询结果集、数据库和驱动程序的元数据信息。

Connection 提供了一个方法 getMetadata() 来获得数据库的元数据信息,它返回的是一个 DatabaseMetadata 对象。通过 DatabaseMetadata 对象,可以获得数据库的各种信息,如数据库厂商信息、版本信息、数据表数目、每个数据表名称,如: getDatabase ProductName() 、 getDatabaseProductVersion() 、 getDriverName() 、 getTables()等。

http://www.wenyuan.com.cn/webnew/

11.2 JDBC11.2 JDBC 基本编程 基本编程

11.2.1 连接数据库 11.2.2 加载驱动程序和创建连接 11.2.3 执行 SQL 语句 11.2.4 处理结果集 11.2.5 关闭数据库

http://www.wenyuan.com.cn/webnew/

11.2 JDBC11.2 JDBC 基本编程 基本编程

本节将介绍 JDBC 基本编程的相关内容,包括连接数据库、加载驱动程序和创建连接、执行 SQL 语句、处理结果集以及关闭数据库。

http://www.wenyuan.com.cn/webnew/

11.2.1 11.2.1 连接数据库 连接数据库 在创建 JDBC 应用之前,必须安装相应数据库的 JDBC 驱动

程序。 1. 安装 JDBC 实际上,所有的数据库开发商都已经为数据库配备了 JDBC

驱动程序。必须找到供应商使用的 JDBC 驱动程序类的名字。 通常驱动程序的名字是: com.Microsoft.jdbc.sqlserver.SQLServerDriver oracle.jdbc.driver.OracleDriver 然后,必须找到驱动程序所在的 JAR 文件或 ZIP 文件。将该驱动程序的完整路径添加在类路径 (Classpath)上。可以修改 CLASSPATH环境参数或将程序库文件复制到 jre/lib/ext目录中。

http://www.wenyuan.com.cn/webnew/

11.2.1 11.2.1 连接数据库 连接数据库 2. 连接过程 首先引入 JDBC 连接所需的类;加载 JDBC 驱动程序;识别数据源 ( 可选, JDBC 2.0 javax.sql.DataSource 接口支持 );分配或创建一个连接对象 Connection;分配或创建一个语句对象 Statement;使用 Statement 对象执行 SQL 语句;从返回的 ResultSet 对象中检索数据;关闭 ResultSet 对象、 Statement 对象、 Connection 对象。建立到数据库的连接过程如图 11-7 所示。

http://www.wenyuan.com.cn/webnew/

11.2.1 11.2.1 连接数据库 连接数据库

图 11-7 建立到数据库的连接

http://www.wenyuan.com.cn/webnew/

11.2.1 11.2.1 连接数据库连接数据库 连接过程的 Java 语句实现如下。 (1) 加载 JDBC 驱动类: Class.forName("driverName"); (2) 打开一个数据库连接: DriverManager.getConnection("jdbc:xxx:datasource"); (3) 执行 SQL 语句: stmt = con.createStatement(); stmt.executeQuery("Select * from myTable"); (4) 处理结果集 Process result set : while (rs.next()) { name = rs.getString("name"); amount = rs.getInt("amt"); }

http://www.wenyuan.com.cn/webnew/

11.2.1 11.2.1 连接数据库连接数据库 3. 建立 JDBC 应用程序 创建任何一个 JDBC 应用程序,都需要以下 6 个步骤。

(1) 加载一个 JDBC 驱动程序。 (2) 建立与数据库的连接对象。 (3) 建立一个语句对象。 (4) 执行 SQL 语句。 (5) 处理结果集。 (6) 关闭所有 JDBC 对象。

http://www.wenyuan.com.cn/webnew/

11.2.2 11.2.2 加载驱动程序和创建连接 加载驱动程序和创建连接

1. 加载驱动程序 在应用程序中,有三种方法可以加载驱动程序。 (1) 利用 System 类的静态方法 setProperty() System.setProperty("jdbc.drivers", "sun.jdbc.odbc.Jdbc

OdbcDriver"); (2) 利用 Class 类的静态方法 forName() Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Class.forName("oracle.jdbc.driver.OracleDriver"); (3) 直接创建一个驱动程序对象 new sun.jdbc.odbc.JdbcOdbcDriver();

http://www.wenyuan.com.cn/webnew/

11.2.2 11.2.2 加载驱动程序和创建连接加载驱动程序和创建连接 2. 建立与数据库的连接 利用 DriverManager 类的静态方法 getConnection() 来获得与

特定数据库的连接实例 (Connection 实例 ) 。 Connection conn = DriverManager.getConnection(source); Connection conn = DriverManager.getConnection(source, user, p

ass); 其中的三个参数都是 String 类型的,使用不同的驱动程序与

不同的数据库建立连接时, source 的内容是不同的,但其格式是一致的,都包括用冒号隔开的三个部分:

jdbc:driverType:dataSource 对于 JDBC-ODBC Bridge , driverType 为 odbc, dataSource 则为 ODBC 数据源:“ jdbc:odbc:myDSN” 。对于其他驱动程序,数据库系统不同, driverType 和 dataSource 有不同的格式和内容。

http://www.wenyuan.com.cn/webnew/

11.2.3 11.2.3 执行执行 SQLSQL 语句 语句 每执行一条 SQL 语句,都需要利用 Connetcion 实例的 createStatement() 方法来创建一个 Statement 实例。 Statement 的常用方法包括:执行 SQL INSERT 、 UPDATE或 DELETE等语句, int executeUpdate(String sql) 执行 SQL SELECT 语句 ResultSet executeQuery (Stringsql) ,执行一个可能返回多个结果的 SQL 语句 boolean execute(Stringsql) ( 与其他方法结合起来获得结果 ) 。 Statement 中还有其他的方法来执行 SQL 语句。

http://www.wenyuan.com.cn/webnew/

11.2.4 11.2.4 处理结果集 处理结果集 通过 ResultSet 可以获得查询结果。 ResultSet 实例最初定位在结果集的第一行 (记录 ) 。 ResultSet 提供了一些在结果集中定位的方法,如 next()等。 ResultSet 提供了一些方法来获得当前行中的不同字段的值,

如 getXXX() 。 ResultSet 中还提供了有关方法来修改结果集,并提交到数

据库中去。 ResultSet 对象常用的 get 方法的参数为 int colIndex 或 Strin

g colName 确定了字段类型,获取字段数据时,就可以明确如何使用 R

esultSet 中的 getXXX() 方法了。 ResultSet常用的 getXXX方法如表 11-2 所示。

http://www.wenyuan.com.cn/webnew/

11.2.4 11.2.4 处理结果集处理结果集 表 11-2 ResultSet 中常用的 getXXX 方法

http://www.wenyuan.com.cn/webnew/

11.2.4 11.2.4 处理结果集处理结果集 通过 ResultSetMetadata 来获得查询结果的元数据信息 Result

Set 提供了一个方法 getMetadata() 来获得结果集的元数据信息,它返回的是一个 ResultSetMetadata 实例。

通过 ResultSetMetadata 实例,就可以获得结果集中字段的详细信息,如字段总数,每个字段的名称、类型等。

getColumnCount() :返回列数。 getColumnName(i) :返回列名。 getColumnType(i) :返回列数据类型。 getColumnLabel(i) :返回列的标签。 getTableName() :返回表名。

http://www.wenyuan.com.cn/webnew/

11.2.5 11.2.5 关闭数据库 关闭数据库 数据库访问结束后,需要关闭已打开的 JDBC 对象,释放占

用的资源。 【例 11.11 】关闭数据库。 try { rs.close(); stm.close(); con.close(); } catch (SQLException e) { e.printStackTrace(); }

http://www.wenyuan.com.cn/webnew/

11.3 JDBC11.3 JDBC 编程实例 编程实例

11.3.1 建立连接 11.3.2 数据库操作 11.3.3 JDBC2.0 中的数据源

http://www.wenyuan.com.cn/webnew/

11.3 JDBC11.3 JDBC 编程实例 编程实例

在 11.2 节的讲解基础上,本节将通过具体的例子来介绍如何使用 JDBC 进行数据库操作。

http://www.wenyuan.com.cn/webnew/

11.3.1 11.3.1 建立连接 建立连接 文件: database.properties // ==================== Program Discription ====================== // 文件名称: database.properties // 文件目的:存储连接数据库所需的属性信息,可根据不同的数据库信息设置 // ============================================================== jdbc.drivers=COM.cloudscape.core.JDBCDriver jdbc.url=jdbc:cloudscape:COREJAVA;create=true jdbc.username= jdbc.password= 文件: TestDB.java // ==================== Program Discription ====================== // 程序名称: TestDB.java // 程序目的:利用 JDBC 连接数据库 // ============================================================== import java.sql.*; import java.io.*; import java.util.*; /**

http://www.wenyuan.com.cn/webnew/

11.3.1 11.3.1 建立连接建立连接 本程序测试数据库和 JDBC 驱动是否正确安装。 */ class TestDB { public static void main(String args[]) { try { Connection conn = getConnection(); Statement stat = conn.createStatement(); stat.execute("CREATE TABLE Greetings(Name CHAR

(20))"); stat.execute( "INSERT INTO Greetings VALUES('Hello, World!')"); ResultSet result = stat.executeQuery("SELECT * FROM Greetings"); result.next(); System.out.println(result.getString(1)); result.close(); stat.execute("DROP TABLE Greetings"); stat.close(); conn.close();

http://www.wenyuan.com.cn/webnew/

11.3.1 11.3.1 建立连接建立连接 } catch (SQLException ex) { while (ex != null) { ex.printStackTrace(); ex = ex.getNextException(); } } catch (IOException ex) { ex.printStackTrace(); } } /** 从 database.properties 文件中获取连接的属性信息,返回一个数据

库连接 */ public static Connection getConnection() throws SQLException, IOException {

http://www.wenyuan.com.cn/webnew/

11.3.1 11.3.1 建立连接建立连接

Properties props = new Properties(); FileInputStream in = new FileInputStream("database.properties"); props.load(in); in.close(); String drivers = props.getProperty("jdbc.drivers"); if (drivers != null) System.setProperty("jdbc.drivers", drivers); String url = props.getProperty("jdbc.url"); String username = props.getProperty("jdbc.usernam

e"); String password = props.getProperty("jdbc.passwor

d"); return DriverManager.getConnection(url, username, passwor

d); } }

http://www.wenyuan.com.cn/webnew/

11.3.2 11.3.2 数据库操作 数据库操作 // ==================== Program Discription ==============

============ // 程序名称: User.java // 程序目的:创建一个用来操作用户信息的类 // ===================================================

=========== public class User { private String username; private String password; private String regDate; // 获取用户名 public String getUsername() { return username; } // 设置用户名

http://www.wenyuan.com.cn/webnew/

11.3.2 11.3.2 数据库操作 数据库操作 public void setUsername(String username) { this.username = username; } // 获取用户密码 public String getPassword() { return password; } // 设置用户密码 public void setPassword(String password) { this.password = password; } // 获取用户注册时间 public String getRegDate() { return regDate; } // 设置用户注册时间 public void setRegDate(String regDate) { this.regDate = regDate; } }

http://www.wenyuan.com.cn/webnew/

11.3.2 11.3.2 数据库操作 数据库操作 // ==================== Program Discription ========================== // 程序名称: UserMgr.java // 程序目的:利用 JDBC 对数据库进行增删查改操作 // ============================================================= import java.sql.*; import test.DBConnection; public class UserMgr { // 向数据库中添加用户信息 public boolean addUser(User user) { // 构造 SQL 语句 String sql="insert into tbl_user (vcUsername,vcPassword,dtRegDate) values('"+user.getUsername()+"','" +user.getPassword()+"',getDate())"; Statement stmt; Connection conn; try { // 获取数据库连接 conn = DBConnection.getConnection(); // 创建 Statement 对象 stmt = conn.createStatement();

http://www.wenyuan.com.cn/webnew/

11.3.2 11.3.2 数据库操作数据库操作 // 执行 SQL 语句 stmt.executeUpdate(sql); stmt.close(); conn.close(); return true; } catch (SQLException e) { System.out.println(e.getMessage()); } return false; } // 删除数据库中某个用户的信息 public boolean deleteUser(User user) { String sql="delete from tbl_user where vcUsername=" +"'"+user.GetUser name()+"'"; Connection conn; Statement stmt; try { conn=DBConnection.getConnection(); stmt=conn.createStatement(); stmt.executeUpdate(sql); stmt.close(); conn.close(); return true; }

http://www.wenyuan.com.cn/webnew/

11.3.2 11.3.2 数据库操作数据库操作 catch (SQLException e) { System.out.println(e.getMessage()); } return false; } // 根据用户名查询数据库获取一个用户对象 public User getUser( String username ) { User user; String sql="select * from tbl_user where vcUsername='" +username+"'"; Statement stmt; Connection conn; try { conn= DBConnection.getConnection(); stmt=conn.createStatement(); // 执行 SQL 语句并将查询结果放入结果集中 ResultSet rs=stmt.executeQuery(sql); // 将结果集中的数据取出放入 User 类的对象中 if (rs.next())

http://www.wenyuan.com.cn/webnew/

11.3.2 11.3.2 数据库操作数据库操作 { user=new User(); user.setUsername(rs.getString("vcUsername")); user.setPassword(rs.getString("vcPassword")); user.setRegDate(rs.getDate("dtRegDate").toStri

ng()); stmt.close(); conn.close(); return user; } } catch (SQLException e) { System.out.println(e.getMessage()); } return null; } // 通过验证密码鉴定用户的身份 public int checkUser(User user) { User dbUser= getUser(user.getUsername()); if (dbUser==null) return 0; else if (dbUser.getPassword().equals(user.getPassword())) return 1; else return -1; }

http://www.wenyuan.com.cn/webnew/

11.3.2 11.3.2 数据库操作数据库操作 // 修改数据库中某个用户的信息 public boolean modifyUser(User user) { Connection conn; Statement stmt; String sql="update tbl_user set vcPassword='" +user.getPassword()+"' where vcUsername='"+user.getUsername()+"'"; try { conn=DBConnection.getConnection(); stmt=conn.createStatement(); stmt.executeUpdate(sql); stmt.close(); conn.close(); return true; } catch (SQLException e) { System.out.println(e.getMessage()); } return false; } }

http://www.wenyuan.com.cn/webnew/

11.3.3 JDBC2.011.3.3 JDBC2.0 中的数据源 中的数据源 // ==================== Program Discription ========================== // 程序名称: Datasource.java // 程序目的:使用数据源建立数据库连接 // ============================================================== package jdbcSample; import java.sql.*; import com.pointbase.jdbc.jdbcDataSource; public class Datasource { public Datasource() { } public static void main(String[] args) { //step 1 jdbcDataSource ds=new jdbcDataSource(); ds.setDatabaseName ("jdbc:pointbase:server://localhost:9092/sample"); ds.setUser("pbpublic"); ds.setPassword("pbpublic"); try {

http://www.wenyuan.com.cn/webnew/

11.3.3 JDBC2.011.3.3 JDBC2.0 中的数据源 中的数据源 Connection con=ds.getConnection(); //Statement Statement stm=con.createStatement(); //resultset ResultSet rs=stm.executeQuery ("select name,city from customer_tbl"); while(rs.next()) { System.out.print("name:"+rs.getString(1)); System.out.println("\t city:"+rs.getString

(2)); } //colse rs.close(); stm.close(); con.close(); } catch(Exception ex) { ex.printStackTrace(); } } }

http://www.wenyuan.com.cn/webnew/

11.4 11.4 课后练习 课后练习 1. 填空题 (1) ______ 包提供了在 Java 中处理关系型数据库的类和接口。 (2) ______ 接口帮助管理 Java 程序和数据库之间的连接。 2. 选择题 (1) 下列不是 ODBC 的四个层次中的一个的是 ( ) 。 A. 应用程序 B. 驱动程序管理器 C. 驱动程序 D. 数据库 (2) JDBC 的接口包括两个层次 , 它们是 ( ) 。 A. JDBC API B. JDBC 驱动程序 C. JDBC 应用程序 D. JDBC 用户

接口 3. 判断题 (1) 在进行 Java 编程时,不需要任何驱动,而只引用 Java 中的相应包。

( ) (2) JDBC-ODBC负责将 ODBC转换为 JDBC 。

( ) 4. 简答题 (1) 什么是 JDBC API 的关键组成部分? (2) 写出四种 JDBC 驱动器。 5. 操作题 (1) 配置 MS SQL Server 或 Oracle 的 JDBC 类库,在 JBuilder 中配置。 (2) 在数据库中创建一个表 Student ,有两个字段: id(String) 、 name

(String) 。写一个类 InsertInfo.java 完成插入数据操作。

http://www.wenyuan.com.cn/webnew/

Q & A?Q & A?

Thanks!Thanks!