第 十 三 章

33
运运运运Office XP ACCP 4.0 Java Luck JDBC 运运运运

Upload: chaney

Post on 19-Jan-2016

87 views

Category:

Documents


0 download

DESCRIPTION

第 十 三 章. JDBC 基础知识. 回顾 1. File 类用于访问文件系统,但只能操作文件的属性,而不能对文件进行读 / 写 流是指一连串流动的字符,是以先进先出方式发送信息的通道 从流动方向上区分,流可以分为输入流和输出流,从格式上区分,可以分为字节流和字符流 使用 FileInputStream 类和 FileOutputStream 类以字节方式读写文件. 回顾 2. 对于 Unicode 编码的文件,使用 FileReader 类配合 BufferedReader 类读文件,使用 FileWriter 类配合 BufferedWriter 类写文件 - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第  十  三  章

运行环境: Office XP版 本: ACCP 4.0课 程: Java作 者: Lucky

JDBC 基础知识

第 十 三 章

Page 2: 第  十  三  章

File 类用于访问文件系统,但只能操作文件的属性,而不能对文件进行读 / 写

流是指一连串流动的字符,是以先进先出方式发送信息的通道

从流动方向上区分,流可以分为输入流和输出流,从格式上区分,可以分为字节流和字符流

使用 FileInputStream 类和 FileOutputStream 类以字节方式读写文件

回顾 1

Page 3: 第  十  三  章

回顾 2对于 Unicode 编码的文件,使用 FileReader 类配合 BufferedReader 类读文件,使用 FileWriter 类配合 BufferedWriter 类写文件

要从控制台接受输入,需要将 System.in 对象进行包装,使用如下语句:InputStreamReader isr = new InputStreamRader(System.in);

BufferedReader br = new BufferedReader(isr);

使用 br.readLine()方法接受输入

Page 4: 第  十  三  章

本章目标了解 JDBC 的概念和必要性了解 JDBC 驱动程序类型理解 JDBC 程序的结构使用 JDBC 进行数据库编程

Page 5: 第  十  三  章

数据库访问技术简介当今企业级应用程序大部分采用了客户机 / 服务器( C/S )模式;

客户端机器需要与服务器进行通讯,要操作数据库中的数据,执行 SQL 语句以及检索查询结果;

在 Java 中实现这些活动的常用技术有 ODBC 和 JDBC 两种。

Page 6: 第  十  三  章

数据库编程示意图

客户机 / 服务器应用程序

客户机 / 服务器应用程序

数据库编程

ODBCODBC JDBCJDBC

数据库数据库

执行 SQL 语句

检索查询结果

Page 7: 第  十  三  章

关于 DBMSDBMS ( DataBase Management System )是指数据库管理系统;

目前 DBMS 的生产商众多,产品也不尽相同,如:Oracle 公司的 Oracle 系列;Microsoft 公司的 Access 系列和 SQL Server 系列;Microsoft 公司早期的 FoxPro ;IBM 公司的 DB2 ;Sybase 公司的 Sybase ;还有自由开源的 MySQL 等等。

这就意味着编程语言要针对不同的 DBMS 开发不同的应用程序,这将是一个非常枯燥的工作。

Page 8: 第  十  三  章

ODBCODBC ( Open DataBase Connectivity )是指开放式数据库连接,是由 Microsoft 公司提供的应用程序接口( API , Application Programming Interface );

它负责连接各种不同产商和类型的 DBMS ,然后为各种不同的编程语言提供查询、插入、修改和删除数据库的功能;

如同在各种不同的 DBMS 和各种不同的编程语言之间架设了一座通用的桥梁。

Page 9: 第  十  三  章

JDBCJDBC ( Java DataBase Connectivity )是由 Sun

Microsystem 公司提供的 API ;它为 Java 应用程序提供了一系列的类,使其能够快速高效地访问数据库;

这些功能是由一系列的类和对象来完成的,我们只需使用相关的对象,即可完成对数据库的操作。

Page 10: 第  十  三  章

JDBC 工作方式示意图

Java 程序 Java 程序

JDBC 驱动程序JDBC 驱动程序

数据库数据库

SQL 命令 结果

Page 11: 第  十  三  章

JDBC 驱动程序类型使用 JDBC 连接数据库可以通过不同的驱动实现,有 4 种驱动类型:JDBC-ODBC 桥驱动纯 Java 驱动本地 API 部分 Java 驱动JDBC 网络纯 Java 驱动

不论采用哪种驱动类型,在程序对数据库的操作方式基本相似,只是加载不同的驱动程序即可。

Page 12: 第  十  三  章

java.sql 包java.sql 包也是 Java 内置的包,其中包含了一组用于与数据库进行通信的类和接口;

如果要使用到这些类和接口的话,则必须显式地声明如下语句:import java.sql.*;

Page 13: 第  十  三  章

java.sql 包中的一些接口

接口名称 说 明

Connection 连接对象,用于连接数据库

Driver 用于创建连接( Connection )对象

Statement操作句柄,用于执行 SQL 语句,并将数据检索到结果集( ResultSet )中

PreparedStatement预编译操作句柄,用于执行预编译的 SQL 语句,执行效率比 Statement 稍高

CallableStatement 存储过程操作句柄,用于调用执行存储过程

ResultSet 结果集,包含执行 SQL 后返回的数据的集合

Page 14: 第  十  三  章

java.sql 包中的一些类

类 名 说 明

SQLException数据库异常类,是其它 JDBC异常类的根类,继承于 java.lang.Exception 类,绝大部分对数据进行操作的方法都有可能抛出该异常

DriverManager驱动程序管理类,用于加载和卸载各种驱动程序,并建立与数据库的连接

Date该类中包含有将 SQL日期格式转换成 Java日期格式的方法

TimeStamp 表示一个时间戳,能精确到纳秒

Page 15: 第  十  三  章

JDBC 程序访问数据库步骤开 始开 始 导入 java.sql 包 导入 java.sql 包

加载并注册驱动程序加载并注册驱动程序

创建 Connection 对象创建 Connection 对象 创建 Statement 对象创建 Statement 对象

执行 SQL 语句执行 SQL 语句关闭 ResultSet 对象关闭 ResultSet 对象

关闭 Statement 对象关闭 Statement 对象 关闭 Connection 对象关闭 Connection 对象

使用 ResultSet 对象使用 ResultSet 对象

建立数据源( ODBC ) 建立数据源( ODBC ) 附加相应产商提供的驱动 附加相应产商提供的驱动

结 束结 束

JDBC-ODBC 桥方式

纯 Java 驱动方式

Page 16: 第  十  三  章

步骤详解 1 :建立数据源这里以 JDBC-ODBC 桥驱动方式为例,逐步详细地讲解在 Java 程序中如何操作数据库,而对于其他驱动方式,只需更换驱动程序即可,其余不变;

首先建立 ODBC 数据源:【开始】→ 【设置】→ 【控制面板】→【管理工具】→【数据源( ODBC )】

新建数据源,名称可以任意,这里假设已建立了一个名为 myODBC 的数据源,连接到 SQL Server 2000 中的 pubs 数据库。

Page 17: 第  十  三  章

步骤详解 2 :加载驱动程序使用 Class.forName() 方法,将驱动程序的类加载到 JVM ( Java虚拟机, Java Virtual Machine )中;

对于使用 JDBC-ODBC 桥驱动方式,应该加载 sun.jdbc.odbc.JdbcOdbcDriver 类,如: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

如果指定的类不能成功加载,将会引发 ClassNotFoundException异常。

Page 18: 第  十  三  章

步骤详解 3 :创建连接对象 成功加载驱动程序后,必须使用 DriverManager 类的静态方法 getCon

nection() 来获得连接对象; 其函数原型:

Connection getConnection(String url, String user, String password);

该方法需要 3 个参数, url 是连接字符串,表示数据库的类型和名称,user 是登录数据库的用户名, password 是登录口令,并返回一个 Connection 对象,如果连接不成功,将抛出 SQLExcption异常;

对于使用 JDBC-ODBC 桥的连接方式,连接字符串的一般形式是:“ jdbc:odbc: 数据源名称”

如:Connection con = DriverManager.getConnection(“jdbc:odbc:MyODBC”, “sa”, “”);

Page 19: 第  十  三  章

步骤详解 4 :创建操作句柄一旦成功连接到数据库,获得连接对象后,必须通过连接对象创建操作句柄对象,才可以执行 SQL语句;

可以使用连接对象的 createStatement() 方法来创建操作句柄对象,其函数原型:statement createStatement();

如:Statement sta = con.createStatement();

如果创建失败,将抛出 SQLException异常。

Page 20: 第  十  三  章

步骤详解 5 :执行 SQL 语句使用操作句柄来执行 SQL 语句,有两种情况:一种是执行 DELETE 、 UPDATE 和 INSERT 之类的数据

库操作语句( DML ),这样的语句没有数据结果返回,使用 Statement 对象的 executeUpdate() 方法执行;

函数原型:int executeUpdate(String sql);

参数 sql 是要执行的 SQL 语句,执行成功返回受该语句影响的行数,否则抛出 SQLException异常

如:sta.executeUpdate("DELETE FROM [authors] WHERE [au_lname] = 'McBadden'")

Page 21: 第  十  三  章

步骤详解 5 :执行 SQL 语句(续)另一种是执行 SELECT 这样的数据查询语句( DQL ),

这样的语句将从数据库中获得所需的数据,使用 Statement对象的 executeQuery () 方法执行;

函数原型:ResultSet executQuery(String sql);

参数 sql 是要执行的查询语句,查询成功返回包含有结果数据的结果集对象,否则抛出 SQLException异常;

如:ResultSet rs = sta.executeQuery("SELECT * FROM [authors]");

Page 22: 第  十  三  章

步骤详解 6 :关闭资源当对数据库的操作结束后,应当将所有已经被打开的资源

关闭,否则将会造成资源泄漏;连接对象、操作句柄对象和结果集对象都有执行关闭的方

法 close() ;函数原型都是: void close();如:rs.close(); //关闭结果集sta.close(); //关闭操作句柄con.close(); //关闭数据库连接

有可能抛出 SQLException异常;请注意关闭的顺序,最后打开的资源最先关闭,最先打开

的资源最后关闭。

Page 23: 第  十  三  章

数据库操作示例import java.sql.*; //导入 java.sql包public class JDBCDemo { public static void main(String[] args) { String strCon = “jdbc:odbc:MyODBC”; //连接字符串 String strUser = “sa”; //数据库用户名 String strPwd = “”; //口令 System.out.println("正在连接数据库 ..."); try { //监控异常 Class.forName(“sun.jdbc.odbc.JdbcOdbcDriver”); //加载驱动程序 Connection con; //获得连接对象 con = DriverManager.getConnection(strCon, strUser, strPwd); System.out.println("成功连接到数据库。 "); Statement sta = con.createStatement(); //创建操作句柄 //执行 SQL语句 String strSql = "DELETE FROM [Friends] WHERE [Name] = '郑六 '"; int count = sta.executeUpdate(strSql); System.out.println("成功删除 " + count + "行数据。 "); sta.close(); con.close(); //关闭所有已经打开的资源 } catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } catch (SQLException sqle) { sqle.printStackTrace(); } }}

Page 24: 第  十  三  章

操作结果集使用 Statement 对象的 executeQuery() 方法成功执行 SELE

CT 语句后,将返回一个包含有结果数据的 ResultSet 对象,要从 ResultSet 对象中取得需要的数据,将使用到如下方法:

函数原型 说 明

boolean next()将结果集游标往下移动一行,如果已经到达结果集最后,将会返回 false

X getX(String columnName)获得某个字段的值, X 是指具体的数据类型,视数据库表中字段的具体情况而定,该方法有一组,并且每个都有两种重载方法,一种是以字段名称为参数,另一种是以字段索引为参数(字段索引从 1 开始)X getX(int columnIndex)

Page 25: 第  十  三  章

操作结果集示例try { String strCon = "jdbc:odbc:MyODBC"; System.out.println("正在连接数据库 ..."); Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); Connection con; con = DriverManager.getConnection(strCon, "sa", ""); System.out.println("成功连接到数据库。 "); Statement sta = con.createStatement(); ResultSet rs = sta.executeQuery("SELECT * FROM [Friends]"); System.out.println(“查询到的数据如下: "); while (rs.next()) { //循环将结果集游标往下移动,到达末尾返回 false //根据字段名称获得各个字段的值 System.out.print(rs.getString(“Name”) + “\t”); //获得字符串 System.out.print(rs.getString(“Address”) + “\t”); //获得字符串 System.out.print(rs.getInt(“Telephone”) + “\t”); //获得整数 System.out.print(rs.getDate(“HireDate”) + “\t”); //获得日期型数据 System.out.println(rs.getFloat(“Salary”)); //获得浮点型数据 } rs.close(); sta.close(); con.close();} catch (ClassNotFoundException cnfe) { cnfe.printStackTrace(); } catch (SQLException sqle) { sqle.printStackTrace(); }

Page 26: 第  十  三  章

PreparedStatement 接口 Statement 对象可以执行 SQL 语句,但如果要多次执行相

似的操作时,使用 PreparedStatement (预编译操作句柄)对象来执行,将会获得更高的执行效率;

PreparedStatement 对象适用于为特定的 SQL命令指定多个参数;

可以通过 Connection 对象的 prepareStatement() 方法创建预编译操作句柄对象,函数原型:PrepareStatement PrepareStatement(String sql);

参数 sql 是要执行的 SQL 语句,其中可以包含参数,该方法有可能抛出 SQLException异常;

PreparedStatement 对象会将 SQL 语句预先编译,这样将会获得更高的执行效率。

Page 27: 第  十  三  章

PreparedStatement 接口(续)包含在 PreparedStatement 对象中的 SQL 语句可以包含一

个或多个参数,使用问号 ? 作为占位符,如:PreparedStatement ps = con.prepareStatement("UPDATE [Friends] SET [Address] = ? WHERE [Name] = ?");

在执行之前,必须先设置每个 ?位置的参数值,使用 PreparedStatement 对象的 setX() 方法设置,这里的 X 是参数的数据类型,视具体情况而定,

设置好每个参数后,就可以调用 PreparedStatement 对象的 executeUpdate() 方法和 executeQuery() 方法执行 SQL语句了,这一点与 Statement 对象相似;

执行不成功将抛出 SQLException异常。

Page 28: 第  十  三  章

PreparedStatement 对象示例String strCon = "jdbc:odbc:MyODBC";System.out.println("正在连接数据库 ...");Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");Connection con;con = DriverManager.getConnection(strCon, "sa", "");System.out.println("成功连接到数据库。 ");

PreparedStatement ps;//使用带参数的 SQL语句创建 PreparedStatement对象ps = con.prepareStatement("UPDATE [Friends] SET [Address] =

? WHERE [Name] = ?");//设置 SQL语句中的参数值ps.setString(1, “长沙” );ps.setString(2, "王五 ");int count = ps.executeUpdate(); //执行命令

System.out.println("成功更新了 " + count + "行数据。 "); ps.close(); //关闭资源con.close();

Page 29: 第  十  三  章

纯 Java 驱动方式连接数据库使用 JDBC-ODBC 桥方式连接数据库,其性能完全取决于数据源( ODBC )的性能,并且无法脱离Microsoft 的平台,这样将带来不便;

大部分 DBMS 产商都为自己的产品开发了纯 Java的驱动程序,我们只需要加载相应的驱动,就可以直接连接到数据库,而无需通过 ODBC 桥接;

鉴于 DBMS 产品太多,这里只针对当今比较流行的 SQL Server 2000 和 Oracle 9i 进行介绍。

Page 30: 第  十  三  章

下载驱动程序包要使用纯 Java 驱动,首先必须获得数据库的驱动程序包;

根据数据库的种类,登录对应产商的官方网站,一般都可以免费获得;

下载后,复制到本地磁盘,并将完整路径设置到 classpath 环境变量中,如用开发工具开发程序,还需在开发环境中设置路径。

Page 31: 第  十  三  章

纯 Java 驱动连接 SQL Server使用纯 Java 驱动连接到 SQL Server 2000 数据库,加载驱

动程序应改成如下语句:Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”);

连接字符串应如下格式:"jdbc:microsoft:sqlserver:// 服务器名或 IP:1433;databaseName= 数据库名 "

如:Connection con = DriverManager.getConnection("jdbc:microsoft:sqlserver://127.0.0.1:1433;databaseName=pubs", "sa", "");

Page 32: 第  十  三  章

纯 Java 驱动连接 Oracle使用纯 Java 驱动连接到 Oracle 9i 数据库,加载驱动程序

应改成如下语句:

Class.forName("oracle.jdbc.driver.OracleDriver");

连接字符串应如下格式:"jdbc:oracle:thin:@ 服务名或 IP:1521: 数据库名 "

如:Connection con = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521:NEWER", "scott", "tiger");

Page 33: 第  十  三  章

总结JDBC 是使用 Java 程序操作数据库的技术使用 Class.forName() 方法可以将驱动程序加载到 Java 解释器中

使用 DriverManager 类的 getConnection() 方法和 Connection 对象的 createStatement() 方法可建立连接

使用 executeQuery() 或 executeUpdate() 方法通过 Statement 实例构建并执行 SQL 语句

PreparedStatement 接口允许创建预编译的 SQL 语句,并使得在后续阶段可以指定语句的参数