论坛首页 Java企业应用论坛

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

浏览 24787 次
精华帖 (0) :: 良好帖 (1) :: 新手帖 (14) :: 隐藏帖 (6)
作者 正文
   发表时间:2011-08-03  
事实上,在设计DAO层时,还有一个问题,是我们经常忽略的问题,那就是并发。如果你的设计中,确实考虑这个问题的话,将会发现这是一件非常棘手的事情。在软件这个行业,我觉得,真正的真理是,没有银弹,通用的设计,往往是以牺牲灵活性为代价的,而且随着业务复杂性的增加,你会发现,你愈加的力不从心。具体问题,具体分析,不是为了设计而设计,不是为了美学而设计,实事求是。
0 请登录后投票
   发表时间: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的时候,生成一下就全都有了.
等有特殊的方法的时候,再另行添加.

0 请登录后投票
   发表时间:2011-08-03  
使用spring的hibernateTemplate和jdbcTemplate,在xml配置这两个就ok了呀。。然后弄一个baseDao,注入这两个,以后所有model的dao都继承baseDao
0 请登录后投票
   发表时间:2011-08-03  
修改数据库而不需要修改service的应用我还没遇到过,所以我把hql的组装放到service里,dao层使用一个泛型dao和一堆接口。
对于很多项目,service层做的最主要工作就是组装sql。只有当项目业务逻辑复杂到一定程度的时候才有必要把hql、sql这些放到dao层。
1 请登录后投票
   发表时间: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语句,如果是要建立对象进行查询的话,就不合适了。
0 请登录后投票
   发表时间:2011-08-03   最后修改:2011-08-03
我都把dao砍掉了,实施中哪有那么多时间切换数据库,直接ftl-action-service,弄那么多层,烦人.......
spring 现在有个项目,叫做data ,提供了基础的curd操作,看起来像是dao层的spring版............
0 请登录后投票
   发表时间:2011-08-03  
kjj 写道
我都把dao砍掉了,实施中哪有那么多时间切换数据库,直接ftl-action-service,弄那么多层,烦人.......
spring 现在有个项目,叫做data ,提供了基础的curd操作,看起来像是dao层的spring版............


类似,用公共的BaseDao,里面有一个JdbcDao基于JdbcTemplate,一个HibernateDao 基于HibernateTemplate
整个工程主要代码在jsp - action - service, service层控制事务,拼sql或hql
0 请登录后投票
   发表时间:2011-08-03  
用mybatis还有dao做什么,直接用它的map
0 请登录后投票
   发表时间:2011-08-03  
Service层理论上来说应该是纯粹的调用Dao里面的方法处理持久工作,而不是去写SQL或者HQL。
0 请登录后投票
   发表时间:2011-08-03  
您好, 你的想法我很赞同, 同时有个问题想咨询下,希望你能给我些建议。
1、关于dao层 不同的bean对应的dao实际上是单例的, 跟据你的想法做成通用的 我可不可以只声明一个dao做成单例的 供service层调用呢,这样可以吗? 如果可以,当然dao层存在属性时会存在资源共享的问题, 这个问题应该如何解决呢?
2、S2SH 中, 事务管理想通过xml的切面进行统一管理,而bean的声明和注入想通过annotation 方式, 但是annotation很难注入父类中的属性,虽然可以用变通的方式(子类中声明set方法并引用父类待注入的属性……),但是并不能起到简化代码的作用。实际开发采用什么方式好呢? xml还是annotation ?
0 请登录后投票
论坛首页 Java企业应用版

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