《 java 面向对象程序设计 》 第14章

24
2010-1-10 1 Java 面面面面面面面面面 14 面 配配 < Java 面面面面面面面面 > 面面面面面 面面面 Power point 配配 配配配 配配配 JDBC 配配配配配

Upload: aline-williams

Post on 01-Jan-2016

219 views

Category:

Documents


0 download

DESCRIPTION

《 Java 面向对象程序设计 》 第14章. JDBC 数据库操作. 配合< Java 面向对象程序设计 > 例子源代码一起使用. Power point 制作:耿祥义 张跃平. 导读. 主要内容 JDBC 连接数据库 查询操作 更新、添加与删除操作 查询 Excel 电子表格 使用预处理语句 事务 难点 使用预处理语句 事务. 本章将学习怎样使用 Java 提供的 JDBC 技术操作数据库 。. 建立一个名字为 factory 的数据库。操作步骤如下: - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 《 Java 面向对象程序设计 》 第14章

2010-1-101

《 Java 面向对象程序设计》第 14 章

配合 < Java 面向对象程序设计 > 例子源代码一起使用

Power point 制作:耿祥义 张跃平

JDBC 数据库操作

Page 2: 《 Java 面向对象程序设计 》 第14章

2010-1-102

主要内容• JDBC• 连接数据库• 查询操作• 更新、添加与删除操作• 查询 Excel 电子表格• 使用预处理语句• 事务难点• 使用预处理语句• 事务

导读

本章将学习怎样使用 Java 提供的 JDBC 技术操作数据库 。

Page 3: 《 Java 面向对象程序设计 》 第14章

2010-1-103

§14.1 Microsoft Access 数据库管理系统

§14.1.1 建立数据库 建 立 一 个 名 字 为factory 的数据库。操作步骤如下: 单击“开始”→“所有 程序 ” → “ Microsoft Access” ,在新建数据库 界 面 选 择 “ 空Access 数 据 库 ” , 然后命名、保存新建的数据库,在这里我们命名的数据库是 factory ,保存在 C:\chapter14中。

Page 4: 《 Java 面向对象程序设计 》 第14章

2010-1-104

§14.1.2 创建表

在 factory 管理的“表”的界面上选择“使用设计器创建表”,然后单击界面上的“设计”菜单,将出现相应的建表界面,我们建立的表是 employee ,该表的字段(属性)为: number( 文本 ) name( 文本 ) birthday( 日期 ) salary

( 数字 , 双精度 ) 。其中,“ number”字段为主键 。 在 factory 管理的“表”的界面上,用鼠标双击已创建的表可以为该表添加记录。

Page 5: 《 Java 面向对象程序设计 》 第14章

2010-1-105

§14.2 JDBC

JDBC ( Java DataBase Connection )是 Java 数据库连接API 。简单地说, JDBC 能完成 3 件事: 与一个数据库建立连接。 向数据库发送 SQL 语句。 处理数据库返回的结果。

Page 6: 《 Java 面向对象程序设计 》 第14章

2010-1-106

§14.3 连接数据库

§14.3.1 连接方式的选择 和数据库建立连接的常用两种方式是:建立 JDBC─ODBC 桥接器和加载纯 Java 数据库驱动程序。使用 JDBC─ODBC 桥接器方式的机制是,应用程序只需建立 JDBC 和 ODBC 之间的连接,即 所 谓 的 建 立 JDBC─ODBC 桥 接 器 , 而 和 数 据 库 的 连 接 由ODBC 去完成。

使用 JDBC─ODBC 桥接器连接数据库的 3 个步骤建立 JDBC-ODBC 桥接器建 ODBC 数据源和 ODBC 数据源建立连接

Page 7: 《 Java 面向对象程序设计 》 第14章

2010-1-107

§14.3.2 建立 JDBC-ODBC 桥接器

JDBC 使 用 java.lang 包 中 的 Class 类 建 立 JDBC-ODBC 桥接器。建立桥接器时可能发生异常,必须捕获这个异常,建立桥接器的代码是:try{ Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");}catch(ClassNotFoundException e) { System.out.println(e);}

Page 8: 《 Java 面向对象程序设计 》 第14章

2010-1-108

§14.3.3 ODBC 数据源

1 .创建、修改或删除数据源 选择“控制面板”→“管理工具”→“ ODBC 数据源”(某些 window/xp 系统,需选择“控制面板”→“性能和维护”→“管理工具”→“ ODBC 数据源”)。 双击 ODBC 数据源图标,出现的界面显示了用户已有的数据源的名称。选择“系统 DSN” 或“用户 DSN” ,单击“添加”按钮,可以创建新的数据源;单击“配置”按钮,可以重新配置已有的数据源;单击“删除”按钮,可以删除已有的数据源。2 .为数据源选择驱动程序 因 为 要 访 问 Access 数 据 库 , 选 择 Microsoft Acess Driver ( *.mdb )。3 .数据源名称及对应数据库的所在位置 在名称栏里为数据源起一个自己喜欢的名字,这里我们起的名字是 star 。这个数据源就是指某个数据库。在“数据库选择”栏中 选 择 一 个 数 据 库 , 这 里 我 们 选 择 的 是 C:\chapter14 下 的factory.mdb 数据库。

Page 9: 《 Java 面向对象程序设计 》 第14章

2010-1-109

§14.3.4 建立连接

编写连接数据库代码不会出现数据库的名称,只能出现数据源的名字。 首先使用 java.sql 包中的 Connection 类声明一个对象,然后再使用类 DriverManager 调用它的静态方法 getConnection 创建这个连接对象,建立连接时应捕获 SQLException 异常 :try{ Connection con=DriverManager.getConnection(“jdbc:odbc: 数据源名字” ,

"login name",

" password ");

}

catch(SQLException e){}

例题 14-1

Page 10: 《 Java 面向对象程序设计 》 第14章

2010-1-1010

§14.4 查询操作 对一个数据库中表进行查询操作的具体步骤如下。 1 .向数据库发送 SQL 查询语句 try{ Statement sql=con.createStatement();} catch(SQLException e ){} 2 .处理查询结果 ResultSet rs=sql.executeQuery("SELECT * FROM employee");

表 14.1 给了出了 ResultSet 对象的若干方法。

Page 11: 《 Java 面向对象程序设计 》 第14章

2010-1-1011

§14.4.1 顺序查询

通过使用 JDBC 提供的 API ,可以在查询之前知道表中的字段的个数和名字,步骤如下: 1. 连 接 对 象 con 调 用 getMetaData() 方 法 可 以 返 回 一 个DatabaseMetaData 对象,例如: DatabaseMetaData metadata=con.getMetaData(); 2. Metadata 对象再调用 getColumns 可以将表的字段信息以行列的形式存储在一个 ResultSet 对象中,例如: ResultSet tableMessage=metadata.getColumns(null,null,"employee",null); 3. tableMessage 对象调用 next 方法使游标向下移动一行(游标的初始位置在第 1 行之前),然后 tableMessage 调用 getXXX 方法可以查看该行中列的信息,其中最重要的信息是第 4 列,该列上的信息为字段的名字。 例题 14-2

Page 12: 《 Java 面向对象程序设计 》 第14章

2010-1-1012

§14.4.2 随机查询 需要在结果集中前后移动、显示结果集指定的一条记录或随机显示若干条记录等。这时,必须要返回一个可滚动的结果集。为了 得 到 一 个 可 滚 动 的 结 果 集 , 需 使 用 下 述 方 法 先 获 得 一 个Statement 对象:Statement stmt=con.createStatement(int type ,int concurrency); 然后,根据参数的 type 、 concurrency 的取值情况, stmt返回相应类型的结果集: ResultSet re=stmt.executeQuery(SQL 语句 );滚动查询经常用到 ResultSet 的下述方法:public boolean previous() :将游标向上移动public void beforeFirst() :将游标移动到结果集的初始位置。public void afterLast() :将游标移到结果集最后一行之后。public void first() :将游标移到结果集的第一行。public void last() :将游标移到结果集的最后一行。public boolean isAfterLast() :判断游标是否在最后一行之后。public boolean isBeforeFirst() :判断游标是否在第一行之前public boolean ifFirst() :判断游标是否指向结果集的第一行。public boolean isLast() :判断游标是否指向结果集的最后一行。public int getRow() :得到当前游标所指行的行号 .0public boolean absolute(int row) :将游标移到参数 row 指定的行号。例题 14-3

Page 13: 《 Java 面向对象程序设计 》 第14章

2010-1-1013

§14.4.3 条件查询

在 下 面 的 例 子 4 中 QueryByNumber 和QueryBySalary 是例子 2 中 Query 类的子类,二者分别能按雇员号和薪水查询记录。主类将查询条件传递QueryByNumber 和 QueryBySalary 类的实例。例题 14-3

Page 14: 《 Java 面向对象程序设计 》 第14章

2010-1-1014

§14.4.4 排序查询

可以在 SQL 语句中使用 ORDER BY 子语句,对记录排序 。 按薪水排序查询的 SQL 语句:SELECT * FROM employee ORDER BY salary 例题 14-5

Page 15: 《 Java 面向对象程序设计 》 第14章

2010-1-1015

§14.4.5 模糊查询

可以用 SQL 语句操作符 LIKE 进行模式般配,使用“ %” 代替 0 个或多个字符,用一个下划线“ _” 代替 1 个字符。下述语句查询姓氏是“张”或“李”的记录: rs=sql.executeQuery(“SELECT * FROM students WHERE 姓名 LIKE ‘[张李 ]%’ ”);

例题 14-6

Page 16: 《 Java 面向对象程序设计 》 第14章

2010-1-1016

§14.5 更新、添加与删除操作 Statement 对象调用方法: public int executeUpdate ( String sqlStatement ) ; 通过参数 sqlStatement 指定的方式实现对数据库表中记录的更新、添加和删除操作。 更新、添加和删除记录的 SQL 语法分别是:

◆ UPDATE < 表名 > SET < 字段名 > = 新值 WHERE < 条件子句 >◆ INSERT INTO 表 ( 字段列表 ) VALUES (对应的具体的记录)或 INSERT INTO 表 (VALUES (对应的具体的记录)◆ DELETE FROM < 表名 > WHERE < 条件子句 >

例题 14-7

Page 17: 《 Java 面向对象程序设计 》 第14章

2010-1-1017

§14.6 查询 Excel 电子表格 访问 Exel 电子表格和访问其它的数据库有所不同,假设有电子表格 Goods.xls ,见图 14.17。连接 Excel 电子表格的步骤如下。1 .设置表 必须在电子表格中选出一工作区作为连接时使用的表。2 .设置数据源 为 数 据 源 选 择 的 驱 动 程 序 必 须 是 : Microsoft Excel Driver 。例题 14-8

Page 18: 《 Java 面向对象程序设计 》 第14章

2010-1-1018

§14.7 使用预处理语句

Java 提供了更高效率的数据库操作机制,就是 PreparedStatement 对象,该对象被习惯地称作预处理语句对象。

Page 19: 《 Java 面向对象程序设计 》 第14章

2010-1-1019

§14.7.1 预处理语句优点

预处理不仅减轻了数据库的负担,而且也提高了访问数据库的速度。 对于 JDBC ,如果使用 Connection 和某个数据库建立了连接对象 con, 那么 con 就可以调用 prepareStatement(String sql) 方法对参数 sql 指定的 SQL 语句进行预编译处理 , 生成该数据库地层的内部命令 , 并将该命令封装在 PreparedStatement 对象中 ,那么该对象调用下列方法都可以使得该地层内部命令被数据库执行 ResultSet executeQuery() ;boolean execute(); int executeUpdate(); 只要编译好了 PreparedStatement 对象,那么该对象可以随时地执行上述方法,显然提高了访问数据库的速度。 例题 14-9

Page 20: 《 Java 面向对象程序设计 》 第14章

2010-1-1020

§14.7.2 使用统配符 在对 SQL 进行预处理时可以使用统配符“?”来代替字段的值,只要在预处理语句执行之前再设置统配符所表示的具体值即可。例如:sql=con.prepareStatement("SELECT * FROM employee WHERE salary < ? ");

那么在 sql 对象执行之前,必须调用相应的方法设置统配符“?”代表的具体值,比如: sql.setFloat(1,2389);

指定上述预处理 SQL 语句中统配符“?”代表的值是 2389 预处理语句设置统配符“?”的值的常用方法有: void setDate(int parameterIndex,Date x) void setDouble(int parameterIndex,double x) void setFloat(int parameterIndex,float x) void setInt(int parameterIndex,int x) void setLong(int parameterIndex,long x)

void setString(int parameterIndex,String x) 例题 14-10

Page 21: 《 Java 面向对象程序设计 》 第14章

2010-1-1021

§14.8 事务 §14.8.1 事务及处理

事务由一组 SQL 语句组成,所谓事务处理是指:应用程序保证事务中的 SQL 语句要么全部都执行,要么一个都不执行。 事务处理是保证数据库中数据完整性与一致性的重要机制。

Page 22: 《 Java 面向对象程序设计 》 第14章

2010-1-1022

§14.8.2 JDBC 事务处理步骤 1 .使用 setAutoCommit(boolean autoCommit) 方法 和数据库建立一个连接对象后,比如 con 。那么 con 的提交模式是自动提交模式 , 为了能进行事务处理,必须关闭 con 的这个默认设置。 con.setAutoCommit(false); 2 .使用 commit() 方法 连接对象 con 调用 commit() 方法就是让事务中的 SQL 语句全部生效。 3 .使用 rollback() 方法 con 调用 rollback() 方法的作用是撤消事务中成功执行过的SQL 语句对数据库数据所做的更新、插入或删除操作,即撤消引起数据发生变化的 SQL 语句操作,将数据库中的数据恢复到commi() 方法执行之前的状态。

例题 14-11

Page 23: 《 Java 面向对象程序设计 》 第14章

2010-1-1023

§14.9 CachedRowSetImpl 类

com.sun.rowset 包提供了 CachedRowSetImpl类 , 该 类 实 现 了 CachedRowSet 接口。 CachedRowSetImpl 对象可以保存 ResultSet对象中的数据,而且 CachedRowSetImpl 对象不依赖 Connnection 对象,这意味着一旦把 ResultSet对象中的数据保存到 CachedRowSetImpl 对象中后,就可以关闭和数据库的连接。 将 ResultSet 对 象 rs 中 的 数 据 保 存 到CachedRowSetImpl 对象 rowSet 中的代码如下:rowSet.populate(rs); 例题 14-12

Page 24: 《 Java 面向对象程序设计 》 第14章

2010-1-1024

§14. 10 小结 1 . JDBC 技术在数据库开发中占有很重要的地位, JDBC 操作不同的数据库仅仅是连接方式上的差异而已,使用 JDBC 的应用程序一旦和数据库建立连接,就可以使用 JDBC 提供的 API 操作数据库。2 . JDBC 和数据库建立连接有两种常用方式:建立 JDBC─ODBC 桥接器和加载纯 Java 数据库驱动程序,无论使用哪种方式连接数据库,都不会影响操作数据库的逻辑代码。3 .当查询 ResultSet 对象中的数据时,不可以关闭和数据库的连接,除非使用 CachedRowSetImpl 类,使用 CachedRowSetImpl 类可以节约数据库的连接数目。4 .使用 PreparedStatement 对象可以提高操作数据库的效率。