2007-09-06
关于dao service层设计的心得
关键字: dao service图片太小了 看不清 请看附件
我们先看下面的类图
这是一个常用的dao层设计:
DAO (interface)
UserDAO extends DAO (interface)
BaseDAOHibernate implements DAO
UserDaoHibernate extends BaseDAOHibernate implements UserDao
采用这样的设计是为了提高代码的复用,在本例中就是基本的CRUD方法的复用
我们分析一下代码是怎么样被复用的
我们看一下中间的两个class :UserDao 和 BaseDaoHibernate 他们跟DAO接口都有直接的关系 一个是继承 一个是实现,换句话说他们都对DAO进行了扩展,UserDao是横向(接口)的扩展,BaseDAOHiberate是纵向的扩展,横向和纵向都扩展了之后要怎样合二为一呢?这个问题由UserDAOHibernat来解决了
通过看上面的图可以看出UserDAO 和 BaseDAOHibernat是作为一个中间层存在的,最终目的是让UserDAOHibernate拥有DAO接口的CRUD操作。
我们再来看下面这个图,是不是跟上图有着惊人的相似 其实仔细看一下这两个图完全的一样,目的也是复用CRUD操作
那么由此我们可以推出什么呢?这个例子能够得出什么结论呢?
凡是对底层的代码进行扩展都可以通过这种横向和纵向的方式来进行
- 12:57
- 浏览 (4653)
- 论坛浏览 (9608)
- 评论 (18)
- 相关推荐
评论
bluemeteor
2008-08-29
回复
ecsun 写道
泛型 DAO有很多开源项目实现在很好,比如我们熟悉的 Appfuse2.0, SpringSide,以及bba96等,都做了很好的实现,我们完全可以拿来主义嘛.不过做人要厚道啊,拿来用可以,要"守法"啊~~~~~~~~
泛型DAO可以理解为是一种简单、明了的设计模式,没有什么守法的问题.
fantasybei
2008-08-29
回复
sifeng618435 写道
UserDaoHibernate extends BaseDAOHibernate implements UserDao这里是不是有点怪
BaseDAOHibernate 已经实现了UserDao了,
UserDaoHibernate 实现UserDao就不用了吧
BaseDAOHibernate 已经实现了UserDao了,
UserDaoHibernate 实现UserDao就不用了吧
BaseDAOHibernate 只实现了DAO,没有实现UserDAO
晕,我的想法跟搂主不谋而合,看来我进步了,呵呵
只不过我的出发点是节省开发时间,自己写个脚本,可以由Bean自动生成
UserDao和UserDAOHibernate
只不过我的出发点是节省开发时间,自己写个脚本,可以由Bean自动生成
UserDao和UserDAOHibernate
cindy_taozhiang
2008-03-28
回复
seablue_xj 写道
我觉得还是加入service层比较好,如果是能大量使用的业务,责将业务假如到dao层,将dao层设计成富模式,相反,如果不是大量使用的,则将业务设计到service层中,dao层中使用贫血设计模式,
嗯. 这种想法不错
sifeng618435
2007-12-05
回复
UserDaoHibernate extends BaseDAOHibernate implements UserDao这里是不是有点怪
BaseDAOHibernate 已经实现了UserDao了,
UserDaoHibernate 实现UserDao就不用了吧
BaseDAOHibernate 已经实现了UserDao了,
UserDaoHibernate 实现UserDao就不用了吧
seablue_xj
2007-12-01
回复
我觉得还是加入service层比较好,如果是能大量使用的业务,责将业务假如到dao层,将dao层设计成富模式,相反,如果不是大量使用的,则将业务设计到service层中,dao层中使用贫血设计模式,
yangdefeng95802
2007-11-22
回复
realorg 写道
gordon@java 写道
应该是Dao/BaseDAOHibernate是对所有对象crud的操作都能工作的,其中crud某些方法的参数会包括Class cls. UserDao/UserDaoHibernate是专门针对user类的,这个的crud是不需要传入Class的,比如直接给id或者条件就好,不需要User.class,这样的封装对于使用UserDao的代码会好些
Dao可能的方法
public T findById(Class<T> cls,Long id)
对应的UserDao的方法
public User findById(Long userId)
Dao可能的方法
public T findById(Class<T> cls,Long id)
对应的UserDao的方法
public User findById(Long userId)
确实,偶也觉得应当这样理解比较合适。
gordon@java 写道
应该是Dao/BaseDAOHibernate是对所有对象crud的操作都能工作的,其中crud某些方法的参数会包括Class cls. UserDao/UserDaoHibernate是专门针对user类的,这个的crud是不需要传入Class的,比如直接给id或者条件就好,不需要User.class,这样的封装对于使用UserDao的代码会好些
Dao可能的方法
public T findById(Class<T> cls,Long id)
对应的UserDao的方法
public User findById(Long userId)
Dao可能的方法
public T findById(Class<T> cls,Long id)
对应的UserDao的方法
public User findById(Long userId)
确实,偶也觉得应当这样理解比较合适。
泛型 DAO有很多开源项目实现在很好,比如我们熟悉的 Appfuse2.0, SpringSide,以及bba96等,都做了很好的实现,我们完全可以拿来主义嘛.不过做人要厚道啊,拿来用可以,要"守法"啊~~~~~~~~
我的做法是首先让Entity全部都实现一个空接口 Entityable
然后定义基Dao接口
public interface BaseDao<T extends Entityable> {
T find(Object primaryKey);
void create(T t);
void modify(T t);
void delete(T t);
}
然后其他子接口一律继承BaseDao<T>
public interface AccountDao extends BaseDao<Account> {
}
实现的时候BaseDao用BaseDaoImpl去实现
而AccountDao则用AccountDaoImpl extends BaseDaoImpl implements AccountDao去实现
不知道这样的做法是否合理呢~
然后定义基Dao接口
public interface BaseDao<T extends Entityable> {
T find(Object primaryKey);
void create(T t);
void modify(T t);
void delete(T t);
}
然后其他子接口一律继承BaseDao<T>
public interface AccountDao extends BaseDao<Account> {
}
实现的时候BaseDao用BaseDaoImpl去实现
而AccountDao则用AccountDaoImpl extends BaseDaoImpl implements AccountDao去实现
不知道这样的做法是否合理呢~
hyhongyong
2007-09-30
回复
不错,UserDao是接口扩展,BaseDAOHibernate是抽象类扩展。
gordon@java
2007-09-26
回复
应该是Dao/BaseDAOHibernate是对所有对象crud的操作都能工作的,其中crud某些方法的参数会包括Class cls. UserDao/UserDaoHibernate是专门针对user类的,这个的crud是不需要传入Class的,比如直接给id或者条件就好,不需要User.class,这样的封装对于使用UserDao的代码会好些
Dao可能的方法
public T findById(Class<T> cls,Long id)
对应的UserDao的方法
public User findById(Long userId)
Dao可能的方法
public T findById(Class<T> cls,Long id)
对应的UserDao的方法
public User findById(Long userId)
xly_971223
2007-09-06
回复
huangpengxiao 写道
引用
凡是对底层的代码进行扩展都可以通过这种横向和纵向的方式来进行
这个部分的扩展?
BaseDAOHibernate implements DAO?
如果这个算纵向? 横向是.....?
横向是UserDao 对接口进行扩展
huangpengxiao
2007-09-06
回复
引用
凡是对底层的代码进行扩展都可以通过这种横向和纵向的方式来进行
这个部分的扩展?
BaseDAOHibernate implements DAO?
如果这个算纵向? 横向是.....?
发表评论
该博客是同时发布到论坛的,无法评论在论坛已被锁定的帖子
我的相册
u=3528569133,1587051000&gp=38.jpg
共 2 张
共 2 张
最新评论
-
hibernate 多对多只删除中 ...
...
-- by xiangdian007 -
jstl c:forEach嵌套使用
写的好.要找的就是这个
-- by zhengbin917943 -
最近面试的几家公司
NHN的情况和自己在FF的面试有点相似哦,但是我等死了.... 技术部的都已经 ...
-- by lz726 -
最近面试的几家公司
不用给人事面试写感谢信吧,如果技术面试过了的话,剩下的几乎是搞定了。而且每个公司 ...
-- by littleJava -
最近面试的几家公司
本科毕业两年多,毕业时的工作太容易找(公司来学校招,我在一堆offer里挑工作) ...
-- by lydawen







评论排行榜