论坛首页 Java企业应用论坛

关于DAO层的疑惑!!!平地一声雷

浏览 24789 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (14) :: 隐藏帖 (6)
作者 正文
   发表时间:2011-08-04   最后修改:2011-08-04
在讨论的同时。请考虑有关事务的问题。
0 请登录后投票
   发表时间:2011-08-04  
hanzhicheng754 写道
事实上,在设计DAO层时,还有一个问题,是我们经常忽略的问题,那就是并发。如果你的设计中,确实考虑这个问题的话,将会发现这是一件非常棘手的事情。在软件这个行业,我觉得,真正的真理是,没有银弹,通用的设计,往往是以牺牲灵活性为代价的,而且随着业务复杂性的增加,你会发现,你愈加的力不从心。具体问题,具体分析,不是为了设计而设计,不是为了美学而设计,实事求是。

+1
0 请登录后投票
   发表时间:2011-08-04  
小鑫。 写道
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的时候,生成一下就全都有了.
等有特殊的方法的时候,再另行添加.


嗯!一般采用这种脚手架自动生成代码,效率会提高一大截
0 请登录后投票
   发表时间:2011-08-04  
基本的CRUD容易生成,包括分页查询,复杂条件查询。可以继承公共泛型类或者代码生成的方式。如果用后来的各种一站式框架,这一步也可以省略了。
Dao一般用来屏蔽持久层具体实现技术,jdbc换orm再换webservice等等。当然一般换技术可能性不算太大,但还是真有,我就换过几次。dao封装了数据访问可以复用的各种方法。
service一般可以用来做数据库事务的边界,提高某些业务逻辑的复用性。如果没有事务要求,又没有一点点可复用的可能,我就直接action里面调dao层了。。方便。。见笑了。

以上是个人总结,觉得dao和service还确实有他作用,结构清晰,思路明确。之前就有多人多次质疑Dao,没想到现在还能引起大家的兴趣。
0 请登录后投票
   发表时间:2011-08-04  
看了很久终于理清了你的问题
第一、为什么不再model层中添加最基本的dao操作方法。原因你已经分析了,当然原因不知这些,model层的潜在含义就是包含属性及状态,但并不包括对自身的操作,它只是一个模型。解决方案你也说了,也就是一个通用的dao层,传递泛型。
第二、怎么样才能让dao层处理更加灵活。比如说是更换了架构,可以几乎不用太多修改dao层,比如由hibernnate框架更换成ibatis,更换了架构不是稍微修改了dao就可以再运行的,如果这样可以的话,那你的程序要么是很小或是只用到hibernnate很小的一部分特性。否则不会出现hibernnate和ibatis两种架构框架,而只是出现版本差异。修改架构的代价很可能就是相关的代码要全部重新添加,而且涉及到复杂的查询(由业务决定),dao层是不可能不变化的。
另外,经验不是看别人代码得来的,而是自己实践加思考得来的。lz的经验论不敢苟同。
0 请登录后投票
   发表时间:2011-08-04  
把dao层进行封装 get  getList  getPage  save  update  delete 通过泛型,继承做到dao层的通用性,再配上相应的代码生成工具(自己写很简单),基本上dao层不需要写什么代码。
0 请登录后投票
   发表时间:2011-08-05  
我的做法是
每种实体一个DAO
不在Action或Service层拼HQL,而是在DAO中拼
这样才能做到上层与DAO松耦合(用HQL还是SQL还是其他,是由DAO的实现决定)
0 请登录后投票
   发表时间:2011-08-05  
DAO 多是CURD  业务都放业务层了,所有都是用泛型接口做通用的DAO
0 请登录后投票
   发表时间:2011-08-06  
有很复杂的查询,hibernate封装都可以很好的解决吧criteria的各种功能只要封装好点有多复杂应该就可以了,顺便介绍一下我们公司的dao层,
大概一个通用dao,一个jdbctemplate,hibernatetemplate,jdbc操作并不多大部分使用hibernate来完成。CRUD各个操作都有一个接口,比如IAddDao, IQueryDao,IDelDao,IUpdateDao等,还提供一个分页接口,其中分页查询部分使用querydao的查询,代码复用性很高,但是大部分封装的是hql的查询实现。现在新项目尝试用spring的criteria的功能来满足一些复杂的用途。话说criteria如此强大的东西几乎可以满足各种用途了,不过发现使用的人并不多,大多数停留在hql的使用上。
0 请登录后投票
   发表时间:2011-08-07   最后修改:2011-08-07
引用
最后,我希望大家不要用经验和我谈问题,经验都是看别人的代码学来的,真正思考过这个问题的才有发言权..


楼主有空研究一下Grails或者Spring Roo吧

与其用自己有限的智慧在这“真正的思考”,还不如学习别人的经验,多看别人的代码。
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics