DAO是最为重要的J2EE模式之一,也是GoF Strategy 模式的一种特殊形式。DAO模式的用途是将“与持久化相关的代码”从业务逻辑中分离出来。
DAO设计中的问题
从便于复用的角度考虑,我们倾向于创建非常细粒度的方法;
然而从提高数据访问操作效率的角度考虑,DAO接口似乎又应该设计粗粒度(coarse-grained)的方法。
--我们推荐的做法是:业务对象需要什么粒度的数据访问,就在DAO接口中提供什么粒度的方法;只有在真正需要时才设计粒度更细的方法。
实践点:
一个基于web的应用程序按照逻辑分为三层:web层,业务层,数据访问层。
假设有OrderManager这样一个业务对象,它需要存储一个新建定单,并对存货数据库做相应的更新。当然这样一个业务对象通常会包含相当复杂的业务逻辑。:请看简单示例:
public class OrderManager
{
private OrderDao orderDao;
public void setOrderDao(OrderDao orderDao)
{
this.orderDao = orderDao;
}
public void placeOrder(Order order)
{
//set business flags of order
//
orderDao.storeOrder(order);
orderDao.updateInventory(order);
}
}
public interface OrderDao
{
void storeOrder(Order order);
void updateInventory(Order order);
}
具体实现类可以用JDBC,Hibernate还是别的什么持久化技术。
public class JdbcOrderDao implements OrderDao{
private DataSource dataSource;
public void setDataSource(DataSource dataSource){
this.dataSource = dataSource
}
public void storeOrder(Order order)
{
//具体实现
}
public void updateInventory(Order order)
{
//具体实现
}
}
浙公网安备 33010602011771号