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

J2EE之DAO设计模式详解

    博客分类:
  • JAVA
阅读更多
J2EE之DAO设计模式详解
     如果把连接数据库和数据的操作代码(访问持久化的数据源)与这些组件写在一起的话,会导致这些组件和数据库操作之间的耦合,这种耦合的存在,使得在应用程序中从当前数据源类型迁移到另一种数据源类型变的十分困难和乏味. 如果数据源改变了,那么你的组件也不得不改变来适应新的数据源.

组件需要对现有的持久化储存系统或者数据源的实现足够透明,以便在向不同的产品,不同类型的储存系统,和不同类型数据源中进行迁移的时候,变的简单。

数据访问对象负责管理与数据源的连接,来获取和储存其中的数据。

暴露给客户端的DAO接口在低层数据源的实现发生改变时并不会随着改变,所以这种设计模式使得DAO可以适应不同的数据储存方式类型而不影响客户端和商业组件.最主要的, DAO还在组件和数据源之间扮演着协调者的角色.


以下是DAO设计模式中各个模块的解释:

1 BusinessObject指的是数据客户端,他通常需要去访问数据源以获得数据或储存数据.一个BusinessObject除了访问数据源的servlet或者helper bean之外也可以是会话BEAN,实体BEAN以及一些其他的JAVA对象.

2 DataAccessObject 是这个设计模式的核心部分, DataAccessObject为BusinessObject抽象了底层的数据访问实现的细节,使得访问数据变得透明. BusinessObject还将数据的装载和储存交给了DataAccessObject进行代理.

3 DataSource他表示的是数据源的实现. 一个数据源可以是像关系型数据库管理体统这样的数据库,可以是面向对象型的数据库管理系统,可以是XML文档,也可以是简单文件等等. 当然他也可以是其他的系统,(遗留系统,大型主机),可以是服务(B2B服务,信用卡局服务)或者是像LDAP这样的数据库等.

4 TransferObject他代表的是传递对象,一般用于数据的载体. DataAccessObject使用传递对象来将数据返回给客户端. DataAccessObject也可以使用传递对象来从客户端接受数据来将原先数据库中的数据进行更新.

DAO设计模式可以通过采用抽象工厂和工厂方法模式来变得非常的灵活.

当底层数据存储实现不需要发生改变时,该策略可以使用工厂方法设计模式实现,来产生应用中所需的DAO.

当底层数据储存实现不得不发生变化的时候, 我们可以用抽象工厂模式来实现这个策略.

在当前情况,可以提供一个抽象的DAO工厂对象(抽象工厂),用他来创建不同类型的具体DAO工厂,每一个工厂都各自支持一种不同的数据持久化储存的实现. 一旦你为某个特定的实现获得了具体的DAO工厂,你则可以用这个工厂来产生那个特定实现所支持和实现的DAO对象.


1 采用工厂方法设计模式

如果一个DAO 工厂只为一个数据库的实现,(比如ORACLE)而创建很多的DAO的时候,实现该策略时,我们考虑采用工厂方法设计模式. 假设该工厂类创建了CustomerDAO, AccountDAO, orderDAO 等一些对象。

2 使用抽象工厂设计模式:

如果考虑为三种不同类型的数据库来实现这个策略,我们可以考虑采用抽象工厂设计模式. 假设. 这个工厂创建了CustomerDAO, AccountDAO, orderDAO的一系列的DAO, 该策略运用了在抽象工厂中产生的工厂类中的工厂方法的实现.


----------------------------------------------------------------


代码说明:

我们以使用抽象工厂的设计模式来对付多种类型数据库为例,在以下的例子中只具体列出CLOUDSCAPE 数据库类型的DAO设计模式的具体实现,其他类型数据库DAO设计模式的实现大同小异.

1 // 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.
// 所有实现该抽象工厂的工厂类中必须有的方法,用这些方法来创建具体的DAO类.
  public abstract CustomerDAO getCustomerDAO();
  public abstract AccountDAO getAccountDAO();
  public abstract orderDAO getOrderDAO();

//该抽象类的静态方法,用他来创建其他具体的DAO工厂类
  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;
    }
  }
}


2 以下是Cloudscape DAO FACTORY 类的实现,在他里面实现了该类型数据库的连接,以及实现了他所继承的抽象工厂类中所必须实现的那些方法,在这些方法中创建具体的DAO对象.

// 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
//建立Cloudscape 连接
  public static Connection createConnection() {
    // Use DRIVER and DBURL to create a connection
    // Recommend connection pool implementation/usage
  }
//创建 CustomerDAO 对象 当然返回的是一个该类实现的接口,他的好处就是实现了实现细节的隐蔽.
  public CustomerDAO getCustomerDAO() {
    // CloudscapeCustomerDAO implements CustomerDAO
    return new CloudscapeCustomerDAO();
  }
//创建 AccountDAO 对象 当然返回的是一个该类实现的接口,他的好处就是实现了实现细节的隐蔽.
  public AccountDAO getAccountDAO() {
    // CloudscapeAccountDAO implements AccountDAO
    return new CloudscapeAccountDAO();
  }
//创建 orderDAO 对象 当然返回的是一个该类实现的接口,他的好处就是实现了实现细节的隐蔽.

  public orderDAO getOrderDAO() {
    // CloudscapeOrderDAO implements orderDAO
    return new CloudscapeOrderDAO();
  }
  ...
}

3 以下代码就是具体DAO类实现的接口也就是CloudscapeCustomerDAO()实现的接口: CustomerDAO .在该接口中定义了所有的业务方法.


// 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 selectCustomersTO(...);
  ...
}

4 以下CloudscapeCustomerDAO类实现的具体业务细节和数据操作细节, 他是要向客户数据端隐蔽的.

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 Transfer Object if found,
    // return null on error or if not found
  }
  public boolean updateCustomer(...) {
    // implement update record here using data
    // from the customerData Transfer 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 selectCustomersTO(...) {
    // implement search customers here using the
    // supplied criteria.
    // Alternatively, implement to return a Collection
    // of Transfer Objects.
  }
  ...
}

5 下面的代码是数据客户端向DAO中传输数据的, 他其实就是一个JAVABEAN;

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

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


6最后就是客户数据端对这个设计的应用:
...
// 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 Transfer Object.
Customer cust = custDAO.findCustomer(...);
// modify the values in the Transfer 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("New York");
Collection customersList =
  custDAO.selectCustomersTO(criteria);
// returns customersList - collection of Customer
// Transfer Objects. iterate through this collection to
// get values.


1 创建一个抽象工厂类,他包含两个重要的部分: 第一部分是 一些抽象方法,这些方法是所有实现该抽象工厂的具体工厂类所必须实现的. 第二部分 就是一个静态方法,该方法来创建一个具体类型数据源的工厂对象,比如文中的CloudscapeDAOFactory().

2 然后,分别创建各个类型数据源的工厂类,(本文以CloudscapeDAOFactory为例).在这个工厂类中里面也有两个重要组成部分: 第一部分就是实现在他继承的那个抽象工厂类中的左右抽象方法,在该方法中创建具体的DAO对象(这些对象的类在第4不具体定义实现),本文中三个方法分别创建了3个具体的DAO对象,当然为了实现细节的隐蔽,这些方法返回的是这些具体DAO类门实现的接口(这些接口在第3步实现).

3 定义具体DAO类的接口,并在接口中定义所有的业务方法,和数据操作方法.

4 定义具体的DAO类,在这个类中才是实际的业务方法,和数据的操作的实现.

5 定义数据传输对象,他是用来在客户端和DAO之间传递数据的,他其实就是一个JAVABEAN.

6 完成以上5步之后我们就可以在数据客户端使用以上由DAO设计模式定义好的各个类了(见最后一个代码例子块).

以上6步大家在编程的时需具体体会,一般来说,数据库中的一个表就可以对应一个数据传递类也就是在第4步中定义的那个类,类中的属性就是表中的字段,然后加上相应的GET,SET 方法. 然后再按模式和以上步骤来定义具体的类.

本篇文章来源于 :刘志猛博客 原文链接:http://www.liuzm.com/article/java/9618.htm
http://www.liuzm.com
分享到:
评论

相关推荐

    J2EE之DAO设计模式

    ### J2EE之DAO设计模式详解 #### 一、引言 在J2EE开发过程中,DAO(Data Access Object)设计模式是一种非常重要的模式,它主要用于处理数据访问逻辑,并将其与业务逻辑分离。通过这种方式,我们可以更好地管理和...

    J2EE设计模式与Structs详解

    通过这份"J2EE设计模式与Structs详解"资料,读者可以深入理解如何在实际项目中运用这些设计模式,以及如何借助Structs框架提升开发效率。精通Struts技术文档则结合实践经验,为开发者提供了宝贵的项目开发指导,包括...

    DAO设计模式DAO设计模式

    ### DAO设计模式详解 #### 一、概述 数据访问对象(Data Access Object,简称DAO)设计模式是一种在软件工程特别是企业级应用开发中非常常见的设计模式。它的主要目的是分离业务逻辑与数据访问逻辑,使系统架构...

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

    《J2EE核心模式》是一本深入探讨Java企业级应用程序开发的经典著作,其中DAO(Data Access Object)模式是重要的设计模式之一。DAO模式的主要目的是为了解耦业务逻辑层和数据访问层,提高代码的可维护性和可测试性。...

    J2EE体系结构及其主要设计模式

    ### J2EE体系结构及其主要设计模式 #### J2EE体系结构 **1.1 J2EE产生前提** 随着企业应用系统的不断复杂化以及分布式应用程序的需求增加,传统的开发方式已经无法满足新的需求。例如,当应用程序需要跨越多个...

    java设计模式:DAO模式.doc

    【Java设计模式:DAO模式详解】 DAO(Data Access Object)模式是一种常见的软件设计模式,它在J2EE应用中被广泛使用,旨在分离业务逻辑层与数据访问层,提高代码的可复用性和可维护性。DAO模式的核心思想是通过...

    J2EE的SSH配置详解

    SSH配置是实现这一框架的关键步骤,涉及到Struts的MVC设计模式、Spring的依赖注入以及Hibernate的数据持久化管理。 **一、Struts配置** 1. **struts-config.xml**:这是Struts框架的核心配置文件,定义了应用程序...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发容器 2.5 小结 第二篇 建立和使用J2EE的开发平台 第三章 建立Java的开发平台 3.1 建立Java的开发环境 3.1.1 下载JDK 3.1.2 安装JDK 3.1.3 设定Path...

    设计模式入门及详解pdf版

    本资源包含两份PDF文档,分别面向初学者和进阶者,旨在帮助读者理解并掌握设计模式的核心概念,特别是在Java和J2EE环境下。 对于初学者来说,理解设计模式的基本概念至关重要。设计模式并不是特定的代码或库,而是...

    J2EE 学生信息管理系统

    在开发过程中,开发人员可能会采用MVC(Model-View-Controller)设计模式,这是一种常见的软件设计模式,有助于保持代码的结构清晰和模块化。Model代表数据模型,View负责显示数据,而Controller处理用户请求,协调...

    DAOPattern(设计模式).pdf

    ### 数据访问对象(DAO)设计模式详解 #### 引言 设计模式是在软件工程领域内广泛应用的一种编程思想,它能够帮助开发人员解决在系统设计过程中遇到的一些常见问题。《DAOPattern(设计模式).pdf》这本资料深入探讨...

    j2ee 核心模式

    **J2EE核心模式详解** J2EE(Java 2 Platform, Enterprise Edition)是Java平台的一个版本,专门针对企业级应用开发。它提供了一个多层架构的框架,用于构建可扩展、高性能、高可用性的分布式应用程序。J2EE的核心...

    《程序天下:J2EE整合详解与典型案例》光盘源码

    2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发容器 2.5 小结 第二篇 建立和使用J2EE的开发平台 第三章 建立Java的开发平台 3.1 建立Java的开发环境 3.1.1 下载JDK 3.1.2 安装JDK 3.1.3 设定Path...

    Core J2EE Patterns核心模式第二版源码

    《Core J2EE Patterns》是Java企业级应用开发的经典之作,它详细介绍了在J2EE平台上构建可扩展、高效、可维护的系统所使用的最佳实践和设计模式。这本书的第二版源码对于深入理解J2EE开发中的核心概念和技术具有极高...

    JSP+J2EE+MVC模式的学生信息管理系统

    "JSP+J2EE+MVC模式的学生信息管理系统"是一个使用了Java服务器页面(JSP)、Java企业版(J2EE)技术,并遵循模型-视图-控制器(MVC)设计模式的项目。这个系统主要用于管理学生的信息,提供了对数据的增删查改功能。...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (3)

    2.3.2 使用MVC模式的不足之处 2.4 目前市场上常见的轻量级J2EE开发容器 2.5 小结 第二篇 建立和使用J2EE的开发平台 第三章 建立Java的开发平台 3.1 建立Java的开发环境 3.1.1 下载JDK 3.1.2 安装JDK 3.1.3 设定Path...

    J2EE项目开发模板

    1. **MVC模式(Model-View-Controller)**:这是一种设计模式,用于分离业务逻辑、视图展示和用户交互。在J2EE中,模型由EJB实现,视图通常为JSP,控制器可以是Servlet或JSF(JavaServer Faces)组件。 2. **DAO...

    J2EE课程设计任务书

    - **面向对象程序设计方法的应用:** 在已有的面向对象编程知识基础上,进一步掌握并应用MVC(Model-View-Controller)设计模式。 - **系统开发全过程的理解:** 包括需求分析、组件设计、模块分解、编码实现与...

    j2ee课件j2ee课件

    J2EE开发中常见的设计模式有MVC(Model-View-Controller)、DAO(Data Access Object)、Service Layer、Front Controller等,这些模式有助于提高代码的可维护性和可扩展性。 **6. 最新版本与更新** 随着技术的...

Global site tag (gtag.js) - Google Analytics