Java 技术与应用 数据库应用 ( 第 14 章 ) 西安交大 卫颜俊 2008 年 12 月 电子信箱: QQ: 网站 : /java
2 /40 主要内容 ☻ 关系数据库基础知识 ☻SQL 基本语法 ☻ODBC 概述 ☻JDBC 体系与 JDBC 编程模式 ☻JDBC 常用类与接口介绍 ☻ 表的访问 ☻ 带参数的 SQL 语句 ☻ 案例中的数据库设计 ♂
3 /40 关系数据库基础知识 ☻数☻数据库技术大约产生于上个世纪六七十年代 ☻它☻它解决了困扰多年的数据共享性、安全性和 完整性等问题 ☻数☻数据库是通用的和综合性的有序数据集合, 其数据的结构化程度高,能够为各类用户提 供数据共享而同时又具有最小的冗余度,保 证数据与应用程序高度的独立性,支持多个 用户同时并发地访问,具有及时而有效地处 理数据并保证数据的安全性和完整性等功能。 ♂
4 /40 ☻ 关系数据库是数据库的一种,它采用关系模型来描述实体及 实体间的联系。关系模型使用类似于二维表格的方式描述其 中的关系,其中,关系中的行称为记录(或元组),列称为 字段(或属性),属性的取值范围称为域,所有属性名称构 成的集合就组成了整个关系。 ☻ 一个关系数据库系统一般包括硬件、软件、人、数据库和数 据库管理系统 ☻ 目前流行的关系数据库管理系统有: MySQL 、 Foxpro 、 Access 、 Oracle 、 DB2 、 Informix 、 Sybase 和 SQL Server 等。 ☻Oracle 同时也是对象关系数据库管理系统 ☻ 而新型的面向对象数据库管理系统也已经出现,像 Borland 公司的 JDataStore 、开源软件 HSQL 和 H2SQL 等都是,它们 不但对 Java 语言有很好的支持,并且本身也是使用 Java 语言 编写的。 ♂
5 /40 ☻ 设计一个数据库应用系统需要完全按照软件 工程的设计思想来进行,从用户需求分析, 到概念设计、逻辑设计和物理设计,最后完 成数据库的实施和维护等。 ☻ 通常在对实际问题进行分析之后,首先使用 E-R 图(实体与联系图)来表示其概念设计 的结果,然后据此再进行数据库的逻辑设计 和物理设计。 ♂
6 /40 【例 14-1 】建立选课数据库 算法简述: ☺ 一个学生可以选修多门课程,实体 “ 学生(学 号、姓名和班级) ” ,实体 “ 课程(课号,课名, 主讲,学分) ” , ☺ 为了表达 “ 学生 ” 与 “ 课程 ” 之间的选修关系,需 要再增加一个实体 “ 选修(学号,课程,分 数) ” 。 ♂
7 /40 学生与课程的 E-R 图 ♂
8 /40 SQL 语句 CREATE TABLE 学生 ( 学号 int, 姓名 varchar(10), 班级 varchar(10) ); CREATE TABLE 选修 ( 学号 int, 课号 int, 分数 float ); CREATE TABLE 课程 ( 课号 int, 课名 varchar(20), 主讲 varchar(10), 学分 float ); ♂
9 /40 选课数据库表之间的关系 ♂
10 /40 SQL 基本语法 ☻SQL ,即结构化查询语言( Structured Query Language ),是目前关系数据库的 标准化语言,制订于 1974 年,目前已由 ANSI 颁布为 SQL-92 标准 ☻SQL 语句分 3 类共 9 个关键词: ☺ 其中 DDL (数据定义语言)有 3 种: Create 、 Alter 和 Drop , ☺DML (数据操纵语言) 有 4 种: Insert 、 Update 、 Delete 和 Select , ☺DCL (数据控制语言)有 2 种: Grant 和 Revoke 。 ♂
11 /40 常用数据类型 ☻CHAR(n) 定长字符串型 ☻VARCHAR(n) 可变长字符串型 ☻INT 整数型 ☻FLOAT 浮点型 ☻DATETIME 日期时间型 ♂
12 /40 运算符 ☻ 算术运算符:+(加)、-(减)、*(乘)和/(除) ☻ 逻辑运算符:=(等于)、 > (大于)、 >= (大于等于)、 (不等于) ☻ 连接运算符: AND (与)、 OR (或)和 NOT (非) ☻SQL 条件运算符: BETWEEN … AND … (在 … 之内)、 IN (在某集合中)、 LIKE('%' 匹配任何长度, '_' 匹配一 个字符 ) (符号匹配)和 IS NULL (空值判断) ☻ 子查询条件运算符: ANY (任何)、 ALL (所有)和 EXISTS (存在) ☻ 集合查询运算符: UNION (并)、 INTERSECT (交)、 MINUS (差) ♂
13 /40 函数 ☻abs 数值表达式的绝对值。 ☻ceil 大于等于给定数值表达式的最小整数。 ☻floor 小于或等于给定数值表达式的最大整数。 ☻sin 、 sinh 、 cos 、 cosh 、 tan 、 tanh 分别为正弦、反正弦、余弦、反余 弦、正切和反正切三角函数。 ☻log 自然对数。 ☻exp 表达式的自然底数的指数值。 ☻power 表达式指定乘幂的值。 ☻sqrt 表达式的平方根。 ☻sign 表达式之正 (+1) 、零 (0) 或负 (-1) 号。 ☻count 选取的结果集中行的数目。 ☻sum 所有值的总和。 ☻avg 选取的结果集中值的平均值。 ☻max 选取的结果集中值的最大值。 ☻min 选取的结果集中值的最小值。 ♂
14 /40 举例 ☻1. 建立数据库: CREATE DATABASE database_name ☻2. 移除数据库: DROP DATABASE database_name ☻3. 表的建立: CREATE TABLE table_name( column_name1 data_type1, column_name2 data_type2, ) ♂
15 /40 ☻4. 表的修改: 增加表的字段: ALTER TABLE table_name ADD column_name datatype ☻5. 表的删除: DROP TABLE table_name ☻6. 建立视图: CREATE VIEW view1 AS subquery ☻7. 删除视图: DROP VIEW view1 ♂
16 /40 ☻8. 表或视图的数据查询: SELECT select_list [ INTO new_table ] FROM table_source [ WHERE search_condition1 ] [ GROUP BY group_by_expression ] [ HAVING search_condition2] [ ORDER BY order_expression [ ASC | DESC ] ] ♂
17 /40 ☻9. 对表或视图增加数据: 插入一行数据: INSERT INTO table_name VALUES (value1, value2,....) 对指定的字段插入一行数据: INSERT INTO table_name (column1, column2,...) VALUES (value1, value2,....) ☻10. 修改表或视图的数据: UPDATE table_name SET column_name = new_value, …… WHERE column_name = some_value ♂
18 /40 ☻11. 删除数据表或视图的数据: DELETE FROM table_name WHERE column_name = some_value ☻12. 授予权限: GRANT system_priv TO user ☻13. 回收权限: REVOKE systen_priv FROM user ♂
19 /40 【例 14-2 】 题目: 在选课数据库中增加 3 门课程信息、 5 名学生信息, 第 1 名学生选了全部 3 门课程,第 2 名学生选了 第 1 和 2 门课程,第 3 名学生选了第 2 和 3 门课程, 第 4 名学生选了第 1 门课程,第 5 名学生还未选 任何课程;并完成以下 7 种查询: ♂
20 /40 ☻1. 查询全部学生信息; ☻2. 选课学生人次; ☻3. 选课完整信息清单; ☻4. 已选 3 门课程的学生学号清单; ☻5. 已选 “ Java 技术与应用 ” 课程的学生学号 名单; ☻6. 各课程选课人次一览表; ☻7. 还未选任何课程的学生学号名单。 ♂
21 /40 ODBC 概述 ☻ODBC ,即开放数据库互连( Open DataBase Connectivity ) ☻ 是微软公司 WOSA ,即开放服务结构 ( Windows Open Services Architecture )中 的一组数据库规范 ☻ 提供了对数据库访问的标准 API 。 ♂
22 /40 ☻SQL 语言在 ODBC 中起了至关重要的作用, 而且 ODBC 本身也提供了对 SQL 语言的支持 ☻ 一个基于 ODBC 的应用程序对数据库的操 作不依赖于任何数据库管理系统,只需要将 SQL 语句命令发送给 ODBC ☻ 所有的数据库操作均由对应的 ODBC 驱动 程序完成,从而完成对数据库的访问。 ♂
23 /40 一个完整的 ODBC 的组成部分 ☻ ⑴ 应用程序 (Application) 。使用 ODBC 接口函数编写的数据库应 用程序。 ☻ ⑵ ODBC 管理器。位于 Windows 操作系统的控制面板中的 “ 数据 源( ODBC ) ” 内,主要任务是管理和安装 ODBC 驱动程序和数 据源。 ☻ ⑶ 驱动程序管理器。包含在 ODBC32.DLL 中,对用户是透明的。 其任务是管理 ODBC 驱动程序,是 ODBC 中最重要的部分。 ☻ ⑷ ODBC API 。 ODBC 接口函数库。 ☻ ⑸ ODBC 驱动程序。是一些 DLL ,提供了 ODBC 和数据库之间 的接口。 ☻ ⑹ 数据源。包含了数据库位置和 ODBC 驱动程序类型等信息, 是一种数据连接的抽象。 ♂
24 /40 JDBC 体系与 JDBC 编程模式 ☻JDBC ,即 Java 数据库连接( Java Database Connectivity ) ☻ 是一种用于执行 SQL 语句的、通用的 Java 数据库访问底层接口( Java API ),目前版 本为 3.0 ☻ 用于使用 100% 纯 Java 来编写数据库应用程 序。 ☻ 由一组用 Java 语言编写的类和接口组成 ♂
25 /40 JDBC 体系与 JDBC 编程模式 JDBC 统一了访问各种数据库的接口 ☺ 不管所使用的数据库管理系统是什么类型,只 要向其发送 SQL 语句就可以完成对数据库的访 问 ☺ 并且只需写一个程序就能够实现跨数据库和跨 平台的性能。 ♂
26 /40 JDBC-ODBC 桥 ☻ 由于 ODBC 已经被广泛地使用在传统的管 理信息系统中, JDBC 可以建立在 ODBC 的 基础上, JDBC-ODBC 桥是一个 JDBC 驱动 程序,其作用就是将 JDBC 操作转换为 ODBC 操作以实现 JDBC 任务。 ☻JDK 中的 “ sun.jdbc.odbc ” 包,提供了用来 访问 ODBC 的本地库,它无须特殊配置就可 使用,其中 “ sun.jdbc.JdbcOdbcDriver ” 为 桥驱动程序类。 ♂
27 /40 使用 JDBC-ODBC 桥时,首先用 Java 类加载器 将桥驱动程序类加载,加载时, ODBC 驱动 程序(与所有 JDBC 驱动程序一样)将创建 自己的实例,同时在 JDBC 驱动程序中进行 注册。 加载形式如下: Class.forName("sun.jdbc.odbc.JdbcOdbcDriver" ); ♂
28 /40 JDBC-ODBC 桥所处的层次 ♂
29 /40 JDBC URL ☻JDBC URL 提供了一种在 JDBC 程序中标识 数据库的方法,由相应的驱动程序使用来 识别该数据库并与之建立连接。 ☻JDBC URL 的语法格式如下: jdbc: : ☻ODBC 子协议的 URL 形式如下: jdbc:odbc: [; = ] [, … ] ♂
30 /40 举例 ☻jdbc:odbc:xkdb ☻jdbc:odbc:myoracle; UID=david; PWD=1234 ☻jdbc:odbc:myjdatastore; Cachesize=300 ♂
31 /40 编写数据库应用程序的步骤 ☻1. 安装 JDK ,已经包含 JDBC API 包,或安 装特殊的 JDBC 驱动程序包,比如: Oracle 的 class12.zip 、 DB2 的 db2jdbc.zip 等 ☻2. 安装 JDBC-ODBC 桥和驱动程序,已经包 含在 JDK 中 ☻3. 安装数据库管理系统和数据库 ☻4. 在控制面板的 “ 数据源( ODBC ) ” 中建 立 ODBC 数据源 ☻5. 引入 java.sql 包: import java.sql.*; ♂
32 /40 编写数据库应用程序的步骤 ☻6. 加载数据库驱动程序: Class.forName( “ sun.jdbc.odbc.JdbcOdbcDriver ” ); ☻7. 建立连接: Connection con=DriverManager.getConnection( "jdbc:odbc:xkdb"); ☻8. 执行 SQL 句: Statement stmt=con.createStatement; ResultSet rs=stmt.execQuery("select * from 学生 "); 或 stmt.execute("INSERT INTO 学生 VALUES( , ' 张一 ', ' 管理 52 ')"); ♂
33 /40 编写数据库应用程序的步骤 ☻9. 取得查询结果或完成增删改操作: rs.getString(i));// 取得第 i 个字段的值 rs.next();// 定位下一记录。 ☻10. 关闭结果集、语句和连接: rs.close(); stmt.close(); con.close(); ☻11. 例外处理: SQLException ♂
34 /40 JDBC 常用类与接口介绍 1. 类 DriverManager 2. 接口 Connection 3. 接口 DatabaseMetaData 4. 接口 Statement 5. 接口 PreparedStatement 6. 接口 ResultSet ♂
35 /40 表的访问 ☻ 表或视图数据的查询 ☺ 【例 14-3 】查询学生信息 算法简述: 本程序使用可视化界面,完成 SQL 查询语句的输入、 执行和查询结果的显示。在窗口中主要放置一个 JTextArea 组件完成 SQL 查询语句的输入、一个 JTextArea 组件显示 SQL 查询语句的执行状态,一个 JTable 组件显示 SQL 查询语句的执行结果,以及一 个 JButton 按钮执行 SQL 查询语句。 ♂
36 /40 表的访问 ☻ 表数据的增删改和表结构的增删改 ☺ 【例 14-4 】学生信息的增删改。要求完成以下 处理: 1. 增加一门新课:课号: 4 ,课名: C++Builder 可视 化程序设计,主讲:卫老师,学分: 3 ; 2. 增加一名新同学:学号: ,姓名:陈玫, 班级:人力 31 ; 3. 这名新同学选修了这门新课:学号: ,课 号: 4 ; 4. 将学号为 的同学的班级改为工设 42 ; 5. 删除学号为 的同学所选的第 1 号课程。 ♂
37 /40 表的访问 ☻ 算法简述: ☺ 本程序使用可视化界面,完成 DDL SQL 语句的 输入和执行,在窗口中主要放置一个 JTextArea 组件完成 DDL SQL 语句的输入、一个 JTextArea 组件显示 DDL SQL 语句的执行状态, 以及一个 JButton 按钮执行 DDL SQL 语句。 ♂
38 /40 带参数的 SQL 语句 ☻ 【例 14-5 】在选课完整信息清单中进一步查询分数在 m 和 n 之间的学生,其中 m 和 n 的值由组件输入。 算法简述: 将例 17-2 的选课完整信息清单对应的 SQL 查询语句设计为 Access 中的一个视图 “ 查询 3 ” 使用 PreparedStatement 接口代替 Statement 接口,通过两 次调用 PreparedStatement 接口的 setInt 方法传递两个参 数 m 和 n ;并使用两个 JTextField 组件分别完成 m 和 n 值 的输入。 SQL 语句代码: SELECT * FROM 查询 3 WHERE 分数 >=? AND 分数 <=? ♂
39 /40 案例中的数据库设计 ♂