2023年7月4日发(作者:)
数据库访问技术简介
数据库中的数据存放在数据库文件中,我们要从数据库文件中获取数据,先要连接并登陆到存放数据库的服务器。一般来说,访问数据库中的数据有两种方式:一是通过DBMS(Data Base Management System,数据库管理系统)提供的数据库操作工具来访问,如通过SQL Server 2000的查询设计器来提交查询,或者通过SQL Server 2000的企业管理工具来访问。这种方式比较适合DBA对数据库进行管理;二是通过API(Application Programming
Interface, 应用编程接口)来访问数据库,这种方式适合在应用程序中访问数据库。
在数据库发展的初期,各个开发商为自己的数据库设计了各自不同的DBMS,因此不同类型的数据库之间数据交换非常困难。为了解决这个问题,Microsoft提出了ODBC(Open
Data Base Connectivity,开放数据库互连)技术,试图建立一种统一的应用程序访问数据库接口,使开发人员无需了解程序内部结构就可以访问数据库。
1、 Microsoft提出的系列数据库访问技术
1.1、ODBC
ODBC是微软公司开放服务结构中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API。应用程序可以使用所提供的API来访问任何提供了ODBC驱动程序的数据库。ODBC规范为应用程序提供了一套高层调用接口规范和基于动态链接的运行支持环境。ODBC已经成为一种标准,目前所有的关系数据库都提供了ODBC驱动程序,使用ODBC开发的应用程序具有很好的适应性和可移植性,并且具有同时访问多种数据库系统的能力。这使得ODBC的应用非常广泛,基本可用于所有的关系数据库。
要使用ODBC,先要了解以下概念:ODBC驱动管理器、ODBC驱动程序、数据源。它们都是ODBC的组件。ODBC组件之间的关系如图1所示。
10080100应用程序
100ODBC 驱动程序管理器
8060东部西部DB2驱动程序
北部Oracle驱动程序 SQL40驱动程序
8060Oracle60数据源
402020东部100100西部040第一季度第三季度8080北部20DB2数据源
SQL
60数据源60东部东部0西部西部第一季度第三季度4040北部北部图1 ODBC层次结构
20200第一季度第三季度0第一季度第三季度东部西部北部(1)ODBC0驱动程序管理器
第一季度第三季度应用程序不是直接调用ODBC驱动程序,而是先调用ODBC驱动程序管理器提供的API。而ODBC驱动程序管理器再调用相应的ODBC驱动程序,这种间接的调用使得不管是连接到什么数据库都可以按照一定的方式来调用。
ODBC驱动程序管理器负责将适当的ODBC驱动程序加载到内存中,并将应用程序的请求发给正确的ODBC驱动程序。ODBC驱动程序管理器代表应用程序加载ODBC数据库驱动程序的动态链接库()。该DLL(Dynamic Link Librarry)对应用程序是透明的。
(2)ODBC驱动程序
ODBC驱动程序处理从ODBC驱动程序管理器发送过来的函数调用,它负责将SQL请求发给相应的DBMS,并将结果返回给ODBC驱动程序管理器。每个遵循ODBC的数据库应该提供自己的ODBC驱动程序,不同数据源的ODBC驱动程序不能混用。
(3)数据源
数据源是数据、访问该数据所需要的信息和该数据源位置的特定集合,其中的数据源位置可用数据源名称描述。例如,数据源可以是通过网络在Microsoft SQL Server 上运行的远程数据库,也可以是本地目录中的Microsoft Access数据库。用户只需用定义好的数据源名称访问数据库,而无需知道其他细节。通过应用程序,可以访问任何具有ODBC驱动程序的数据源。如SQL Server、Oracle、Access等
1.2、OLE DB
随着数据源日益复杂化,应用程序很可能需要从不同的数据源取得数据,加以处理,再把处理过的数据输出到另外一个数据源中。更麻烦的是这些数据源可能不是传统的关系数据 库,而可能是Excel文件,Email,Internet/Intranet上的电子签名信息。需要一种新的架构来提供这种应用和数据源之间的无缝连接, OLE DB(Object Link and embed,对象链接和嵌入数据库)技术应运而生。
OLE DB是一种数据技术标准接口,目的是提供一种统一的数据访问接口,这里所说的数据,除了标准的关系型数据之外,还包括邮件数据、Web上的文本或图形、目录服务等非关系型数据。OLE DB标准的核心内容就是要求以上这些各种各样的数据存储都提供一种相同的访问接口,使得数据的使用者(应用程序)可以使用同样的方法访问各种数据,而不用考虑数据的具体存储地点、格式或类型。
ODBC和OLE DB标准都是为了提供统一的访问数据接口,有人就产生疑问:OLE DB是不是作为替代ODBE的新标准呢?答案是否定的。ODBC标准的对象是基于SQL的数据源,而OLE DB的对象则是范围更为广泛的任何数据存储。从这个意义上说,符合ODBC标准的数据源是符合OLE DB标准的数据存储的子集。但是,符合ODBC标准的数据源要符合OLE DB标准,还必须提供相应的OLE DB服务程序(Service Provider),就像SQL Server
要符合ODBC 标准,必须提供SQL Server ODBC驱动程序一样。现在,微软已经为所有的ODBC数据源提供了一个统一的OLE DB 服务程序,叫做ODBC OLE DB Provider。
1.3、DAO
DAO(Database Access Object)使用Microsoft Jet数据库引擎(Jet数据库引擎是一种用来访问Microsoft Access和其它数据源的记录和字段的技术)来访问数据库,是一种面向对象的界面接口。Jet是第一个连接到 Access 的面向对象的接口。使用 Access 的应用程序可以用 DAO 直接访问数据库。由于 DAO 是严格按照 Access 建模的,因此,使用 DAO 是连接 Access 数据库最快速、最有效的方法。DAO 也可以连接到非 Access 数据库,例如,SQL Server 和 Oracle,但是需要Jet 引擎解释DAO和ODBC之间的调用。
与ODBC一样,DAO也提供了一组API供编程使用。相比较而言,DAO类提供了比ODBC类更广泛的支持。一方面,只要有ODBC驱动程序,使用Microsoft Jet的DAO就可以访问ODBC数据源。另一方面,由于DAO是基于Microsoft Jet引擎的,因而在访问Access数据库时具有很好的性能。
1.4、RDO
由于DAO是专门设计用来与Jet引擎对话的,因此需要Jet 引擎解释DAO和ODBC之间的调用,这导致了较慢的连接速度和额外的开销。为了克服这样的限制,Microsoft创建了RDO(Remote Data Objects,远程数据对象)。
RDO作为DAO的继承者,它将数据访问对象DAO提供的易编程性和ODBC API 提供的高性能有效地结合在一起。DAO是一种位于Microsoft Jet引擎之上的对象层,而RDO封装了ODBC API的对象层。RDO没有Jet引擎的高开销,再加上与ODBC的紧密关系,使得它访问ODBC兼容的数据库(如 SQL Server)时具有比DAO更高的性能。与RDO紧密关联的是Microsoft RemoteData 控件。不过RDO是一组函数,而Microsoft RemoteData
控件是一种数据源控件,它提供了处理其他数据绑定控件的能力。RDO和RemoteData 控件能编程访问ODBC兼容的数据库,而不需要本地查询处理,如Microsoft Jet引擎。RDO能访问ODBC API 提供的全部功能,但是它更容易使用。
1.5、ADO
DAO与RDO只能处理后台为关系数据库的DBMS,不能解决通用数据存储及通用数据访问。鉴于此,Microsoft推出了另一个数据库访问对象模型ADO。ADO技术是基于OLE
DB的访问接口,它继承了OLE DB 技术的优点,并且对OLE DB的接口做了封装,定义了ADO对象,简化了程序的开发。开发人员在使用ADO时,其实就是在使用OLE DB,不过OLE DB更加接近底层。ADO是DAO和RDO的后继产物,提供比DAO和RDO更简单的对象模型。
ADO最主要的优点是易于使用、速度快、内存支出少和磁盘遗迹小。ADO在应用方案中使用最少的网络流量,并且在前端和数据源之间使用最少的层数,能够提供轻量、高性能的接口。
下面我们来看一下以上这几种访问技术之间的关系,如图2所示。
应用程序
DAO
1RDO
6ADO
100OLE DB
100第三季度80东部西部80北部60东部西部北部东部西部北部东部西部北部600第一季度4ODBC
东部40西部60北部20400600第一季度第一季度第三季度4020关系型数据库
图2 数据库访问技术之间的关系
第三季度0非关系型数据第一季度第三季度东部20第三季度
西部0北部第一季度第三季度
0第一季度 1.6、
1.6.1、概述
是对ADO的一个跨时代的改进,它提供了平台互用性和可扩展的数据访问。从命名,我们可以看出 是基于.NET Framework的,这也是它与ADO最大的区别。 是Microsoft在.NET Framework中负责数据访问的类库集,它是基于OLE DB
技术以及.NET Framework的类库和编程语言发展而来,它可以让.NET上的任何编程语言能够连接并访问关系数据库和非关系数据库型数据来源,或是独立出来作为处理应用程序数据的类对象。并不简单地是ADO的下一个版本,它更是一个全新的架构、产品和概念。
1.6.2、中的常用对象
(1)Connection对象
使用的第一步是连接数据库之类的数据源。利用Connection对象,即可告诉连接哪个数据库,并提供用户名和口令,以及设置其他选项。
Microsoft的.NET框架针对不同的连接类型,提供了ODBC、OLE DB、SQL Server等多种Connection对象,下面以连接SQL Server为例进行介绍。
连接到SQL Server使用的对象是SqlConnection。要使用数据库连接对象,必须先对其进行定义,定义格式为:SqlConnection strConn = new SqlConnection();
接下来需要设置连接字符串,主要有四项:用户名、密码、数据库名和服务器名。格式为:strConn = “uid=用户名;pwd=密码;Database=数据库名;server=服务器名”;
对连接进行管理的主要方法是Open()和Close(),分别表示建立连接和关闭连接。
(2)Command对象
Command对象最主要的工作是通过Connection对象对数据源下达操作数据库的命令。使用户能够访问用于返回数据、修改数据运行存储过程以及发送或检索参数信息的数据库命令。
下面是使用构造函数创建SqlCommand对象,并通过该对象的构造函数参数来设置特定属性值,其语法格式为:
SqlCommand 命令对象名 = new SqlCommand(操作字符串, 连接对象名);
Command对象包括三个主要方法。
1)、ExecuteNonQuery():执行不返回任何行的命令。如实现插入、更新和删除。
2)、ExecuteReader():执行一个查询的SQL语句,返回一个DataReader对象。 3)、ExecuteScalar():从数据库中检索单独值。该方法主要用于统计操作。
(3)DataReader对象
当Command 对象返回结果集时,需要使用DataReader对象来检索数据。DataReader
对象返回一个来自Command 的只读的、只能向前的数据流。DataReader每次只能在内存中保留一行,所以开销非常小。
DataReader对象不能实例化,必须借助于相关的Command对象来创建实例。例如,用SqlCommand实例的ExecuteReader()方法创建SqlDataReader实例。如:
SqlDataReader reader = command. ExecuteReader();
(4)DataAdapter对象
DataAdapter对象也称为数据适配器对象,DataAdapter对象利用数据库连接对象(Connection)连接数据源,使用数据库命令(Command)规定的操作从数据源中检索出数据送往数据集对象(DataSet),或者将数据集中经过编辑后的数据送回数据源。
常用的创建DataAdapter对象的语法格式如下:
SqlDataAdapter 对象名=new SqlDataAdapter(Select查询语句, 连接对象名);
数据适配器将数据填入数据集是调用方法Fill(),语法格式如下:
对象名.Fill(“数据集对象”)或 对象名.Fill(“数据集对象”,“数据表名”) ;
数据适配器将数据集中更改的内容更新到数据库中,使用Updata()方法,语法格式如下:对象名. Updata (“数据集对象”,“数据表名”);
(5)DataSet对象
DataSet是中的核心概念,你可以把它想象成内存中的数据库。可通过DateSet对象在“断开连接模式”下访问数据库,即用户访问数据库中的数据时,首先要建立与数据库的连接,从数据库中下载需要的数据到本地缓冲区,之后断开与数据库的连接。此时用户对数据的操作(查询、添加、修改、删除等)都是在本地进行的,只有需要更新数据库中的数据时,才再次与数据库连接,在发送修改后的数据到数据库后关闭连接。这样大大减少了因连接过多(访问量较大时)对数据库服务器资源的大量占用。
创建数据集对象的语法格式为:DataSet 对象名 = new DataSet();
DataTab是DataSet中的表,就像普通数据库中的表一样,它也有行(DataRow)和列(DataColumn)。DataSet的内部是一个或多个DataTable的集合,[“表名”]可获取数据集中的一个表。
1.6.3、访问数据机制
在中,可以使用两个组件来访问和处理数据:.NET Framework 数据提供器(Provider)和数据集(DataSet),是两个非常重要,而又相互关联的核心组件,其关系如图3所示。
图3 数据集和数据提供器的关系
在与数据库的交互中,要获得数据访问的结果可用两种方法来实现,第一种是通过DataReader对象从数据源中获取数据并进行处理;第二种是通过DataSet对象将数据放置在内存中进行处理。图中Provider 用于连接到数据库、执行命令和检索结果,它是专门为数据处理以及快速地只写、只读访问数据而设计的组件。Connection对象提供与数据源的连接。使用Command对象能够访问用于返回数据、修改数据、运行存储过程以及发送或检索参数信息的数据库命令。最后,DataAdapter提供连接DataSet对象和数据源的桥梁。DataAdapter使用Command对象在数据源中执行SQL命令,以便将数据加载到DataSet中,使得DataSet中的数据更改与数据源保持一致。
1.6.3、访问实例
从T_Student数据库中查询出所有的男性同学,从T_users数据库中查出所有的用户,并显示查询结果。
查询结果如图4所示:
图4 查询结果
2、 SUN提出的JDBC数据库访问技术
2.1、JDBC简介
之前我们介绍的数据库访问技术都是Microsoft提出的,主要用于Windows平台上Microsoft开发环境下的数据库连接和操作。而JDBC(Java Data Base Connectivity,Java数据库连接)是Java语言中用来规范客户端程序如何让来访问数据库的应用程序接口。
JDBC是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编写的类和接口组成。JDBC保留ODBC的基本设计功能,在Web和Internet应用程序中的作用于ODBC在Windows系列平台应用程序中的作用类似,而且还具有对硬件平台、操作系统异构性的支持。
2.2、JDBC结构
JDBC总体结构类似于ODBC,如图5所示。
Oracle驱动程序
10080应用程序
100JDBC 驱动程序管理器
8东部DB2驱动程序
西部北部东部100西部80北部第三季度SQL驱动程序
2010004080第一季度Oracle数据源
604020020SQL数据源
60东部0西部40第一季度第三季度北部20图5 JDBC整体结构
0DB2 数据源
6040200东部西部北部东部西部北部第一季度第三季度第一季度第三季度第一季度第三季度JDBC应用程序负责用户与用户接口之间的交互操作。驱动程序管理器为应用程序加载和调用数据库驱动程序。数据库驱动程序执行JDBC对象方法的调用,发SQL请求给指定的数据源,并将结果返回给应用程序。驱动程序也负责与任何访问数据源的必要软件层进行交互。
根据访问的技术不同,JDBC驱动程序主要有4中类型,分别如下:
(1)JDBC-ODBC桥
利用ODBC驱动程序提供JDBC访问。通过JDBC-ODBC桥,开发人员可以使用JDBC来存取ODBC数据源。不足的是,他需要在客户端安装ODBC驱动程序,换句话说,必须安装Microsoft Windows的某个版本。使用这一类型你需要牺牲JDBC的平台独立性。另外,ODBC驱动程序还需要具有客户端的控制权限。
(2)本地API驱动
JDBC本地驱动程序提供了一种JDBC接口,它建立在本地数据库驱动程序的顶层,而不需要使用ODBC。JDBC驱动程序将对数据库的API从标准的JDBC调用转换为本地调用。使用此类型需要牺牲JDBC的平台独立性,还要求在客户端安装一些本地代码。
(3)网络协议驱动
将JDBC转换为与DBMS无关的网络访问协议,然后由服务器端的中间件转换为具体数据库服务器可以接受的DBMS协议。因为不需要先把JDBC的调用传给ODBC或本地数据库接口或者中间层服务器,所以执行效率比较高。在客户端或服务器端不用安装其他软件 或驱动,并且能够访问多种数据库。另外,由于这类驱动程序是完全用Java语言编写,它的移植性好,实现了平台独立性。适合组建三层的应用模型和需要同时连接多个不同种类的数据库,且对并发连接要求高的应用,是最为灵活的JDBC驱动程序。
(4)本地协议驱动
将JDBC调用直接转换为DBMS所使用的网络访问协议。JDBC把对数据库的访问请求传递给网络上的中间件服务器,中间件服务器把请求翻译为符合数据库规范的调用后传给数据库服务器。由于这种驱动是基于服务器的,所以无需再客户端加载驱动程序,允许从客户机上直接调用DBMS服务器。适合连接单一数据库的工作组应用。
第1,2类JDBC驱动程序都要求客户端必须安装ODBC驱动,不利于Java数据库程序的兼容性。第3,4类驱动程序都是纯Java驱动程序,具有Java的所有优点,对Java开发者来说,它们在性能、可移植性和功能等方面都有优势。
2.3、JDBC访问数据库
访问数据库就是从数据库中提取数据或向数据库中保存数据,JDBC抽象了数据库进行交互的过程。首先在Java程序中要import java sql.* 语句导入包。当Java程序需要使用JDBC时,等级一个driver类,然后创建一个tion对象指向数据库。其次,要创建一个最基本的类是ent,用于执行数据库操作。
用JDBC来实现访问数据库具体操作步骤如下:
(1)加载连接数据库的驱动程序
在指定数据库建立连接前,JDBC都会加载相应的驱动程序,每一种数据库的驱动程序完成接口。加载驱动程序的一种最简单的方法是使用e()方法显示加载一个驱动程序,由驱动程序负责向DriverManager登记注册并在与数据库相连接时,DriverManager将使用此驱动程序。如:
e(“verDriver”);
(2)建立连接
采用DriverManager类中的getConnection方法实现与url所指定的数据源建立连接并返回一个Connection类的对象,以后对这个数据源的操作都是基于该Connection类对象。
String url = “jdbc:microsoft:sqlserver://local:1433;DatabaseName = pubs”;
connection con = nection(url,”Login”,”Password”);
(3)查询数据库
对于需要返回结果集的SELECT语句,使用executeQuery()方法,该方法只有一个字符 串参数,用来存放SELECT语句,查询成功则以Resultset对象的形式返回查询结果。使用Statement对象来执行。
Statement stmt = Statement();
String sql = “SELECT * FROM Book”;
ResultSet rs = stmt. executeQuery(sql);
如果对数据库系统发送INSERT、UPDATE和DELETE不需要返回查询结果的SQL语句,则采用executeUpdate()方法。executeUpdate()方法接受String类型的SQL语句为参数,返回类型为int,表示数据库表收到INSERT、UPDATE和DELETE语句影响的数据行数。如果返回值为0,表示SQL语句不返回任何数据。
Statement stmt = Statement();
String sql = “DELETE FROM shop_user WHERE username = ‘abc’”;
int ret = stmt. executeUpdate(sql);
(4)处理结果集
对ResultSet对象进行处理后,可以将查询结果显示给用户。ResultSet对象包括一个包含所有查询结果的表。最初,游标位于结果集的第一行的前面,可以用方法使指针下移一行对结果逐行处理。并用ResultSet类的get方法将数据库各个字段名类型转换为Java类型。
(5)关闭查询语句及数据库连接
在程序结束前应依次关闭Statement对象和Connection对象。
2.4、JDBC连接实例
读取网上书店数据库中表Book相关数据的JDBC工作流程
import .*;
public class JDBCBOOK
{
public static void main(String argv[])throws ClassNotFoundException,
SQLException
{
//(1)加载驱动程序
e(“bDriver”);
//(2)建立数据库连接 Connection con=nection(“jdb:odbc:Book”,
”Login”,”Password”);//Book为ODBC数据源名
}
}
//(3)创建Statement对象
Statement stmt = Statement();
//(4)执行查询语句并显示结果
String sql = “SELECT * FROM Book”;
ResultSet rs = stmt. executeQuery(sql);
while(())
{
}
//(5)关闭对象
();
();
();
en((“id”)+””+
ing(“Name”)+””+at(“price”));
3、 小结
以上介绍了主流的数据库访问技术。值得注意的是,这里介绍的仅仅是部分技术,还很多数据库访问技术没有介绍,比如Microsoft的ODBCDirect和Borland的BED等,它们有着各自的特点,但是总的来说瘦关注程度步入前面介绍的几种技术。希望在以后的学习过程中,可以有机会对其他数据库访问技术有所了解。
参考文献:
[ 1 ] 万常选.《数据库系统原理与设计》.清华大学出版社, 2009.9.
[ 2 ] 王知强.《数据库系统及应用》. 清华大学出版社,2011.2.
[ 3 ] 肖慎勇.《数据库开发与管理》. 清华大学出版社, 2013,2.
[ 4 ] 徐爱芸.《数据库原理与应用教程》. 清华大学出版社, 2011.6.
发布者:admin,转转请注明出处:http://www.yc00.com/web/1688435133a137400.html
评论列表(0条)