论坛首页 入门技术论坛

我给dao的瘦身方法请大虾拍砖!

浏览 3896 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (1) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-07-06  
上周上司提出要给dao瘦身(由业务层定义HQL语句,目前是将HQL语句定义在dao层),让我们想想有什么好的方法,通过周六、周日两天的思考,我提出了一个方案来,如下文:
1.定义一个通用dao,包含所有CURD的操作(因为HQL语句由业务层定义)
2.让所有实体(也可以使任意需要返回的对象)都继承至一个抽象类(“里氏代换原则”中说,任何基类可以出现的地方,子类一定可以出现。)
如图:


现在我们主要讨论下这两个方法:getReternObject和getReternObjectList,我们知道,这两个对象返回的对象是ReternObject和List<ReternObject>(这里ReternObject是一个抽象类),而返回的实际对象可能是EntityA、EntityB和EntityC的任意一个,根据“里氏代换原则”中说,任何基类可以出现的地方,子类一定可以出现。
我想说道这里大家应该很清楚我的用意了,比如说有一个这样的操作要获取EntityA,然后我们根据定义好的GeneralDao进行操作,通过业务层传入这样一条HQL语句:select a from EntityA where a.id = '01' ,这样我们就可以获得EntityA了,但好像很少人使用这样的方式来给dao瘦身,希望大虾们拍拍砖!这样做到底好不好!
  • 大小: 14.8 KB
   发表时间:2009-07-06  
老实说,我已经把dao精简掉了,找不到他存在的必要性,直接action和service对话,必要的话,ajax直接绕过action和services对话
0 请登录后投票
   发表时间:2009-07-06  
当是这样的话,你的services层不是很臃肿吗?
0 请登录后投票
   发表时间:2009-07-06  
我现在用的构架是spring+hibernate的,总不可能把Dao层和services层混在一起吧!
0 请登录后投票
   发表时间:2009-07-06   最后修改:2009-07-06
那里臃肿了,增加dao层主要目的是啥呢!!
0 请登录后投票
   发表时间:2009-07-06  
我想dao可以看做是数据库的一个实例,是我们CURD操作的一个接口,services层通过dao层来访问数据库,这应该是面向对象的开发。
0 请登录后投票
   发表时间:2009-07-06  
用久了dao,反而感到繁琐,增加不必要的代码,不必要的操作,该是反思一下dao的作用到底是啥玩意呢!!
0 请登录后投票
   发表时间:2009-07-06  
所以我们才提出简化dao,想用一个dao来解决所有dao的操作!
0 请登录后投票
   发表时间:2009-07-07  
Dao层应该简化,请看我的帖子:http://xyh.iteye.com/blog/412876
0 请登录后投票
   发表时间:2009-07-07  
个人认为将所有的的持久化操作集合到一个类,通过依赖注入注入到action或者service层,直接调用注入对象进行持久化操作。类似于:
public class BaseImpl<T> implements IBaseDAO<T>
	{
		protected HibernateTemplate hibernateTemplate;
	
		public void setHibernateTemplate(HibernateTemplate hibernateTemplate)
			{
				this.hibernateTemplate = hibernateTemplate;
			}

	
	public void deleteEntity(T entity)
		{
			hibernateTemplate.delete(entity);
			
		}
	


	public void deleteEntity(Class clzz,Serializable id)
		{
			hibernateTemplate.delete(findEntity(clzz,id));
			
		}
               public void saveEntity(T entity)
		{
			hibernateTemplate.save(entity);
			
		}
}


假设在action注入的名字为baseDAO.
那么我们保存一个对性的时候可以直接用baseDAO.save(object);
同理查询也可以用补丁参数+Critiria构造,比如
public abstract List findEntityProperty(final Class clzz,
final Order order, final int start, final int num,
final Criterion... criterions);
就能支持常见的查询
0 请登录后投票
论坛首页 入门技术版

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