第十章 Java 数据库编程
内容提要 数据库有关概念; 介绍 JDBC 的结构; 重点介绍 JDBC 访问几种数据库的基本过程;
数据库应用开发简介 作为有效的数据存储和组织管理工具, 数据库的应用日益广泛 目前主流的数据库产品有 Oracle 、 SQL Server 、 DB2 和 SyBase 等多种。 在数据库开发领域中,有三个方面需要 掌握: SQL 语言、 ODBC 数据访问接口和 JDBC 数据库访问接口。
SQL 语言 SQL ( Structured Query Language )是使用关系模型 的数据库语言,用于和各类数据库连接,提供通用的 数据管理和查询功能。 SQL 语言最初由 IBM 公司开发, 实现了关系数据库中的信息检索。后几经修改和完善, 被国际标准化组织确定为国际标准,目前执行的是 1992 年制定的 SQL-92 标准。 SQL 可以为各种支持 SQL-92 标准的数据库管理系统 ( DBMS )所接受和处理,通常各种 DBMS 都提供图形 用户界面,以使用户直接对数据库进行操作。但 SQL 语 言本身并不是完整的编程语言,还需要与其他高级编 程语言配合,才能实现应用程序对数据库的访问操作。
ODBC 数据访问接口 开放式数据库互连 ODBC ( Open DataBase Connectivity )是微软公 司开发的一套开发数据 库系统应用程序接口规 范,它支持应用程序以 标准的 ODBC 函数和 SQL 语句操作各种不同的数 据库。
ODBC 数据访问接口 四个组成部分: 应用程序 (Application) ODBC 管理器 (ODBC manager) ODBC 驱动程序 (ODBC Drivers) 数据源 (DataSources ,数据库 ) Application ODBC managerODBC Drivers DataSources
JDBC 数据访问接口 为支持 Java 程序的数据 库操作功能, Java 语言 采用了专门 Java 数据库 编程接口( JDBC , Java DataBase Connectivity ),用于在 Java 程序中实现数据库 操作功能并简化操作过 程。 JDBC 支持基本 SQL 语句,提供多样化的数 据库连接方式,为各种 不同的数据库提供统一 的操作界面
JDBC 数据访问接口 简单地分, JDBC 有两部分组成: JDBC API 和 JDBC Driver Interface. JDBC API 就是提供给 “ 客户 ” 的一组独立于数据库的 API ,对任何数据库的操作,都可以用这组 API 来进 行. JDBC Driver Interface 是面向 JDBC 驱动程序开发 商的编程接口, 把通用的 API 翻译成特定数据库能懂 的 “ 指令 ” ,它会把我们通过 JDBC API 发给数据库 的通用指令翻译给他们自己的数据库.
SQL 语言概述 SQL ( Structured Query Language )是关系型数据库 的标准语言,是由国际标准组织提出的,各种关系型 数据库都支持 SQL 指令, Oracle 在基本的 SQL 基础上进 行了扩充。 SQL 语句有如下的两大特点 ( 1 ) SQL 是一种类似于英语的语言,很容易理解和书写。 ( 2 ) SQL 语言是非过程化的语言(第四代语言)。 SQL 集 DDL ( Data Definition Language :数据定义语言), DML ( Data Manipulation Language :数据操作语言)和 DCL ( Data Control Language :数据控制语言)于一体。用 SQL 语言可以 实现数据库生命周期的全部活动。
基本 SQL 语句 基本的 SQL 语句包括 DQL 和 DML 。也就是 对数据库最常用的四大基本操作:查询 ( Select )、插入( Insert )、更新 ( Update )和删除( Delete )
DQL 的 3 种基本格式 1. 基本句型一:(最简单的 SELECT 语句) SELECT 字段名 FROM 数据表 例 1. SELECT * FROM grade 功能说明:将 grade 表中的所有字段取出来。 例 2. SELECT 学号, 姓名 FROM grade 功能说明:将 grade 表中学号和姓名字段取出来。 例 3. SELECT 学号, 姓名, 语文 + 数学 + 英语 as 总成绩 FROM grade 功能说明:将 grade 表中的学号和姓名取出来,并将语 文、数学和英语成绩相加产生虚拟列总成绩。
2. 基本句型二:使用条件查询 SELECT 字段名 FROM 数据表 WHERE 筛选条件 测试句型如下。 例 1. SELECT * FROM grade WHERE 数学 >60 功能说明:把所有数学成绩大于 60 分的记录选出来。 例 2. SELECT * FROM grade WHERE 数学 =300 or 语文 =300 功能说明:把数学成绩等于 300 分或者语文成绩等于 300 分的人选出来。 例 3. Like 子句基本格式一: “ _ ” 匹配。 功能说明:每个下划线匹配一个任意字符,注意只匹配一个字符。比如:姓名 like ‘ _ 敏 ’ ,匹配姓名以 “ 敏 ” 字结尾且字数等于二的所有数据记录,如: “ 张敏 ” 。 例 4. Like 子句基本格式二: “ % ” 匹配。 比如:姓名 Like '% 敏 %' ,匹配姓名中出现 “ 敏 ” 的所有数据记录,如: “ 周惠 敏 ” , “ 于敏 ” 、 “ 敏大 ” 、 “ 敏二 ” 等。比如要在数据库中查询姓江的人,只要利用 一条 SQL 语句就可以了, SELECT * FROM 数据库表 WHERE 姓名 Like ' 江 %' 。
3. 基本句型三:(进行排序) SELECT 字段名 FROM 数据表 ORDER BY 字段名 测试句型如下。 ( 1 ) SELECT * FROM grade ORDER BY 数学 注:从低到 高排序 功能说明:从 grade 表中取出所有字段,并按数学成绩排序。 ( 2 ) SELECT * FROM grade ORDER BY 数学, 语文 功能说明:从 grade 表中取出所有字段,并按数学成绩排序,如果数 学成绩相同则按照语文成绩排序。 ( 3 ) SELECT * FROM grade ORDER BY 数学 desc 注:从高到 低排序 功能说明:从 grade 表中取出所有字段,并按数学成绩倒序。 ( 4 ) SELECT top 5 * FROM grade 功能说明:从 grade 表中取出前五条记录的所有字段。
DML 的基本格式 ( 1 ) DELETE 指令:删除数据记录。 基本语法: DELETE FROM 数据表 WHERE 条件 例: DELETE from grade WHERE 数学 =0 功能说明:删除所有数学成绩为零的记录,如果没有 WHERE 子句,则删除所有记录。 ( 2 ) UPDATE 指令:更新数据记录。 基本语法: UPDATE 数据表 SET 字段值 = 新值 WHERE 条件 例 1 : UPDATE grade SET 数学 = 数学 +10 说明:将 grade 表 中所有人的成绩加 10 分 例 2 : UPDATE grade SET 数学 =100 WHERE 姓名 like '% 敏 %' 功能说明:将姓名中含有敏的人的数学成绩更新为 100 分
INSERT INTO 指令 ( 3 ) INSERT INTO 指令:添加数据记录。 基本格式 1 : INSERT INTO 数据表 VALUES (字段新值) 基本格式 2 : INSERT INTO 数据表(字段一,字段二, …… ) VALUES (字段新值) 其中关键字两种格式的区别是:当 values 含有数据库表所有字段 的值,并且顺序和数据库字段一致时,就可以省略数据库表后面 的字段名称。 例 1 : INSERT INTO grade( 学号, 姓名, 数学 ) VALUES (1234, ' 周 润发 ',70) 例 2 : INSERT INTO grade VALUES (5678, ' 周润发 ',70,80,90) 功能说明:该语句等价于: INSERT INTO grade( 学号, 姓名, 语文, 数学, 英语 ) VALUES (5678, ' 周润发 ',70,80,90)
连接数据库 一个普通数据库的连接过程为 : 1. 加载驱动程序. 2. 通过 DriverManager 到得一个与数据库 连接的句柄. 3. 通过连结句柄绑定要执行的语句. 4. 接收执行结果. 5. 可选的对结果的处理. 6. 必要的关闭和数据库的连接
1. 装载驱动程序,建立 ODBC - JDBC 桥 使用 JDBC 的第一步是安装驱动程序。大多数数据库都 有 JDBC 驱动程序,常用的 JDBC 驱动程序如图所示。 使用代码装载: Class.forName( “ 驱动 ” ); 是一种显式地加载. 当一个驱动 程序类被 Classloader 装载后, 在溶解的过程 中,DriverManager 会注册这个驱动类的实例. 这个调用是自动发生的, 也就是说 DriverManager.registerDriver() 方法被自动调用
2. 建立连接 建立与数据库之间的连接,也就是创建一个 Connection 的实例。 DriverManager 类的 getConnection() 方法将建立数据库的连接: getConnection() 方法有三个重载的方法, 一种是最简单的只给出 数据源即 : getConnection(url), 另一种是同时给出一些数据源信息即 getConnection(url,Properties), 另外一种就是给出数据源, 用户名和密 码 :getConnection(url,user,passwod), 对于数据源信息. 返回一个打开的连接,使用此连接创建 statement 对象并发送 SQL 语句到数据库。 在程序的最后,应该关闭 Connection 对象: public void close() throws SQLException
Statement 对象 Statement 对象用于将 SQL 语句发送到数据库中,使用 conn.createStatement() 创建。 createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UP DATABLE) :可以有两种结果返回, 如果执行的查询操作, 返回为结果集 ResultSet, 如 果执行更新操作, 则返回操作的记录数 int. 用缺省设置创建时, ResultSet 是一种只能访问一次( one-time-through )、只能向前 访问( forward-only )和只读的对象。您只能访问数据一次,如果再次需要该数据,必 须重新查询数据库。 通过设置 Statement 对象上的参数,可以控制它产生的 ResultSet 。例如: Class.forName(driverName); db = DriverManager.getConnection(connectURL); Statement statement = db.createStatemen(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UP DATABLE); 这个 Statement 现在将产生可以更新并将应用其他数据库用户所作更改的 ResultSet ,还可以在这个 ResultSet 中向前和向后移动。
Statement 对象 第一个参数指定 ResultSet 的类型。其选项有: TYPE_FORWARD_ONLY :缺省类型。只允许向前访问一次,并且不会受到其他用户 对该数据库所作更改的影响。 TYPE_SCROLL_INSENSITIVE :允许在列表中向前或向后移动,甚至可以进行特定定 位,例如移至列表中的第四个记录或者从当前位置向后移动两个记录。不会受到其他用 户对该数据库所作更改的影响。 TYPE_SCROLL_SENSITIVE :象 TYPE_SCROLL_INSENSITIVE 一样,允许在记录 中定位。这种类型受到其他用户所作更改的影响。如果用户在执行完查询之后删除一个 记录,那个记录将从 ResultSet 中消失。类似的,对数据值的更改也将反映在 ResultSet 中。 第二个参数设置 ResultSet 的并发性,确定是否可以更新 ResultSet 。其选项有: CONCUR_READ_ONLY :这是缺省值,指定不可以更新 ResultSet CONCUR_UPDATABLE :指定可以更新 ResultSet
Statement 接口 Statement 接口提供了执行 SQL 语句的常用方法: public ResultSet executeQuery(String sql) throws SQLException 用于产生单个 ResultSet 的语句,例如 SELECT 语句。 public int executeUpdate(String sql) throws SQLException 用于执行 INSERT 、 UPDATE 或 DELETE 语句以及 SQL DDL 语句,例如 CREATE TABLE 和 DROP TABLE 。该方 法返回一个整数,指示受影响的行数。 JDBC 在编译时并不对要执行的 SQL 语句检测, 只是把 它看着一个 String, 只有在驱动程序执行 SQL 语句时才 知道正确与否.
ResultSet 对象 ResultSet 包含符合 SQL 语句执行结果所有行,并且它通过一套 get 方法提供 了对这些行中数据的访问,常用的 get 方法有: int getInt(int columnIndex) ,取得当前行中第 columnIndex 列的整数的 值。 int getInt(String columnName) ,取得当前行中列名为 columnName 的整 数的值。 Date getDate(int columnIndex) ,取得当前行中第 columnIndex 列的日 期的值。 Date getDate(String columnName) ,取得当前行中列名为 columnName 的日期的值。 public String getString(int columnIndex) ,取得当前行中第 columnIndex 列的字符串的值。 public String getString(String columnName) ,取得当前行中列名为 columnName 的字符串的值。其他类型的 get 方法可以参考 java 文档。 ResultSet 维护指向其当前数据行的光标,让光标向下移动一行的方法是: public boolean next() throws SQLException
几种常用数据库的连接 连接 SQL Server2000 : Class.forName(“com.microsoft.jdbc.sqlserver.SQLServerDriver”).newInstance(); String url=“jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=TestDB”; String user=“sa”; String psw=“”; Connection conn=DriverManager.getConnection(url,user,psw); Statemnet stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE); String sql=“select * from TestTable”; ResultSet rs=stmt.executeQuery(sql); While(rs.next()){ } rs.close(); stmt.close(); conn.close();
几种常用数据库的连接 连接 Oracle : Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance(); String String user=“sa”; String psw=“”; Connection conn=DriverManager.getConnection(url,user,psw); Statemnet stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE); String sql=“select * from TestTable”; ResultSet rs=stmt.executeQuery(sql); While(rs.next()){ } rs.close(); stmt.close(); conn.close();
几种常用数据库的连接 连接 Sybase : Class.forName(“com.sybase.jdbc.SybDriver”).newInstance(); String url=“jdbc:sybase:Tds:localhost:5007/TestDB”; Properties SysProps=System.getProperties(); SysProps.put(“user”,”userid”); SysProps.put(“password”,”user_password”); Connection conn=DriverManager.getConnection(url,SysProps); Statemnet stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE); String sql=“select * from TestTable”; ResultSet rs=stmt.executeQuery(sql); While(rs.next()){ } rs.close(); stmt.close(); conn.close();
几种常用数据库的连接 连接 MySQL : Class.forName(“org.gjt.mm.mysql. Driver”).newInstance(); String url=“jdbc:mysql://localhost/TestDB?user=soft&password=soft&useUnicode= true&characterEncoding=8859_1”; Connection conn=DriverManager.getConnection(url,user,psw); Statemnet stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet. CONCUR_UPDATABLE); String sql=“select * from TestTable”; ResultSet rs=stmt.executeQuery(sql); While(rs.next()){ } rs.close(); stmt.close(); conn.close();
ODBC-JDBC 桥读取 Access 数据库 ( 1 )创建一个 Access 数据库; ( 2 )创建 ODBC 数据源; “ 控制面板 ” - “ ODBC 数据源 ” - “ ODBC 数据源管理器 ” - “ 系统 DSN ” - ” 添加 ” - “ 创建新数据源 ” -选择 “ Microsoft Access Driver(*.mdb) ” - ” 完 成 ” - “ ODBC Microsoft Access 安装 ” - “ 选取 ” - “ 选定数据库 ” - “ 目录 ” -选 取数据库文件-为数据源取名。 ( 3 )进行数据库连接。 A :装载驱动程序,建立 JDBC - ODBC 桥 Class.forName( “ sun.jdbc.odbc.JdbcOdbcDriver ” ); B :建立数据库连接 Connection con=DriverManager.getConnection( “ jdbc:odbc: 数据源 名 ” ); C :创建 Statement 对象 Statement stmt=con.createStatement(); D :创建查询 ResultSet rs=stmt.executeQuery( “ select * from mybook ” );
JDBC 数据访问格式 格式:执行基本 SQL 语句 数据访问基本格式: Class.forName("JDBC 驱动程序 "); Connection conn=DriverManager.getConnection(" 相应 JDBC 驱动程 序的连接串 ); Statement stmt=conn.createStatement(); ResultSet rs=stmt.executeQuery("DQL 语句 ");// 如果是数据查询 stmt.executeUpdate("DML 语句 ");// 如果是数据操作
小结 介绍 JDBC 的结构; 介绍如何利用 SQL 指令操作数据库以及常用的 SQL 函数的使用; 重点介绍 JDBC 访问数据库的基本过程;