《设计数据存取类.ppt》由会员分享,可在线阅读,更多相关《设计数据存取类.ppt(83页珍藏版)》请在三一办公上搜索。
1、第16章 设计数据存取类,对象持久性简介设计数据存取类问题域类与数据存取类通信使用文件实现持久性使用数据库实现持久性,16.1 对象持久性简介,两种使对象持久性的方法:属性存储和对象存储。属性存储:从类的实例中检索属性值,然后将这些值写入文件或数据库中。以后需要此实例时,按照相反的顺序重新创建实例,即从数据文件或数据库中读取数据,填充属性,进行实例化。对象存储:使用对象串行化技术将整个实例写入文件或数据库中。好处是可以检索完整的实例,不必重新创建。,16.2 设计数据存取类,设计DA类的优点数据输入与输出代码与其他类隔离,可以显著减少维护的工作量;三层体系结构支持客户/服务器模型,GUI、PD
2、和DA功能可能驻留在多个站点的多台机器上。,16.2 设计数据存取类,例如,为Book类编写名为BookDA的DA类,该类可为客户程序提供数据存储和检索服务;只有PD类会调用该DA类中的方法。需要数据存储和检索服务的类必须调用PD类的DA方法,这样,就会轮流调用BookDA类的方法。由于不需要创建DA类的实例,因此,DA类的所有方法都是静态的。,16.2 设计数据存取类,BookDA和Book提供的4项基本任务是:检索图书、存储图书、更改图书信息和删除图书。可以使用名为find、addNew、update和delete的方法,并在DA类中实现这些方法。,16.2 设计数据存取类,查找图书 fi
3、nd方法:用书号作为图书的唯一标识,找到图书之后,返回对图书的引用,如果找不到对应的图书,该方法会创建并抛出自定义异常类的一个实例NotFoundException。public static Book find(String bookNo)throws NotFoundException,16.2 设计数据存取类,添加图书addNew方法:向系统中添加图书,先确定现有图书的书号与正在添加的图书的书号是否相同,如果相同,该方法会创建并抛出自定义异常类的一个实例DuplicationException。public static void addNew(Book book)throws Dupl
4、icationException,16.2 设计数据存取类,更改图书update方法:update方法以参数的形式接收图书引用,查找现有图书并更改书名、作者和价格,如果无法找到该图书,该方法会抛出NotFoundException。public static void update(Book book)throws NotFoundException,16.2 设计数据存取类,删除图书delete方法:从系统中删除图书,与update方法类似,首先查找以参数的形式接收了其引用的图书,然后从数据存储中将其删除;如果无法找到图书,该方法会抛出NotFoundException。public sta
5、tic void delete(Book book)throws NotFoundException,16.2 设计数据存取类,其他数据存取方法应用系统启动后执行Initialize方法,打开文件或数据库连接,将需要的数据从文件或数据库中读出,用于初始化问题域对象;public static void initialize(),16.2 设计数据存取类,其他数据存取方法退出应用系统之前执行terminate方法,将问题域对象存储到文件或数据库中,终止数据库连接。public static void terminate(),16.2 设计数据存取类,其他数据存取方法getAll方法用于读取所有对
6、象。public static Vector getAll(),16.3 问题域类与数据存取类通信,为了使DA类与所有其他类(与其匹配的PD类除外)隔离,只能由相应的PD类来调用DA方法。要使Book调用7个DA方法,必须在Book中提供7个对应方法,之后由客户端来调用这7个方法。对原来问题域的Book类做以下修改:取消静态属性books的定义;取消原来定义的initialize方法和getAll方法。,16.3 问题域类与数据存取类通信,查找图书PD类的 find方法是一个静态方法,其用途是调用DA类的 find方法。,16.3 问题域类与数据存取类通信,添加图书PD类的addNew方法:调
7、用DA类中的addNew方法存储新的图书实例。,16.3 问题域类与数据存取类通信,更改图书PD类的update方法:调用DA类的update方法,也是一个非静态方法。,16.3 问题域类与数据存取类通信,删除图书PD类的delete方法:调用DA类的delete方法。,16.3 问题域类与数据存取类通信,其他问题域方法对于DA类中包含的其他方法,如initialize、terminate和getAll,在PD类中也必须包含这些方法。,16.4 使用文件实现持久性,有两种类型的文件结构:顺序文件和随机存取文件。顺序文件包含按连续顺序存储和处理的记录;随机存取文件可以通过指定其记录编号来访问记录
8、。,16.4 使用文件实现持久性,Java输入/输出流Java中的输入/输出操作通常都是通过输入/输出流来实现的。一个流就是一个从源流向目的地的数据序列。输入/输出流可以与各种数据源和目标相连。,16.4 使用文件实现持久性,Java输入/输出流为了从信息源获取信息,就需要在程序中打开一个输入流,这个输入流便在信息源与程序之间建立了连接,程序可以从输入流读取信息。当程序需要向目标位置写信息时,便需要打开一个输出流,这个输出流便在程序与输出目标之间建立连接,程序通过输出流向这个目标位置写信息。,16.4 使用文件实现持久性,Java输入/输出流Java的输入/输出都要通过java.io包来实现,
9、java.io包提供了一系列支持读/写的java流类。Java使用两种不同的数据流:字符流和字节流。,16.4 使用文件实现持久性,Java输入/输出流Java的输入/输出都要通过java.io包来实现,java.io包提供了一系列支持读/写的java流类。Java使用两种不同的数据流:字符流和字节流。,16.4 使用文件实现持久性,字符流字符流是专门用于字符数据的,Java中的字符使用的都是16-bit的Unicode 编码,每个字符占两个字节。Unicode可以容纳大多数语言中的所有字符。字符流的源或目标通常是文本文件。,16.4 使用文件实现持久性,字符流字符流是专门用于字符数据的,Ja
10、va中的字符使用的都是16-bit的Unicode 编码,每个字符占两个字节。Reader和Writer是java.io包中所有字符流的抽象基类。Reader提供了输入字符的API及其部分实现,Writer则提供了输出字符的API及其部分实现。,16.4 使用文件实现持久性,字符流字符流是专门用于字符数据的,Java中的字符绝大多数程序使用Reader和Writer这两个抽象类的一系列子类来读/写文本信息。例如FileReader/FileWriter就是用来读/写文本文件的。,16.4 使用文件实现持久性,字节流字节流通常用于一般目的的输入/输出。这种流通常被用来读写诸如图片、声音之类的二进
11、制数据。事实上,绝大多数数据都是以二进制文件存储的。,16.4 使用文件实现持久性,字节流InputStream和OutputStream是用来处理8位字节流的抽象基类,程序使用这两个类的子类来读写8位的字节信息。这些子类中有两个特殊的类ObjectInputStream和ObjectOutputStream,它们可用来读/写对象。,16.4 使用文件实现持久性,java.io包中的常用类,16.4 使用文件实现持久性,java.io包中的常用类,16.4 使用文件实现持久性,使用顺序文件实现持久性在顺序文件中存储属性值 initialize方法读取包含图书的属性值的图书记录,为每条记录创建图
12、书实例,然后将这些图书的实例引用置于Vector实例中;terminate方法将Vector中每个图书实例的属性值写入到文件中。,16.4 使用文件实现持久性,使用顺序文件实现持久性初始的BookDA类定义:,16.4 使用文件实现持久性,使用顺序文件实现持久性增加initialize()方法,16.4 使用文件实现持久性,使用顺序文件实现持久性增加initialize()方法,16.4 使用文件实现持久性,使用顺序文件实现持久性增加initialize()方法,16.4 使用文件实现持久性,使用顺序文件实现持久性terminate()方法,16.4 使用文件实现持久性,使用顺序文件实现持久性
13、find()方法,16.4 使用文件实现持久性,使用顺序文件实现持久性addNew方法,16.4 使用文件实现持久性,使用顺序文件实现持久性update方法,16.4 使用文件实现持久性,使用顺序文件实现持久性delete方法,16.4 使用文件实现持久性,使用顺序文件实现持久性getAll方法,16.4 使用文件实现持久性,使用顺序文件实现持久性BookDA类定义中所用到的异常类,16.4 使用文件实现持久性,测试BookDA类编写TesterOne类,完成以下任务:创建两本新的图书实例;调用initialize方法;调用addNew添加两本要存储的新图书;调用find检索对第一本图书的引用
14、;调用getAll以检索两本图书的引用;为第二本图书调用delete并验证删除;更改第一本图书的价格并验证更改;调用terminate方法。,16.4 使用文件实现持久性,测试BookDA类,16.4 使用文件实现持久性,测试BookDA类,16.4 使用文件实现持久性,测试BookDA类,16.4 使用文件实现持久性,测试BookDA类,16.4 使用文件实现持久性,测试BookDA类,16.4 使用文件实现持久性,使用随机存取文件实现持久性将BookDA类中静态属性bookFile的以下定义:static File bookFile=new File(Book.dat);改为:static
15、 File bookFile=new File(Book.ran);,16.4 使用文件实现持久性,使用随机存取文件实现持久性修改initialize方法:,16.4 使用文件实现持久性,使用随机存取文件实现持久性修改initialize方法:,16.4 使用文件实现持久性,使用随机存取文件实现持久性修改initialize方法:,16.4 使用文件实现持久性,使用随机存取文件实现持久性terminate方法:,16.4 使用文件实现持久性,使用对象串行化技术实现持久性使用对象串行化技术将实例写入某个文件中,以后再读取它们,可以检索到完整的实例,不需要重新创建它们。java.io包中提供了专门
16、用于对象信息存储和读取的输入输出流类ObjectInputStream和ObjectOutputStream。,16.4 使用文件实现持久性,使用对象串行化技术实现持久性要实现对象的序列化,这个对象所属的类必须实现Serializable接口。例如,要实现Book对象的序列化,就需要对Book类的类头进行修改,使其实现接口:,16.4 使用文件实现持久性,使用对象串行化技术实现持久性将BookDA类中静态属性bookFile的以下定义:static File bookFile=new File(Book.ran);改为:static File bookFile=new File(Book.ob
17、j);,16.4 使用文件实现持久性,使用对象串行化技术实现持久性initialize方法,16.4 使用文件实现持久性,使用对象串行化技术实现持久性terminate方法,16.5 使用数据库实现持久性,Access数据库已知Access数据库BookStore.mdb中包含表 T_CUSTOMER和T_BOOK。,16.5 使用数据库实现持久性,Access数据库访问此数据库需要两个协议:Java数据库连接(JDBC)和开放式数据库连接(ODBC);JDK提供一个名为JdbcOdbcDriver的驱动程序,该驱动程序在JDBC和ODBC之间起桥接作用;ODBC要求将数据库注册为数据源名,然
18、后用此数据源名代替实际的数据库。为数据库BookStore.mdb建立数据源BookStoreDB。,16.5 使用数据库实现持久性,java.sql包java.sql包中提供了操作关系数据库的多个类,在java程序中可调用这些类的方法。DriverManager类:提供了getConnection方法,可建立到数据库的连接,并返回一个连接实例。Connection类:提供了createStatement方法,该方法返回一个语句实例,用于执行SQL语句。Statement类:提供了执行SQL语句的方法executeQuery。,16.5 使用数据库实现持久性,java.sql包ResultSe
19、t类包含由Statement类提供的executeQuery方法返回的数据实例。数据包含0到n行数据。ResultSet类提供的方法first、next、last和previous将光标指向某一行。方法getInt、getString等用于检索行中的数据。,16.5 使用数据库实现持久性,使用数据库实现持久性时,需要对BookDA类中的方法进行修改。initialize方法的功能是与数据库建立连接。find、addNew、update、delete及getAll方法用于直接访问数据库。terminate方法用于切断与数据库的连接。,16.5 使用数据库实现持久性,BookDA类的属性定义,16
20、.5 使用数据库实现持久性,initialize方法在initialize方法中加载JDBC-ODBC驱动程序,创建链接到该数据库的一个连接实例;通过调用Class类的forName方法来加载该驱动程序,通过调用DriverManager类中的getConnection方法创建连接实例。,16.5 使用数据库实现持久性,initialize方法,16.5 使用数据库实现持久性,terminate方法 在terminate方法中关闭数据库连接,调用Statement和Connection实例的close方法。,16.5 使用数据库实现持久性,find方法 使用SQL SELECT语句从数据库中检
21、索特定图书的属性值,这些值被返回到ResultSet的一个实例中,随后可调用该实例的方法来提取这些属性值;如果没有找到,该方法会抛出NotFoundException。,16.5 使用数据库实现持久性,find方法 使用SQL SELECT语句从数据库中检索特定图书的属性值,这些值被返回到ResultSet的一个实例中,随后可调用该实例的方法来提取这些属性值;,16.5 使用数据库实现持久性,find方法,16.5 使用数据库实现持久性,addNew方法 首先调用Book存取器方法获取属性值,然后调用find方法查看此书是否存在?如果存在,就会抛出DuplicateException;如果不存
22、在,就会抛出NotFoundException。在NotFoundException的catch代码块中调用executeUpdate方法执行SQL INSERT语句。,16.5 使用数据库实现持久性,addNew方法,16.5 使用数据库实现持久性,addNew方法,16.5 使用数据库实现持久性,update方法 首先调用Book存取器方法获取属性值,然后调用find方法查看图书是否存在?如果不存在,就会抛出NotFoundException。如果存在,则调用Statement实例的executeUpdate方法执行SQL UPDATE语句。,16.5 使用数据库实现持久性,update方
23、法,16.5 使用数据库实现持久性,update方法,16.5 使用数据库实现持久性,delete方法 首先调用Book存取器方法获取属性值,然后调用find方法查看图书是否存在。如果不存在,就会抛出NotFoundException;如果存在,则调用Statement实例的executeUpdate方法执行SQL DELETE语句。,16.5 使用数据库实现持久性,delete方法,16.5 使用数据库实现持久性,getAll方法 检索所有图书的属性值,并将其存储在ResultSet实例中。调用next方法,将光标指向第一个数据行,如果数据存在,则返回true,否则会返回false。对ResultSet实例中的每一行,创建一个图书实例,并将该图书的引用添加到Vector实例中。,16.5 使用数据库实现持久性,getAll方法,16.5 使用数据库实现持久性,getAll方法,16.6 本章小结,在分层的设计方法中,一般设计数据存取(DA)类来存储和检索数据。一般为每个问题域(PD)类编写一个DA类。通过从PD类中调用相应的DA类的方法来建立PD类与DA类的通信关系。本章介绍了使用顺序文件、随机存取文件、对象串行化和关系数据库实现持久性的方法。,Thanks!,
链接地址:https://www.31ppt.com/p-6344012.html