DAO (Date Aceess Object) 模式

<script type="text/javascript"> google_ad_client = "pub-8800625213955058"; /* 336x280, 创建于 07-11-21 */ google_ad_slot = "0989131976"; google_ad_width = 336; google_ad_height = 280; // </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script> 本文参考了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规范中的本地接口.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值