论坛首页 Java企业应用论坛

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

浏览 24793 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (14) :: 隐藏帖 (6)
作者 正文
   发表时间:2011-08-03  
http://book.douban.com/subject/1629512/
解决你的问题
0 请登录后投票
   发表时间:2011-08-03  
小鑫。 写道

通用Dao里只是装着各个通用的方法,每个Model还应该有个属于自己的Dao,用来存储自己特有的方法.

+1
0 请登录后投票
   发表时间:2011-08-03  
仅此而已 写道
楼主是否精通flex呢? 小弟想学,就是找不到师傅,各种问题各种有! 呵呵


我不会flex,不过我们部门有用,有人会,我可以给你推荐一下
0 请登录后投票
   发表时间:2011-08-03   最后修改:2011-08-03
DAO:
public interface StudentDao extends BaseDAO<Student>{

}

DAOImpl:
public class StudentDaoImpl extends BaseDAOImpl<Student> implements StudentDao{

}

Service:
public interface StudentService extends BaseService<Student, StudentDao>{

}
ServiceImpl:
public class StudentServiceImpl extends BaseServiceImpl<Student, StudentDao>implements StudentService{

}

大概就是这个样子,我们一直这样使用

在BaseDAO<Type>里定义了常用的CRUD方法,BaseDAOImpl<Type>实现BaseDAO这个接口中的所有方法,这样子就最大程度的达到代码复用,像上面的StudentDao,如果没有什么特殊的DAO操作,这个接口里面完全可以不用去定义什么方法了。
0 请登录后投票
   发表时间:2011-08-03  
edisonlv2010 写道
DAO:
public interface StudentDao extends BaseDAO<Student>{

}

DAOImpl:
public class StudentDaoImpl extends BaseDAOImpl<Student> implements StudentDao{

}

Service:
public interface StudentService extends BaseService<Student, StudentDao>{

}
ServiceImpl:
public class StudentServiceImpl extends BaseServiceImpl<Student, StudentDao>implements StudentService{

}

大概就是这个样子,我们一直这样使用


能不能说的详细点,或者把你的dao层,service层和xml文件发一份过来呢?谢谢了~
0 请登录后投票
   发表时间:2011-08-03   最后修改:2011-08-03
我现在的做法是  写一个泛型dao ,所有的modelDAO 都继承他  ,没有特殊的操作modelDAO  里面是没有代码的。 要有特殊的可以自己在modelDAO里面写。我觉得如果单纯的用通用dao 也会有问题,比如我突然想加以个方法了。但是不应该写到通用dao里面去。还是得新建一个,这样有的service直接使用通用dao 有的是用自己写的dao,这样我觉得不规范 ,本来没有的新加一个还得去该配置。所以我干脆全部都写一个modelDAO可能很多里面是没有代码的,但是为了规范。加方法也方便
至于配置麻烦  我推荐用注解
0 请登录后投票
   发表时间:2011-08-03  
你一个人在干活吧?如果在大公司,参考一下内部框架你会有很大的收获。

我目前的方法是定义一个commonDao,每个service里都有commonDao,当然如果你觉得这个也冗余那么可以定义个baseService,跟楼上有人说的baseDao的思想一样,基本的create,delete,update,getById,findByPage(),都有。

不过我们应该优先使用组合而非继承,使用组合的话耦合性很低,方便重用。继承产生依赖,应该慎用。
0 请登录后投票
   发表时间:2011-08-03  
energykey 写道
你一个人在干活吧?如果在大公司,参考一下内部框架你会有很大的收获。

我目前的方法是定义一个commonDao,每个service里都有commonDao,当然如果你觉得这个也冗余那么可以定义个baseService,跟楼上有人说的baseDao的思想一样,基本的create,delete,update,getById,findByPage(),都有。

不过我们应该优先使用组合而非继承,使用组合的话耦合性很低,方便重用。继承产生依赖,应该慎用。


commonDao满足不了的功能,比如很复杂的查询,通过单独的Dao吗?
0 请登录后投票
   发表时间:2011-08-03  
白糖_ 写道
feiyang404 写道

我个人认为,dao层只应提供数据持久化接口,和数据库,Service层均没有关系,如果持久化框架变了,比如不用Hibernate,而改用ibatIS,那么只需要将DAO里面的实现稍作改动,整个系统就可以流畅运行.所以,这就要求在Service层不要写HQL或者QBC,Service层专注调用DAO层接口为Action层提供服务,和DAO层无耦合.这样如果写一个通用DAO层的话,就会提高代码重用性,并且xml配置也很简洁,只要配置一个通用的dao就可以了,但是却使以牺牲灵活性为前提的,比如在Service层需要一个按属性查询的方法,那么在DAO层就要写where子句(where xxx=yyy),但是通用dao不可能知道xxx,怎么办呢?

 

如果通用DAO层接受Service层传来的HQL的话,那就会很容易写出一个灵活性高,重用性强的DAO通用层,但是这样又有了耦合性,持久化框架变化的话要改变的代码会很多,甚至可以说是牵一发而动全身.

 

这位朋友跟我的想法完全合到一块了,最初我就是用service直接调用BaseDao的方法,Hql都写到service中。

但是当我认真审视整个项目结构的时候,我发现问题很大:如果将Hibernate换成MyBatis,不止是整个Dao层要修改,Service层也要做大量改动,而且改动之后单元测试也要重新做。

目前我的考虑可能跟LZ一样:老老实实针对一个model写一个Dao,对service只提供接口,具体实现可以根据使用什么框架定制开发,这样做的好处是:

我可以写多套Dao接口的实现类:Hibernate的、Mybatis的、甚至JDBC的,对项目的转型和升级影响小很多。

如果项目做成产品,持久层该用什么框架完全要看实际情况,那时就可以轻松实现框架的切换。

 

以上是我的拙见,不知可行否。

同意上面的观点。

 

个人觉得Service层应该负责业务逻辑,需要持久化的时候,调用对应的DAO接口,至于DAO的实现则可根据不同ORM框架而不同。

初步考虑觉得可以一个总的DAOSupport类,负责具体不同ORM框架的初始化,配置等问题,并通过某种方式(例如,通过一个简单的枚举变量来标记)选用具体的ORM实现。其中sql语句的组装抽象到配置文件(这点Ibatis已经做的不错了)。每个DAOImpl实现都继承这个DAOSupport类。这样在使用的时候,只要通过具体的DAO类通过注解注入即可。

0 请登录后投票
   发表时间:2011-08-03  
习惯大于配置,  你dao是可以抽象的,   再者建议你用annotation,  少用配置。
0 请登录后投票
论坛首页 Java企业应用版

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