`
anson_xu
  • 浏览: 502664 次
  • 性别: Icon_minigender_1
  • 来自: 惠州
社区版块
存档分类

我的通用DAO理解,请大家指正

    博客分类:
  • SSH
阅读更多
首先声明我的资料大我来自javaeye,先谢谢各位.
但因本人理解能力不足,现把我对通用DAO的引用贴出,望大家指点.
1.BaseDAO 接口
public interface BaseDAO<T, ID extends Serializable> {
public void save(T entity);
public void delete(T entity);
public T findById(Class<T> entityClass, ID id);
}
2.BaseDAO 的实现
public class BaseHibernateDAO<T, ID extends Serializable> extends HibernateDaoSupport implements BaseDAO<T,ID> {  
      private static final Logger logger = Logger.getLogger(BaseHibernateDAO.class);  
    public void save(T entity) {          
        try {  
            getHibernateTemplate().save(entity);  
        } catch (RuntimeException e) {  
            logger.error("保存实体异常", e);  
            throw e;  
        }  
    }  

    public void delete(T entity) {  
        try {  
            getHibernateTemplate().delete(entity);  
        } catch (RuntimeException e) {  
            logger.error("删除实体异常", e);  
            throw e;  
        }  
    }  

    public void saveOrUpdate(T entity) {  
        try {  
            getHibernateTemplate().saveOrUpdate(entity);  
        } catch (RuntimeException e) {  
            logger.error("更新或保存实体异常", e);  
            throw e;  
        }  
    }  

    @SuppressWarnings("unchecked")  
    public T findById(Class<T> entityClass, ID id) {  
        try {  
            return (T) getHibernateTemplate().get(entityClass, id);  
        } catch (RuntimeException e) {  
            logger.error("查找指定ID实体异常,ID:" + id, e);  
            throw e;  
        }  
    }  
3.一个实体DAO接口extends BaseDAO
public interface ProductDAO extends BaseDAO<Product,Integer>{
//如添加
public void productInsert(Product entity);
         public void findById(Product entityClass, Integer id)
        //如除crud外Product自己的业务的方法
          public void myProductDelete(class clz,Serializable pk);
......
}
4.实体DAO的实现
public class ProductDAOImpl extends BaseHibernateDAO<Product,Integer> implements
ProductDAO {
       public void productInsert(Product entity) {
save(entity);
       }
    public void findById(Class<T> entityClass, ID id) {
findById(entityClass,id);
       }
        public void myProductDelete(class clz,Serializable pk){
           Object object = this.getHibernateTemplate().get(clazz, pk);
this.getHibernateTemplate().delete(object);     
}
  ........
}
5.service层 实体接口
public interface ProductService {
// 添加
public void productInsert(Product entity) throws ProductException;
         public void save(Product  entity) throws ProductException;
public void delete(Product  entity) throws ProductException;
public Product findById(Product entityClass, Integer) throws ProductException;
}
6.service层 实体service实现
public class ProductServiceImpl implements ProductService {
private ProductDAO productDAOImpl;

public void delete(int id) throws ProductException {
try{
productDAOImpl.Delete(productDAOImpl.findproductByPrimaryKey(id));
}catch(Exception e ){
e.printStackTrace();
throw new ProductException(this.getClass().getName()+"Product Delete 删除失败");
}
}

public void save(Product product) throws ProductException {
try{
productDAOImpl.save(product);
}catch(Exception e){
e.printStackTrace();
throw new ProductException(this.getClass().getName()+"Product Insert 添加失败");
}
.......
}


请大家帮我看看我这个通用baseDAO的设计是否合理?
具体如:
1.dao的设计有没错?
2.T Class<T>等泛型,反射有没错?
3.service层的传值有没错?
4.这样的异常处理合理吗?
5.就这样的写法是否存在不合理的的写法,而我又不知道的?

     各位拍砖吧,至少知道那里不足,继续学习..........


分享到:
评论
67 楼 wt8414 2009-05-25  
路过人士,说声悄悄话,看了这么多DAO,全部是基于spring的,既然有了强大的HibernateTemplate为什么还要费这么事呢
66 楼 zozoh 2009-05-23  
引用
1.BaseDAO 接口
public interface BaseDAO<T, ID extends Serializable> {
public void save(T entity);
public void delete(T entity);
public T findById(Class<T> entityClass, ID id);
}


接口你可以参看 Nutz.Dao 的 接口定义 http://code.google.com/p/nutz/source/browse/trunk/src/com/zzh/dao/Dao.java

对于 BaseDao.save,如果是 public void save(Object entity) 会有啥不好呢? 如果是 Object, 你就不需要 BaseDao<T> 了吧,你的BaseDao 就不是泛型的了,只是某些函数是泛型的。 那么你就只要一份实现就好了,不需要我再提供实现类了。

如果你的 BaseDao 是泛型的 BaseDao<T>
那么 findById 就不需要第一个参数 entityClass 了
65 楼 凤舞凰扬 2009-05-06  
   思路不错,运用泛型也比较合理,只是API相对简单了些。建议楼主将DAO的接口行为分成三种:只读型,查询和普通。
   在楼主的generic dao中,查询功能较弱,并且没有区分read和readForUpdate两种行为(那么多用过ORM的人怎么没有一个谈到这两者的区别呢?呵呵...)。
   为了方便楼主理解,简单说明一下两者的区别,对于read,读取出来的对象如果被修改后,要调用相应的update(save)方法才能持久化。而readForUpdate则对于修改后的对象自动持久化。其实这个思想和原理最早来自于EJB的BMP与CMP(那些咒骂EJB的人其实应该学习学习的)。两者行为的区别对于系统的效率和性能来说是有着影响的
64 楼 soartju 2009-05-05  
对于异常,在dao层显式抛应该没有太大的意义,因为底层数据库的操作,就算抛出了一场,上层仍然没法处理,顶多是告诉用户,后台数据操作错误。而service层是有必要显式抛出异常的,因为整个业务控制的逻辑在这里,哪些是正确的业务逻辑,哪些是错误的,对于程序开发人员是可以预知的。对于可以预知的错误,可以显示的抛出异,至于是checked,unchecked异常看具体情况了。

简单说就是,能够明确知道错误原因并且能够告诉用户做处理的,就抛出异常(unchecked,checked看具体情况)。不知道错误原因的,就不用显示抛出异常了,由上层异常捕获统一处理。
63 楼 Equatorrunman 2009-01-13  
service,action都可以 抛异常
一般service抛为主。
62 楼 pengsky2002 2009-01-10  
发表一下拙见 
我支持使用泛型  这个东西越用越方便, 省事
关于异常抛出,我的做法是
dao层不抛出任何异常,这个地方出异常了那是程序或服务器的问题,直接记录到日志
service层不处理异常 全抛给action(当然一些特殊的除外) ,好让action做相应跳转处理
   欢迎批评
61 楼 wm920 2009-01-09  
helloxuweifu@hotmail.com 写道
dao和service的异常处理可以吗?


可以一样进行异常处理。

看看你个人的怎么做。
60 楼 seablue_xj 2009-01-04  
一般来说都是dao层向上抛出异常,然后在service层进行异常的处理及捕捉,但是也有在没一层都加异常拦截的,这样更好定位抛出的异常,
59 楼 麦田守望者 2009-01-03  
dao层应该有异常处理这样系统更加健壮一些
58 楼 kjr200 2009-01-02  
利害.学习了!
57 楼 sonic10101 2008-12-30  
我们公司的系统就是用通用dao, 我觉得比较方便,不用每个模块都写一次一样的代码。
56 楼 鸡汤捞饭 2008-12-30  
留个记号,方便下次
55 楼 eggcanfly 2008-12-22  
路过,支持通用dao。我也借了个泛型的dao来用,挺好用的,少写了很多bean定义……
54 楼 icewubin 2008-12-20  
我支持泛型,为啥不用,泛型和反射一样,基本手段,当然要有选择的使用。
53 楼 luoba 2008-12-20  
我个人觉得应该在service层处理,自定义异常类,service可以抽象出一个fscade层出来
52 楼 星情泪 2008-12-20  
大家的结论好像不太赞成用泛型

我前两天和楼主的情况一样,也是准备做一个dao,结果和楼主的也差不多,只是把service放到action里去了(开始疏忽了)
51 楼 comeonbaby0312 2008-12-07  
在service里进行异常处理,捕捉并抛出异常,在struts框架的action中的exception元素显示异常处理比较好
愚见。。。

<action path="/"
type="cn.hxex.order.action.FindOrderAction" name="OrderForm"
scope="request" validate="true" input="/.jsp">
<display-name>Find Existing Order</display-name>
<exception key="error.order.find" path="/.jsp"
scope="request" type="cn.hxex.order.exception.OrderException" />
<forward name="success" path="/ViewOrder.jsp" />
<forward name="successful"
="/ViewOrderAndOrderLineItem.jsp" />
</action>
50 楼 dangjun625 2008-11-27  
哈哈 讲的不错 学习中
49 楼 anson_xu 2008-11-26  
aizhu1314 写道
既然是通用的,你觉得用泛型好么?

你的意思的用Object吗?
48 楼 aizhu1314 2008-11-26  
既然是通用的,你觉得用泛型好么?

相关推荐

Global site tag (gtag.js) - Google Analytics