锁定老帖子 主题:关于DAO层的疑惑!!!平地一声雷
精华帖 (0) :: 良好帖 (1) :: 新手帖 (14) :: 隐藏帖 (6)
|
|
---|---|
作者 | 正文 |
发表时间:2011-08-03
事实上,在设计DAO层时,还有一个问题,是我们经常忽略的问题,那就是并发。如果你的设计中,确实考虑这个问题的话,将会发现这是一件非常棘手的事情。在软件这个行业,我觉得,真正的真理是,没有银弹,通用的设计,往往是以牺牲灵活性为代价的,而且随着业务复杂性的增加,你会发现,你愈加的力不从心。具体问题,具体分析,不是为了设计而设计,不是为了美学而设计,实事求是。
|
|
返回顶楼 | |
发表时间:2011-08-03
最后修改:2011-08-03
feiyang404 写道 小鑫。 写道 通用Dao里只是装着各个通用的方法,每个Model还应该有个属于自己的Dao,用来存储自己特有的方法. 是有个BaseDAO,有个BaseDAOImpl,然后xxxDAO,xxxDAOImpl? 这样的话,接口继承关系应该怎么写?实现关系应该怎么写? 我以前也有过这样的想法,但是这样xml配置文件还是要针对每个xxxDAO做配置,很是麻烦,如果这样,我到宁愿牺牲耦合性,在Service层构造HQL,然后传到DAO层来.写一个HQL应该比写一个DAO类简单吧? 通用接口 -> BaseDao 通用接口实现类 -> BaseDaoImpl 假如有个Model -> User UserDao 继承 BaseDao UserDaoImpl 继承 BaseDaoImpl 实现 UserDao 其实这些Model的Action,Biz,Dao,xml配置文件,开始的时候都是一样的. 完全可以写个小程序,一次性全部生成. 在创建好一个新的Model的时候,生成一下就全都有了. 等有特殊的方法的时候,再另行添加. |
|
返回顶楼 | |
发表时间:2011-08-03
使用spring的hibernateTemplate和jdbcTemplate,在xml配置这两个就ok了呀。。然后弄一个baseDao,注入这两个,以后所有model的dao都继承baseDao
|
|
返回顶楼 | |
发表时间:2011-08-03
修改数据库而不需要修改service的应用我还没遇到过,所以我把hql的组装放到service里,dao层使用一个泛型dao和一堆接口。
对于很多项目,service层做的最主要工作就是组装sql。只有当项目业务逻辑复杂到一定程度的时候才有必要把hql、sql这些放到dao层。 |
|
返回顶楼 | |
发表时间:2011-08-03
我目前对Dao的设计考虑是这样的。
使用ORM框架,设计一个只有基本CRUD的Dao接口。 public interface BaseDao<T> { public void perser(T t); public void mager(T t); public void delete(T t); public T find(Object id); } 大概是这个样子。然后写一个实现,用来实现基本的CRUD操作。 针对每个对象的专有Dao接口,是在继承BaseDao的基础上完成的。例如: public interface ADao<T> extends BaseDao { public List<T> findAll(); public List<T> findByXXX(Map params); } 然后这个专有Dao的实现是组合了基本BaseDao实现的。对基本CRUD进行代理,并实现自己的专有方法。 public class ADaoImpl implements ADao { private BaseDao bDao; public void delete(Object t) { bDao.delete(t); } public Object find(Object id) { return bDao.find(id); } public void mager(Object t) { bDao.mager(t); } public void perser(Object t) { bDao.perser(t); } public List findAll() { ... } public List findByXXX(Map params) { ... } } 如果考虑到ORM框架和Dao的解耦。我的建议是把HQL这样的语句单独存放到配置文件中。在Dao中将和ORM打交道的部分独立成一个接口抽象的查询管理器。查询的时候方法传入语句Key和参数。查询管理器从配置文件中获取语句,然后和参数组合成查询请求发送给ORM。这样就可以做到Dao和ORM的解耦了。不过我目前这种想法只适合HQL这样的类SQl语句,如果是要建立对象进行查询的话,就不合适了。 |
|
返回顶楼 | |
发表时间:2011-08-03
最后修改:2011-08-03
我都把dao砍掉了,实施中哪有那么多时间切换数据库,直接ftl-action-service,弄那么多层,烦人.......
spring 现在有个项目,叫做data ,提供了基础的curd操作,看起来像是dao层的spring版............ |
|
返回顶楼 | |
发表时间:2011-08-03
kjj 写道 我都把dao砍掉了,实施中哪有那么多时间切换数据库,直接ftl-action-service,弄那么多层,烦人.......
spring 现在有个项目,叫做data ,提供了基础的curd操作,看起来像是dao层的spring版............ 类似,用公共的BaseDao,里面有一个JdbcDao基于JdbcTemplate,一个HibernateDao 基于HibernateTemplate 整个工程主要代码在jsp - action - service, service层控制事务,拼sql或hql |
|
返回顶楼 | |
发表时间:2011-08-03
用mybatis还有dao做什么,直接用它的map
|
|
返回顶楼 | |
发表时间:2011-08-03
Service层理论上来说应该是纯粹的调用Dao里面的方法处理持久工作,而不是去写SQL或者HQL。
|
|
返回顶楼 | |
发表时间:2011-08-03
您好, 你的想法我很赞同, 同时有个问题想咨询下,希望你能给我些建议。
1、关于dao层 不同的bean对应的dao实际上是单例的, 跟据你的想法做成通用的 我可不可以只声明一个dao做成单例的 供service层调用呢,这样可以吗? 如果可以,当然dao层存在属性时会存在资源共享的问题, 这个问题应该如何解决呢? 2、S2SH 中, 事务管理想通过xml的切面进行统一管理,而bean的声明和注入想通过annotation 方式, 但是annotation很难注入父类中的属性,虽然可以用变通的方式(子类中声明set方法并引用父类待注入的属性……),但是并不能起到简化代码的作用。实际开发采用什么方式好呢? xml还是annotation ? |
|
返回顶楼 | |