第 10章 JDBC链接数据库
JDBC链接数据库主要讲解如何使用 Java的 JDBC
( Java DataBase Connectivity)实现与不同数据库厂商,如 Oracle,SQL Server,Access等的链接。本章在介绍实现数据库链接常用类和接口的基础上,实现了一个数据库链接的实例,通过该实例读者可以掌握使用 JDBC实现基本的数据库操作,如读、写、删、改数据库记录等。本节和下一节,将深入讨论如何使用 JDBC API。
10.1 JDBC简介
本节首先介绍什么是 JDBC,了解 Java JDBC的目标及如何实现数据库平台的无关性。了解了这些基本知识后,才能更熟练的使用 JDBC API实现数据库的链接和各种数据库访问行为,从而最终掌握使用 JDBC编写基本的数据库应用程序。
10.1.1 什么是 JDBC
JDBC是 Sun开发的一套数据库访问编程接口,是一种 SQL级别的 API。它由 Java语言编写完成,所以具有很好的跨平台特性,使用 JDBC编写的数据库应用程序可以在任何支持 Java的平台上运行,而不必在不同的平台上编写不同的应用程序,使用
JDBC API就不必为访问 Access数据库而专门写一个程序,为访问 Oracle数据库而专门写一个程序,
只需要一个程序就够了,通过它可以向数据库发送 SQL语句、执行数据库操作。
10.1.2 JDBC的目标
当前数据库的主要问题之一是不同厂商数据库产品的功能竞争,虽然他们都依据标准的结构化查询语言( Structured Query Language,SQL-92),
但各个厂商还是有标准以外的东西,或者并没有完全按照标准结构化查询语言的规范实现自己的数据库产品。如果一个数据库应用程序所链接的数据库发生变化(如从 Oracle 变为 Sybase),没有 JDBC这种变化的实现就很困难,必须重新编写数据库访问程序,这当然不是件好事。那么如何构建与数据库平台无关的数据库应用程序呢?这就是 JDBC的目标。
JDBC的体系结构如图所示,通过该图可以清楚的看到,对应用程序而言,
JDBC屏蔽了下层数据库的差异,应用程序看到的是统一的数据库接口。
10.1.3 JDBC如何实现数据库的平台无关性
为了让 JDBC与平台无关,JDBC设计了“驱动程序管理类”,该类会动态维护目前所有数据库产品的驱动程序对象,通过加载相应的数据库驱动程序就可以实现对数据库的访问。这里的“驱动程序管理器”就是 DriverManager类。
DriverManager类存有已注册的 Driver类的清单。
当调用方法 getConnection时,它将检查清单中的每个驱动程序,直到找到可与 URL中指定的数据库进行链接的驱动程序为止。 Driver的方法 connect
使用这个 URL来建立实际的链接。具体如何实现数据库的链接,我们通过在 10.3节的基本概念和具体示例再详细介绍。
10.2 JDBC中的常用类和接口
Java API的设计思想是简洁、直观。所以 JDBC同样把单纯性作为设计目标。即在数据库操作时所调用的函数都符合人的逻辑思维。如链接到数据库( Connection)、建立操作指令( Statement)、
执行查询指令( executeQuery)、获得查询结果
( ResultSet)等。 JDBC的功能基本上归结为三件事,即建立数据库链接、发送 SQL语句和处理查询结果。这些任务的完成都基于 JDBC API。下面将依次介绍常用的 JDBC API。
10.2.1 驱动程序管理类( DriverManager)
DriverManager类是 JDBC的管理层,作用于用户和驱动程序之间。它跟踪可用的驱动程序,并在数据库和相应驱动程序之间建立链接。另外,
DriverManager类也处理诸如驱动程序登录时间限制及登录和跟踪消息的显示等事务。对于简单的应用程序,一般程序员需要在此类中直接使用的惟一方法是 DriverManager.getConnection( )。
该方法将建立与数据库的链接。 JDBC允许用户调用 DriverManager的方法 getDriver,getDrivers
和 registerDriver及 Driver的方法 connect。但多数情况下,还是首先考虑让 DriverManager类管理建立数据库链接的细节。
10.2.2 声明类( Statement)
Statement对象用于将 SQL语句发送到数据库中。实际上有三种 Statement对象,它们都作为在给定链接上执行 SQL语句的包容器,Statement,PreparedStatement(它从
Statement继承而来)和 CallableStatement(它从
PreparedStatement继承而来)。它们都专用于发送特定类型的 SQL语句,Statement对象用于执行不带参数的简单 SQL
语句; PreparedStatement对象用于执行带或不带 IN参数的预编译 SQL语句; CallableStatement对象用于执行对数据库已存储过程的调用。 Statement接口提供了执行语句和获取结果的基本方法。 PreparedStatement接口添加了处理 IN
参数的方法;而 CallableStatement添加了处理 OUT参数的方法。由于 Statement接口是最常用的接口,所以下面以该接口为例展示该类的用法
10.2.3 数据库链接类( Connection)
Connection对象代表与数据库的链接。链接过程包括所执行的 SQL 语句和在该链接上所返回的结果。一个应用程序可与单个数据库有一个或多个链接,或者可与许多数据库有链接。打开链接与数据库建立链接的标准方法是调用
DriverManager.getConnection方法。该方法接受含有某个 URL的字符串。 DriverManager类(即所谓的 JDBC管理层)将尝试找到可与那个 URL所代表的数据库进行链接的驱动程序。 DriverManager类存有已注册的 Driver类的清单。当调用方法
getConnection时,它将检查清单中的每个驱动程序,直到找到可与 URL 中指定的数据库进行链接。
10.2.4 结果集合类( ResultSet)
ResultSet包含符合 SQL语句中条件的所有行记录,并且它通过一套 get方法 ( 这些 get方法可以访问当前行中的不同列 ) 提供了对这些行中数据的访问 。 ResultSet.next()方法用于移动到 ResultSet中的下一行,使下一行成为当前行 。 代码执行 SQL语句的示例 。
代码执行 SQL 语句的示例
1 java.sql.Statement stmt = conn.createStatement();
2 //获得查询结果集合
3 ResultSet r = stmt.executeQuery("SELECT a,b,c FROM
Table1");
4 while (r.next()) //如果结果集合中有数据则打印相应的数据
5 {
6 int i = r.getInt("a"); //打印当前行的值
7 String s = r.getString("b");
8 float f = r.getFloat("c");
9 System.out.println("ROW = " + i + " " + s + " " + f);
10 }
10.3 如何实现数据库的链接
本节我们以一个完整的数据库链接实例学习 JDBC
的使用,首先分别介绍每一个具体步骤,即按照数据库链接的步骤依次详细介绍,最后再给出完整的示例程序,把每个步骤有机的结合在一起,
完成一个基本的数据库查询功能的类。通过本节的学习,读者可以通过示例轻松的理解并掌握
JDBC数据库链接的实现和数据库的结果查询。
10.3.1 加载合适的数据库驱动程序
使用 JDBC首先要理解如何正确装载 JDBC驱动程序,这样才可以保证数据库应用程序可以在你的系统上正常运行 。 在代码 10-1中出现过下面的指令 。
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); //加载驱动程序
上述代码的作用上装载 jdbc-odbc驱动程序,如果上述装载指令无法正常执行,需 要 重 新 查 找 该 Java 版本的文档说明,看 这 个 名 称
("sun.jdbc.odbc.JdbcOdbcDriver")是否变了 。 在编写这段代码时,最好捕获该异常,即把这行代码放在 try块中,在 catch块中捕获该异常 。 如果程序没有抛出异常,则代表驱动程序加载成功 。 上述代码修改如所示 。
代码 装载数据库驱动程序
1 try {
2 Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); // 强行加载数据库驱动程序
3 }
4 catch (ClassNotFoundException ex) {
5 System.out.println(,加载数据库驱动程序异常,);
6 }
10.3.2 数据库配置问题
如果希望链接数据库首先要完成数据库的配置,
这里我们假设用户使用 32位 Windows操作系统(其他方式需要自己研究相应的文档,找出适用于自己平台的方法)。
首先打开控制面板?管理工具?数据源( ODBC),
会看到如下图样式的对话框,其中选项卡包括用户 DSN、系统 DSN、文件 DSN等。这里 DSN指,Data
Source Name”( 数据源名称 )。对 JDBC-ODBC而言,
惟一重要的是设定系统 DSN,如果想测试配置,并希望查询数据,就有必要在下面对话框中单击
“添加”按钮,添加一个数据库驱动程序,并通过单击“配置”按钮,加载一个相应的数据库文件,这里以 Microsoft Access为例。
10.3.3 建立数据库链接并获得 Statement对象
在上面我们完成了数据库的配置 。 如果需要以某种方式发现数据库查询程序是否能够正确访问数据库的内容,需要执行到下面的程序结束 。
如果没有异常抛出,说明配置正确,数据库可以正确链接,可以访问了 。 代码测试能否正确访问数据库 。
代码 测试能否正确访问数据库
1 String url = "jdbc:odbc:test";
//test为数据源名
2 try {
3 conn = DriverManager.getConnection(url); // 获得 Connection对象
4 stmt = conn.createStatement();
//获得 Statement对象
5 }
6 catch (SQLException ex) {
7 ex.printStackTrace();
//抛出异常
8 }
10.3.4 执行数据库查询语句
测试数据库链接成功之后,经常需要数据库操作,
这里我们以查询数据库为例子说明如何使用
Statement对象的方法实现数据查询 。
1 rs = stmt.executeQuery("select password
from userlogin where username
2 ="+"'"+username+"'");
说明:方法 executeQuery(,select语句,) 实现数据库的操作,参数为标准的 select语句,其中 password和 username( 第一行中 ) 为数据库中表 userlogin的两个列属性 。 其中用户名为主键 。
该指令的作用是查询用户名为 username(是形参,
视用户输入的名称而定 )的用户密码 。
10.3.5 获得查询结果
在 10.3.4中通过 Statement对象 stmt获得的结果集合对象 rs
是个集合对象,所以获得的结果是满足 select语句条件的一个集合。调用 ResultSet的 next()函数,该函数返回布而值 false或 true,如果结果集中有数据则返回 true,如果没有则返回 false,开始时扫描指针指向结果集合的第一个数据行之前的位置。
1 //判断该行集合是否还有记录
2 if (rs.next()){
3 //如果有记录,则获得该行记录中列属性为
"password"的值
4 getresult = rs.getString("password");
5 }
10.3.6 关闭数据库链接
为了防止内存泄露,一定要关闭数据库链接,关闭步骤依次结果集合对象、声明对象和数据库链接对象。
1 rs.close();
2 stmt.close();
3 conn.close();
注意:数据库的关闭顺序,最后一定要关闭数据库链接,释放操作系统的内存资源,以防止内存泄露。
10.3.7 完整的示例程序
该示例的作用是验证用户输入的用户名和密码,
首先看用户名是否存在,如果存在则继续验证密码是否匹配,若匹配则通过验证,否则不能通过验证。如果用户名不存在则不能通过验证。如图所示,为示例程序的流程图。代码是一个完整的示例程序说明如何装载数据库驱动程序。
10.4 数据库基本操作
当前的数据库几乎都是关系数据库,这些数据库产品虽然在特殊功能上有差异,但都基本满足规范的要求。每一个数据库产品都有其数据库管理系统 DBMS,来完成数据库的操作管理,同时它也提供了用户操作指令和数据库本身的友好接口,
使用户或程序员通过简单的数据操纵语言,如查询数据、添加数据来实现数据库的操作。本节我们讲解基本的数据库操作,如查询数据、添加数据、更改数据、删除数据。当然这里的介绍只是个入门,如果读者希望了解更多的细节可以参考其他的数据库专业书籍。
10.4.1 创建数据库表
在实现数据库的其他操作之前,首先必须有可以操作的对象,即首先要创建一个数据库表,使用该表来存储数据,
许多数据库引擎提供图形接口( GUI)而不用 SQL语句来创建数据库表,当然理解 SQL的 CREATE创建指令还是有必要的,
因为 GUI接口也是基于该指令实现表的声明和创建,但是该指令对不同的数据库平台有微小的差别,但基本形式如下所示。
1 CREATE TABLE table_name(表名 ) (
2 column_name column_type column_modifiers;
//格式为列名 列属性,可以有多个列
3,..,..,..,..
4 column_name column_type column_modifiers);
10.4.2 查询数据
在 SQL指令中最常用的还是 SELECT声明。它允许用户选择基于某种准则的指定的行记录,其基本形式如下。
1 SELECT column_name,,column_name
2 FROM student;
3 WHERE column_name = value;
举例:如获得学生李哲的专业。
1 SELECT 专业
2 FROM student;
3 WHERE 学生名 =’ 李哲’ ;
10.4.3 添加数据
在创建了数据库表之后,我们就可以使用 INSERT声明向表中添加数据,一般形式为:
1 INSERT INTO table_name(column_name,...,
column_name)
2 VALUES (value,...,value);
第一个值( value)匹配第一个列名,第二个值( value)
匹配第二个列名,依此类推。如果没有为某一列指定值,
且该列又标记为 NOT NULL,则会出现错误提示。
下面是具体的添加数据的例子,向表 student中添加一个记录,学生名:李哲,年龄,18,学号,2008010250,专业:
计算机应用,系名称:信息科学技术系。
1 INSERT INTO student(学生名,年龄,学号,专业,
系名称 ) VALUES(‘ 李哲’,18,
2 ‘2008010250’,‘ 计算机应用’,‘ 信息科学技术系’ )
10.4.4 更改数据
UPDATE声明允许修改已经添加到数据库表中的数据记录,
UPDATEDE的语法形式如下。
1 UPDATE table_name
2 SET column_name = value;
3..
4 column_name = value
5 WHERE column_name = value
该声明引入了 WHERE字句。该字句用来辨别数据库表中的行。
举例,如果错误输入了学生李哲的年龄,则需要如下声明。
1 UPDATE student
2 SET 年龄 = 19
3 WHERE 姓名 = ’ 李哲’
10.4.5 删除数据
DELETE指令完成删除数据的任务,该指令格式有点像
UPDATE声明。其语法是:
1 DELETE FROM student
2 WHERE column_name = value
DELETE删除表中的整个行记录,如删除 student表中的学生李哲的记录。
1 DELETE FROM student
2 WHERE 学生名 =’ 李哲’
现在,我们了解了数据库的基本操作,通过这些基本操作读者应该可以轻松的掌握如何使用 SQL各种声明来实现,如查询数据、更新数据、删除数据和查询数据等这些最常用的数据库操作。当然数据库的操作不仅仅只是这几种,还有诸如表链接、分割等操作,如果读者感兴趣可以继续深入学习数据库的专业书籍,或参考具体数据库引擎的 SQL使用手册,可以获得更多的使用信息。
10.5 本章习题
( 1) 学完本章中,读者需要回答:
1,什么是 JDBC?
2,JDBC是如何实现平台无关性的?
3,说明 JDBC常用 API的作用及其如何使用 。
4,如何实现数据库的增,删,查,改数据操作?
( 2) 注意事项 。
1,使用 JDBC编写数据库应用程序时,最好先确定 JDK的版本,查阅相关的文档或手册,以加载合适的驱动程序类 。
2,实现数据库的各项操作时,不同的数据库引擎在特殊功能上有差异,在使用时要注意区别这些差异 。
3,链接数据库是很耗系统资源 ( 内存,CPU周期 ) 的所以一定记住在完成数据库操作后关闭数据库链接 。