新系统中对DAO做了新的设计,基本思想为:
因为所有的数据存取操作只有四种:
新增(insert)
更新(update)
删除(delete)
查询(query)
而前三种可以再次抽象成一种操作:更新(update)
故而本系统DAO采用如下机制:
一个DAO抽象基类,高度抽象,仅提供有限的几个公有方法,所有DAO子类
将都继承自此类并实现两个抽象方法:
public abstract int update(opType);
public abstract Collection query(opType);
update涵盖了所有的更新操作,不同的操作由opType指定并由相应子类实现
query涵盖了所有的查询操作,以返回Collection结果
比如,新增加记录可用update(DAO.INSERT)来完成,而具体如何完成则是
实现类的职责,调用者只关心结果...
又入:final DAO accountDAO = DAOFactory.findDAO(AccountDAO.KEY);
accountDAO.addParam("id","1");
final Collection accounts = accountDAO.query(AccountDAO.SELECT_ACCOUNT_BYID);
...
在Action中,使用DAOFactory.findDAO(name)取具体实现DAO类,在工厂
实现中采用了缓存,即将使用过的DAO实例保存在一个dao pool中以提高
重用率,而所有的DAO都使用类似ActionMapping的机制由配置文件指定
具体使用的数据源和实现类:
<dao_mappings>
<dao name="UserDAO" currentType="mysql">
<dao_impl type="mysql"
implClass="org.skyinn.quasar.webapp.example.UserDAOMysqlImpl"/>
<dao_impl type="oracle"
implClass="org.skyinn.quasar.webapp.example.UserDAOOracleImpl"/>
</dao>
</dao_mappings>
因此在切换数据库或新增、修改、移除功能模块时将不影响原有系统,解决了抽象工
厂模式在增加新产品方面的困难
问题:
1,DAO高度抽象了所有的操作,可能因为太灵活而带来一些问题,
2,本系统只使用一个singleton的DAOFactory,不知道在处理大量请求时是否会有问题,有待测试,
3,dao pool中的DAO实例是否需要对某些方法同步?
4,因为使用了配置文件来指定DAO映射,因而可能出现重名DAO,如何从系统角度来保证
命名的唯一性?(当前的解决办法时子类需实现一个DAO接口,其中定义了标识该DAO的常量)
请高手指点,谢了先:)