`
shift8
  • 浏览: 149984 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

DAO模式

 
阅读更多

很多的J2EE应用程序需要使用持久性数据(数据库、文件等)。不同的程序,持久性存储是各不相同的,并且用来访问这些不同的持久性存储机制的API也有很大的不同。假如应用程序要在不同的持久性存储间迁移,这些访问特定持久存储层的代码将面临重写。
  
  如何解决这个问题?且看"DAO模式"
  
  数据访问对象(Data Acess Object) 模式
  
  一.环境
  根据数据源不同,数据访问也不同。根据存储的类型(关系数据库、面向对象数据库、文件等等)和供给商实现不同,持久性存储(比如数据库)的访问差别也很大。
  
  二.问题
  许多真是的J2EE应用程序需要在一定程度上使用持久性数据。对于许多应用程序,持久性存储是使用不同的机制实现的,并且用来访问这些不同的持久性存储机制的API也有很大的不同。
  比如,应用程序使用实体bean(这里应该是指BMP的bean,CMP的bean已大大降低了与RDBMS的耦合)的分布式组件来表示持久性数据,或者使用JDBC API来访问驻留在某关系数据库治理系统(RDBMS)中的数据,这些组件中包含连接性性和数据访问代码会引入这些组件与数据源实现之间的紧密耦合。组件中这类代码依靠性使应用程序从某种数据源迁移到其他种类的数据源将变得非常麻烦和困难。当数据源变化时,组件也需要改变,以便于能够处理新类型的数据源。
  
  (举个例子来说,我们UPTEL系统是使用JDBC API对 Oracle数据库进行连接和数据访问的,这些JDBC API与SQL语句散布在系统中,当我们需要将UPTEL迁移到其他RDBMS时,比如曾经迁移到INFORMIX,就面临重写数据库连接和访问数据的模块。)
  
  三.作用力
  1.诸如bean治理的实体bean、会话bean、servlet等组件往往需要从持久性存储数据源中检索数据,以及进行数据存储等操作。
  2.根据产品供给商的不同,持久性存储API差别也很大,这些API和其能力同样根据存储的类型不同也有差别,这样存在以下缺点,即访问这些独立系统的API很不统一。
  3.组件需要透明于实际的持久性存储或者数据源实现,以便于提供到不同供给商产品、不同存储类型和不同数据源类型的更轻易的移植性。
  
  四.解决方案
  使用数据访问对象(DAO)模式来抽象和封装所有对数据源的访问。DAO治理着与数据源的连接以便检索和存储数据。
  DAO实现了用来操作数据源的访问机制。数据源可以时RDBMS,LDAP,File等。依靠于DAO的业务组件为其客户端使用DAO提供更简单的接口。DAO完全向客户端隐藏了数据源实现细节。由于当低层数据源实现变化时,DAO向客户端提供的接口不会变化,所有该模式答应DAO调整到不同的存储模式,而不会影响其客户端或者业务组件。重要的是,DAO充当组件和数据源之间的适配器。
  
  (按照这个理论,假如我们UPTEL系统使用了DAO模式,就可以无缝的从ORACLE迁移到任何一个RDBMS了。梦想总是很完美的,且看看DAO模式如何实现)
  
  1.结构,图1是表示DAO模式中各种关系的类图。
  
  此主题相关图片如下:

¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

2.参与者和职责
  1)BusinessObject(业务对象)
  代表数据客户端。正是该对象需要访问数据源以获取和存储数据。
  2)DataaccessObject(数据访问对象)
  是该模式的主要对象。DataAccessObject抽取该BusinessObject的低层数据访问实现,以保证对数据源的透明访问。BusinessObject也可以把数据加载和存储操作委托给DataAccessObject。
  3)DataSource(数据源)
  代表数据源实现。数据源可以是各RDBMSR数据库,OODBMS,xml文件等等。
  4)valueObject(值对象)
  代表用做数据携带着的值对象。DataAccessObject可以使用值对象来把数据返回给客户端。
  DataAccessObject也许会接受来自于客户端的数据,其中这些用于更新数据源的数据存放于值对象中来传递。
  
  3.策略
  1).自动DAO代码产生策略
  因为每个BusinessObject对应于一个非凡的DAO,因此有可能建立BusinessObject,DAO和低层实现(比如RDBMS中的表)之间的关系(映射)。一点这些关系(映射)已经建立,我们就可以编写与应用程序有馆的代码生成的简单工具了(什么?自己写GP程序?用ORM的附带工具自动生成不就完了,最多自己写几个Adapter,牛人就是不同,啥都要自己写...),其中的工具可以产生该应用程序需要的所有DAO代码。
  假如DAO需求很复杂,我们可以采用第三方工具,其中这些工具提供对象到RDBMS数据库的关系映射(这里指的是前面提到的ORM工具,全称是Object Relation Mapping,目前成熟的ORM工具有很多:Hibernate,OJB,Torque,TopLink等等)。
  这些工具通常包含GUI工具来把业务对象映射到持久性存储对象,并且因而定义中间DAO。一旦这些映射完成,这些工具会自动地生成代码,并且也许会提供其他增值功能,比如结果缓冲、查询缓冲、与应用程序集成,以及与其他第三方产品(比如分布式缓冲)地继续,等等。
  (增值服务:Torque提供了结果缓冲,Hibernate提供了对Oracle数据库SQL指令的优化,OJB提供JDO API、OMDB API)
  
  2).数据访问对象的工厂策略
  通过调整抽象工厂和工厂方法模式,DAO模式可以达到很高的灵活度。
  当低层存储不会随着实现变化而变化时,该策略可以使用工厂方法模式来实现该策略。以产生应用程序需要的大量DAO。图2是这种情况下的类图。
  
  此主题相关图片如下:

¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

当低层存储随着实现变化而变化时,该策略可以使用抽象工厂方法模式而实现。
  图3是这种情况下的类图。
  
  此主题相关图片如下:

¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥

5.结果
  1).启用透明性
  业务对象可以是使用数据源,而无须了解该数据源实现的具体细节。访问是透明的,原因是实现被隐藏在DAO的内部。
  2).启用更轻易的迁移
  DAO层使应用程序更加轻易地迁移到一个不同的数据库实现。业务对象不了解低层数据实现。因而,该迁移只涉及对DAO层的变化。更进一步说,假如使用工厂策略,则有可能为每一个低层存储实现提供一个具体工厂实现。在这种情况下,迁移到不同的迁移实现意味着给应用程序提供一个新的工厂实现。
  3).减少业务对象中代码复杂度
  由于DAO治理所有的数据访问复杂性,它可以简化业务对象和其他使用DAO的客户端中的代码。所有与实现有关的代码(比如sql语句)都被包含在DAO中,而不是包含在业务对象中。这样做提高了代码的可读性,已经代码生产效率。
  4).把所有的数据访问集中到一个独立的层。
  因为所有的数据访问操作现在被委托给DAO,所有单独的数据访问层可以被看作把数据访问实现与应用程序中的其他代码相隔离的。这种集中化使应用程序更轻易地维护和治理。
  5).不适用于容器治理的持久性
  由于EJB容器用容器治理的持久性(CMP)来治理实体bean,该容器会自动地服务所有的持久性存储访问。使用容器治理的实体bean的应用程序不需要DAO层,因为该应用程序服务器透明地提供该功能。然而,当需要组合使用CMP和BMP时,DAO仍然有用处。
  6).添加其他层
  DAO会在数据客户端和数据源之间创建其他的对象层,其中该数据源需要被设计和实现以便于权衡该模式的好处。但是选择本方法也会带来额外的开销。
  7).需要类层次设计
  在使用工厂策略时,我们需要设计和实现具体工厂的层次,以及这些工厂产生的具体产品层次。假如能够确保这种灵活性,则有必要考虑这种额外的工作。这样做会增加设计的复杂性。然而,在实现该工厂策略时,你可以首先考虑工厂方法模式,然后再根据需要过渡到抽象工厂。
  
  六.范例代码
  1.实现数据访问对象模式
  范例9-4时表示Customer信息的持久性对象的DAO范例代码。当findCustomer()被调用时,CloudscapeCustomerDAO创建一个Customer值对象。
  范例9-6是使用DAO的范例代码。
  
  2.实现数据访问对象的工厂策略
  1)使用工厂方法模式
  2)使用抽象工厂模式
  范例代码9-2是CloudscapeDAOFactory的范例代码。
  范例代码9-3中的CustomerDAO接口为Customer持久性对象定义了DAO方法,这些接口是被所有具体DAO实现来实现的,比如CloudscapeCustomerDAO、OracleCustomerDAO、已经SybaseCustomerDAO。Account和OrederDAO接口也与此类似。 

 

Example 9.1 Abstract DAOFactory Class    

  // Abstract class DAO Factory                    
  public abstract class DAOFactory {          

  // List of DAO types supported by the factory
  public static final int CLOUDSCAPE = 1;
  public static final int ORACLE = 2;        
  public static final int SYBASE = 3;        
  ...                                                                        

  // There will be a method for each DAO that can be 

  // created. The concrete factories will have to 
  // implement these methods.                        

  public abstract CustomerDAO getCustomerDAO();

  public abstract AccountDAO getAccountDAO();
  public abstract OrderDAO getOrderDAO();
  ...                                                                        

  public static DAOFactory getDAOFactory(
  int whichFactory) {                                        

  switch (whichFactory) {                                
  case CLOUDSCAPE:                                             
  return new CloudscapeDAOFactory();          
  case ORACLE :                                                   
  return new OracleDAOFactory();                 
  case SYBASE :                                                   
  return new SybaseDAOFactory();                  
  ...                                                                        
  default :                                                           
  return null;                                                      
  }                                                                            
  }                                                                            
  }                                                                            

  Example 9.2 ConcreteDAOFactory Implementation for Cloudscape

  // Cloudscape concrete DAO Factory implementation
  import java.sql.*;                                          

  public class CloudscapeDAOFactory extends DAOFactory {
  public static final String DRIVER="COM.cloudscape.core.RmiJdbcDriver";      
  public static final String DBURL="jdbc:cloudscape:rmi://localhost:1099/CoreJ2EEDB";

  // method to create Cloudscape connections

  public static Connection createConnection() {
  // Use DRIVER and DBURL to create a connection
  // Recommend connection pool implementation/usage
  }                                                                            
  public CustomerDAO getCustomerDAO() {    

  // CloudscapeCustomerDAO implements CustomerDAO
  return new CloudscapeCustomerDAO();        
  }                                                                            
  public AccountDAO getAccountDAO() {        
  // CloudscapeAccountDAO implements AccountDAO
  return new CloudscapeAccountDAO();          
  }                                                                            
  public OrderDAO getOrderDAO() {                

  // CloudscapeOrderDAO implements OrderDAO
  return new CloudscapeOrderDAO();              
  }                                                                            
  ...                                                                        
  }                                                                            

  Example 9.3 Base DAO Interface for Customer

  // Interface that all CustomerDAOs must support
  public interface CustomerDAO {                  
  public int insertCustomer(...);                
  public boolean deleteCustomer(...);        
  public Customer findCustomer(...);          
  public boolean updateCustomer(...);        
  public RowSet selectCustomersRS(...);    

  public Collection se
lectCustomersVO(...);
  ...                                                                        
  }                                                                            

  Example 9.4 Cloudscape DAO Imple
mentation for Customer

  // CloudscapeCustomerDAO implementation of the 
  // CustomerDAO interface. This class can contain all
  // Cloudscape specific code andSQL statements. 
  // The client is thus shielded from knowing 
  // these implementation details.              

  import java.sql.*;                                          


  public class CloudscapeCustomerDAO implements 
  CustomerDAO {                                                    

  public CloudscapeCustomerDAO() {              
  // initialization                                           
  }                                                                            

  // The following methods can use              

  // CloudscapeDAOFactory.createConnection() 
  // to get a connection as required          

  public int insertCustomer(...) {              
  // Implement insert customer here.          
  // Return newly created customer number
  // or a -1 on error                                        
  }                                                                            

  public boolean deleteCustomer(...) {      
  // Implement delete customer here            
  // Return true on success, false
on failure
  }                                                                            

  public Customer findCustomer(...) {        
  // Implement find a customer here using supplied
  // argument values as search criteria    
  // Return a value object if found,          
  // return null on error or if not found
  }                                                                            

  public boolean updateCustomer(...) {      
  // implement update record here using data
  // from the customerData value object    
  // Return true on success, false on failure or
  // error                                                              
  }                                                                            

  public RowSet selectCustomersRS(...) {  

  // implement search customers here using the
  // supplied criteria.                                    
  // Return a RowSet.                                       
  }                                                                            

  public Collection selectCustomersVO(...) {
  // implement search customers here using the
  // supplied criteria.                                    
  // Alternatively, implement to return a Collection 
  // of value objects.                                      
  }                                                                            
  ...                                                                        
  }                                                                            


  Example 9.5 Customer value Object            

  public class Customer implementsjava.io.Serializable {
  // member variables                                        
  int CustomerNumber;                                        
  String name;                                                      
  String streetAddress;                                    
  String city;                                                      
  ...                                                                        

  // getter and setter methods...                
  ...                                                                        
  }                                                                            


  Example 9.6 Using a DAO and DAO Factory ?Client Code

  ...                                                                        
  // create the required DAO Factory          
  DAOFactory cloudscapeFactory =                 
  DAOFactory.getDAOFactory(DAOFactory.DAOCLOUDSCAPE);

  // Create a DAO                                                
  CustomerDAO custDAO =cloudscapeFactory.getCustomerDAO();        

  // create a new customer                              
  int newCustNo = custDAO.insertCustomer(...);


  // Find a customer object. Get the value object.
  Customer cust = custDAO.findCustomer(...);

  // modify the values in the value object.
  cust.setAddress(...);                                    
  cust.setEmail(...);                                        

  // update the customer object using the DAO
  custDAO.updateCustomer(cust);                    

  // delete a customer object                        
  custDAO.deleteCustomer(...);                      
  // select all customers in the same city 
  Customer criteria=new Customer();            
  criteria.setCity("广州");                                
  Collection customersList =custDAO.selectCustomersVO(criteria);      
  // returns customersList - collection of Customer
  // value objects. iterate through this collection to
  // get values.                                   
分享到:
评论

相关推荐

    JSP的DAO模式留言板

    **JSP的DAO模式留言板详解** 在Web开发中,DAO(Data Access Object)模式是一种常见的设计模式,用于封装对数据库的操作,将业务逻辑与数据访问层分离,提高代码的可维护性和可测试性。本教程将详细介绍如何使用...

    java复习题,jdbc,DAO模式,oracle复习题

    这些知识点的结合,意味着你可能需要编写能够使用JDBC与Oracle数据库进行交互的Java程序,同时运用DAO模式来实现数据访问的抽象和隔离。这样的复习涵盖了编程、数据库和设计模式等多个层面,对于提升你的IT技能...

    《J2EE核心模式》(DAO模式)

    DAO模式的主要目的是为了解耦业务逻辑层和数据访问层,提高代码的可维护性和可测试性。它通过创建一个接口或抽象类来封装对数据库的访问操作,使得业务对象可以不直接与数据库进行交互,而是通过DAO对象来进行。这样...

    使用DAO模式实现宠物数据更新

    在本例中,我们将探讨如何使用DAO模式来实现宠物数据的更新功能。 首先,DAO模式的基本结构包括以下几个部分: 1. **实体类(Entity)**:在这里,我们可以创建一个`Pet`类,它代表宠物对象,包含宠物的相关属性如...

    Java Web实验六 采用 DAO 模式实现对数据库的访问方法, 利用 Servlet 实现 MVC 模式

    首先,DAO模式是一种用于分离业务逻辑层与数据访问层的模式。在该模式中,DAO类作为数据存取的接口,负责处理与数据库的所有交互。这样做的好处在于,业务逻辑层不必直接与数据库进行通信,而是通过调用DAO的方法,...

    DAO模式与分页显示

    在DAO模式中,我们通常创建一个接口来定义数据库操作,然后实现这个接口以处理具体的SQL查询、插入、更新和删除等任务。这样做的好处在于,业务逻辑代码可以独立于数据库实现,降低了耦合度,同时也方便了测试。 ...

    Hibernate 基于持久层框架的DAO模式应用

    DAO模式是一种设计模式,它创建了一个接口来封装对数据源的所有操作,通常用于数据库操作。这种模式将业务逻辑和数据访问操作解耦,使得代码更加模块化,同时也方便更换不同的数据存储方式。 2. **Hibernate框架...

    一个dao模式的实验报告

    在这个实验报告中,学生周媛娣通过Java Web开发实践,使用DAO模式实现了对数据库的操作,包括增加、查询等基本功能。 1. **DAO模式的理解**: DAO模式的核心思想是创建一个对象(DAO),该对象封装了对数据库的...

    使用Spring实现DAO模式

    使用Spring实现DAO模式 在软件开发领域,设计模式是一种被广泛接受的解决特定问题的方案。其中,DAO(Data Access Object)模式旨在提供一种抽象的数据访问机制,将数据访问的逻辑封装在一个对象中,从而使得应用...

    java DAO模式实现 附源码

    **Java DAO模式实现详解** DAO(Data Access Object)模式是一种常用的设计模式,它在软件开发中主要用于数据库操作的抽象和封装。DAO模式的核心思想是将数据访问层与业务逻辑层解耦,使得业务代码不直接与数据库...

    Mvc+DAO模式例子

    在给定的"Mvc+DAO模式例子"压缩包中,可能包含了实现了MVC模式和DAO模式的Java源代码,包括Servlet、JSP、JavaBean以及对应的DAO类。这些文件可以作为学习和理解这两种模式的实例,通过分析和运行代码,可以帮助初学...

    DAO模式数据库操作源代码

    本例子是自己做的,,有很强的可读性。。代码使用率高。是用DAO模式设计的, 实现了对数据库的添加、删除、查询、更新等操作。。不懂的可以联系我:qq:420804832

    Mysql DAO模式上机练习 参考作业

    在这个"Mysql DAO模式上机练习 参考作业"中,我们可以深入学习如何在Java环境下使用DAO模式来操作MySQL数据库。 首先,`entity`目录可能包含了项目中的实体类(Entity Classes)。在DAO模式中,实体类是用来映射...

    dao模式开发

    dao模式的实现 及数据库介绍

    JSP实现上传下载 DAO模式

    本教程将详细介绍如何利用JSP实现文件的上传和下载功能,并结合DAO模式进行数据处理。 一、JSP文件上传 1. **表单设计**:在JSP页面上,我们需要创建一个HTML表单,包含`<input type="file">`元素,用户可以在此...

    基于DAO模式的新闻发布系统

    【基于DAO模式的新闻发布系统】是一种常见的Web应用架构设计,主要用于高效、稳定地管理新闻数据。DAO(Data Access Object)模式是软件设计模式之一,它为业务层提供了与数据库交互的接口,隔离了数据访问的复杂性...

    DAO模式写的一个小的购物车程序

    使用DAO模式实现的简单的购物车的添加,修改操作

    DAO模式设计

    DAO模式的核心思想是通过创建一个独立于具体数据库操作的对象(即DAO),来封装对数据库的访问细节,这样可以使得业务代码不直接依赖于具体的数据库API,提高了代码的可测试性和可维护性。 在现代Java应用中,尤其...

    工厂模式dao模式操作数据库小例子

    总的来说,工厂模式和DAO模式的结合使用能够提高代码的可读性、可扩展性和可维护性,是Java开发中处理数据库操作的重要实践。通过这个小例子,初学者可以深入理解这两种模式的精髓,并将其应用到实际项目中。

    JAVA DAO模式浅析.pdf

    DAO模式通过创建专门的DAO类,将这些数据库操作抽象出来,提供了一组接口或抽象方法,供业务对象调用,如获取、创建、修改和删除数据。 例如,在一个简单的学生成绩管理场景中,DAO模式可以创建一个`StudentDAO`类...

Global site tag (gtag.js) - Google Analytics