Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1532171
  • 博文数量: 3500
  • 博客积分: 6000
  • 博客等级: 准将
  • 技术积分: 43870
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-03 20:31
文章分类

全部博文(3500)

文章存档

2008年(3500)

我的朋友

分类:

2008-05-04 20:57:41

一起学习
本文参考了Sun 模式设计 blueprint 站点上的 DAO 模式[英文原文],主要描述了 Data Access Object设计思路和实际应用的注意点,DAO 是为了 把 商业逻辑 从 数据操作逻辑 驱除,提高数据源的适应性,data source 的类型可以独立并简单的升级更换. 1.设计结构: DAO 在 设计上使用了 桥 和 适配 的模式,可以参看下图: a.BusinessObject 是你的商业逻辑对象 ,可以是EJB 或是 简单的 Java class, 它的商业方法去调用 DAO 接口 中数据操作 方法。(我认为所谓桥式 就是 使用接口 动态的指代 一些 性质相近的类 的模式,注意 businees object 与 DAO 是 关联association,不是依赖dependency ,这体现了DAO 接口 中数据操作 方法多少受 Businees object 的影响 ) b.DAO 的实现类 ,一方面 作为 resource 的 adaptor (这里 resource 类指 不同数据库的 JDBC API),另一方面成为实现 DAO 接口. c.为了使 应用程序可以在 发布的时候 可配置 数据源,就还要 编写 DAOFactory class ,利用配置文件中的设置,通过JNDI,返回具体的 DAO 实现类. 2.我们看看DAO 应用流程: OrderEJB.java 中: public Integer ejbCreate(Collection lineItems, Address shipToAddr,....) throws CreateException{ orderDetails = new OrderModel(lineItems, shipToAddr,...); // ... OrderDAO dao = OrderDAOFactory.getDAO(); int id = dao.create(this.orderDetails); // ... } OrderDAOFactory.java 中: public static OrderDAO getDAO() throws OrderDAOSysException { // ... InitialContext ic = new InitialContext(); String className = (String) ic.lookup(JNDINames.ORDER_DAO_CLASS); orderDao = (OrderDAO) Class.forName(className).newInstance(); // ... return orderDao; } 比如使用了OrderDAOOracle.java,那其中实现 create(orderDetails) 的 方法: Integer ceate(orderDetails){ //Initialize the connecttion from connection pool or normal datasource //dbConnection=.... //some works convert orderDetails to sql // it can use some helper class to delfine how do this work stmt = dbConnection.prepareStatement(queryStr); resultCount = stmt.executeUpdate(); //... } 3.DAO 的优缺点: 优点: 提高发布的适应性,只要调整发布配置,就可以调整 数据源.提高了扩展性 ,甚至 可以使用多数据源。 缺点: 增加了复杂性,只要增加一种数据源,就要增加一种DAO 的 实现类 不过即使你只需要一种数据源,DAO 的某些方面也是值得应用的,比如使用 xxxfactory 类在运行中动态的 获得 数据实现类 ,并分离出 数据操作. J2ee 开发者对 DAO 的 深入应用: a.各种数据库的 事务有不同之处,你需要 编写 helper 类来描述 这些,通知系统该如何办。 b.处理高内存的应用,对只读的数据做cache 操作,降低多余的数据量。 c.采用非数据库的数据源,在 blueprint 的java Pet Store例子采用了 XML 数据源,可参考范例. d.CMP vs DAO? 其实两者很象 ,由于一些服务器厂商的 工作,CMP 加入的cahce 加速。(原文的作者认为 DAO 只是比CMP 发布简单,我个人认为 如果你认为 EJBQL 和 CMP 不如你写的 BMP DAO 你自己的 cache 处理 并处理好 激化和砘化的操作,我鼓励你用后者,我觉得 CMP 扩展性是冗余的 ,sql 更加 灵活。也可能是我对 CMP 认识有限) e.改用轻量级的实体bean(ejb2.0规范中),可参看EJB2.0规范中的本地接口. 下载本文示例代码


DAO (Date Aceess Object) 模式DAO (Date Aceess Object) 模式DAO (Date Aceess Object) 模式DAO (Date Aceess Object) 模式DAO (Date Aceess Object) 模式DAO (Date Aceess Object) 模式DAO (Date Aceess Object) 模式DAO (Date Aceess Object) 模式DAO (Date Aceess Object) 模式DAO (Date Aceess Object) 模式DAO (Date Aceess Object) 模式DAO (Date Aceess Object) 模式
阅读(173) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~