`
anson_xu
  • 浏览: 513213 次
  • 性别: 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.就这样的写法是否存在不合理的的写法,而我又不知道的?

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


分享到:
评论
27 楼 anson_xu 2008-11-21  
huangking 写道

BaseHibernateDAO 貌似是我发过的
http://lonlysky.iteye.com/blog/266369

上面的是基于SSH1学习写出来的,已经在项目中运用

当这个DAO不满足的时候再继承增加新的实现方法或者重写原有方法

感觉还好,不过有待改进

至于为什么要显示的抛出异常当然是要的,我不会处理,所以抛出给使用的人来处理,可以层层抛出,当然在业务可以抛出自定义异常以供V层来抓取输出或处理


貌似是从你那学的
26 楼 huangking 2008-11-21  

BaseHibernateDAO 貌似是我发过的
http://lonlysky.iteye.com/blog/266369

上面的是基于SSH1学习写出来的,已经在项目中运用

当这个DAO不满足的时候再继承增加新的实现方法或者重写原有方法

感觉还好,不过有待改进

至于为什么要显示的抛出异常当然是要的,我不会处理,所以抛出给使用的人来处理,可以层层抛出,当然在业务可以抛出自定义异常以供V层来抓取输出或处理

25 楼 icewubin 2008-11-21  
helloxuweifu@hotmail.com 写道
andy54321 写道
这个通过的DAO,
你在你的项目中使用了吗?感觉怎样?
开发中的需求变动能用这套DAO轻松搞定吗

我现在就是在征求大家的意见,如果可以就开始往下写,如果不足的话就再改,如果不行的话就撒了.


你可以先学习一下SS3的单DAO设计吧。

http://www.springside.org.cn/
24 楼 anson_xu 2008-11-21  
rockjava 写道
通用了吗?这不还得为每个功能点写个借口和一个实现吗???


不知这位朋友代码中是如何设计的?讲讲思路也行.
23 楼 chenzengpeng 2008-11-21  
create方法呢?
22 楼 anson_xu 2008-11-21  
andy54321 写道
这个通过的DAO,
你在你的项目中使用了吗?感觉怎样?
开发中的需求变动能用这套DAO轻松搞定吗

我现在就是在征求大家的意见,如果可以就开始往下写,如果不足的话就再改,如果不行的话就撒了.
21 楼 andy54321 2008-11-21  
这个通过的DAO,
你在你的项目中使用了吗?感觉怎样?
开发中的需求变动能用这套DAO轻松搞定吗
20 楼 piaoling 2008-11-21  
我觉得比较复杂
19 楼 amonlei 2008-11-21  
通用dao??先明确通用的范围,是基于sql的通用呢?还是基于所有orm技术的通用呢?
18 楼 icewubin 2008-11-21  
异常处理机制有问题,思路问题。

真正的异常(诸如网络断线,数据库当机)是无法处理的,直接抛到最外面,或者action拦截处理成系统错误。

一般的异常其实是利用自定义的非受控异常(UncheckedException)来进行消息传递,在需要的地方进行拦截,一般也是action层处理(比如用户名重复)。

BaseDao这么多try都是没用的。Hibernate 3和Spring包装过的增强类都是非受控异常,try了一点意义都没有。
17 楼 xiao0556 2008-11-21  
我也没感觉出通用来,用泛型不就为了不写那里接口和实现类吗
GenericDaoHibernate<PersonProfile> personDao=new GenericDaoHibernate<PersonProfile>(PersonProfile.class,ht);
					personDao.getAll(1,2,3,4,5);
					GenericDaoHibernate<LoginAccount> loginDao=new GenericDaoHibernate<LoginAccount>(LoginAccount.class,ht);
					loginDao.delete(1);
16 楼 rockjava 2008-11-21  
通用了吗?这不还得为每个功能点写个借口和一个实现吗???
15 楼 terranhao 2008-11-21  
这不就是hibernate in action里面的示例DAO层吗?
14 楼 classicbride 2008-11-21  
呵呵.. 昨天偶也写了一个 和你的差不多,不过没有捕获异常。。。我认为没有必要捕获异常,用spring捕一下就o了..
13 楼 banner 2008-11-21  
这有篇文章,lz可以看一下:http://www.ibm.com/developerworks/java/library/j-genericdao.html
异常我们一般在service中处理,另外baseDAO还会扩展
12 楼 Clayz 2008-11-20  
dao里抛异常,你怎么知道是哪个业务过程出的问题,怎么针对业务异常做流程跳转?
哎,泛型啊,这玩意看的我头疼,我宁肯多写几段代码...
11 楼 wcleye 2008-11-20  
zhu_chen001 写道
dao最好不要显示的抛出任何的异常
service最好抛出自定义异常


我的做法好像和你相反,在DAO层抛出自定义异常,在Action中捕捉异常做流程跳转处理..
10 楼 anson_xu 2008-11-20  
哪里抛出异常?
9 楼 laiseeme 2008-11-20  
那在哪里抛出异常  在哪里捕捉异常 并进行处理呢?
8 楼 zhu_chen001 2008-11-20  
dao最好不要显示的抛出任何的异常
service最好抛出自定义异常

相关推荐

    我的通用DAO理解.rar

    在这个"我的通用DAO理解"的资源中,我们可以看到作者提供了一个封装了数据库操作的DAO实现,这通常包括增删查改等基本功能,对于Java开发者来说,这是一个非常实用的工具或学习案例。 首先,让我们详细了解一下DAO...

    泛型通用DAO,可以很简化DAO层的代码

    在Java编程领域,DAO(Data Access Object)模式是一种常见的设计模式,用于封装对数据库的操作,以...然而,理解其背后的原理和限制,以及何时选择使用或避免使用泛型通用DAO,是每个专业Java开发者应该掌握的知识点。

    java 基于泛型与反射的通用 DAO

    本文将深入探讨如何结合这两种技术实现一个通用的DAO(Data Access Object)设计模式。 首先,我们来看“泛型”。泛型是Java 5引入的新特性,它允许在类、接口和方法中使用类型参数,从而提高了代码的类型安全性和...

    hibernate4 通用dao,service

    由于没有具体的文件列表,我们无法详细讨论每个文件的内容,但根据标题和描述,我们可以推断这是一个关于使用Hibernate4创建通用DAO和Service的教程或资源,旨在帮助Java开发者理解和应用这种模式来提高开发效率。...

    java ssh通用DAO另类实现示例

    首先,理解SSH框架中的DAO设计模式至关重要。DAO是一种设计模式,它为应用程序提供了一种抽象的接口,以便与数据库进行交互,同时避免了硬编码SQL语句和紧密耦合数据库细节的问题。在SSH框架中,Hibernate作为ORM...

    Hibernate通用Dao设计。

    本篇文章将深入探讨Hibernate的通用Dao设计,帮助开发者理解如何利用Hibernate提高代码复用性和可维护性。 在传统的Java应用程序中,DAO(Data Access Object)层是用于封装数据库访问逻辑的地方,它隔离了业务逻辑...

    高仿JPA自定义通用DAO

    自定义通用DAO实现基本的CRUD,比如: public interface BaseDao&lt;T&gt; { int insert(T obj) throws Exception; int update(T obj) throws Exception; int deleteByPrimaryKey(Object key) throws Exception; int ...

    C#特性标签实现通用Dao层

    在C#编程中,"通用Dao层"是一个常见的设计模式,用于封装数据库操作,使得业务逻辑层能够专注于处理业务规则,而无需关心底层数据访问的细节。本篇将重点探讨如何利用C#的特性(Attribute)标签来实现这一目标,同时...

    Hibernate_通用DAO模式,一个写好的dao层

    本资源“Hibernate_通用DAO模式”提供了一种适用于不同类型表单的DAO实现,基于SSH(Struts2、Spring、Hibernate)框架,特别强调简洁、易懂和高可移植性。 首先,SSH框架是Java Web开发中的经典组合,Struts2负责...

    JDBCTemplate+JavaPOJO实现通用DAO

    在这个"JDBCTemplate+JavaPOJO实现通用DAO"的项目中,我们将探讨如何利用这两者构建一个通用的DAO层。 首先,Java POJO(Plain Old Java Object)是指那些没有特殊约束的简单Java对象,通常用于表示数据库中的实体...

    通用DAO

    这些示例可以帮助我们更好地理解和应用通用DAO。 总结来说,通用DAO是Java开发中提高效率的有效工具,通过反射机制实现了对多种数据库实体的通用操作,降低了代码的冗余。理解和掌握这一技术,对于提升Java开发人员...

    Hibernate 原生通用DAO

    **Hibernate原生通用DAO**是基于Hibernate框架设计的一种简化数据访问操作的方式,它模仿了Spring框架中的`HibernateTemplate`类,旨在提供一个简单易用的DAO(Data Access Object)层,方便开发人员进行数据库操作...

    Hibernate通用Dao

    通用dao,简单全面,所有dao都可以继承这个dao.

    ssm(Spring-springMVC-Mybatis)通用Dao框架

    SSM(Spring-SpringMVC-Mybatis)通用Dao框架是一个常见的Java Web开发架构,它整合了Spring、SpringMVC和Mybatis三个强大的开源框架,为开发者提供了便捷的数据访问和业务逻辑处理能力。这个框架的使用可以显著提高...

    Hibernate的通用dao

    **标题:“Hibernate的通用DAO”** 在Java编程领域,Hibernate是一个强大的对象关系映射(ORM)框架,它允许开发者以面向对象的方式处理数据库操作,从而减少了对SQL的直接依赖。通用DAO(Data Access Object)是一...

    SSH中通用dao类

    在这个场景中,"SSH中通用DAO类"指的是在SSH框架下设计和实现的可以应用于多种业务场景的数据访问对象(Data Access Object)类。 DAO层是三层架构或MVC架构中的一个重要部分,主要负责与数据库进行交互,将业务...

    JdbcTemplate通用泛型Dao实现

    本文将深入探讨`JdbcTemplate`通用泛型Dao实现的相关知识点,帮助开发者更好地理解和应用这一技术。 首先,让我们了解什么是`JdbcTemplate`。它是Spring框架的一部分,用于处理SQL操作。`JdbcTemplate`提供了一组...

    Java源代码一个简单的通用DAO实现(基于hibernate)

    Java源代码 一个简单的通用DAO实现 (基于hibernate)面向应用层按POJO类缓存hibernate的session对象.使用举例: DAO dao = DAOFactory.getDAO(POJO.class);//获得一个全局类单例的DAO实例 dao.save(pojo); 你也可以...

    mybatis 通用DAO 简单实现

    MyBatis 通用DAO(Data Access Object)是一种设计模式,旨在提供一种标准的方式来访问数据库,减少重复代码,提高开发效率。在Java Web开发中,MyBatis作为一个优秀的持久层框架,它支持定制化SQL、存储过程以及...

    通用数据库访问模块,通用DAO类

    通用数据库访问模块(通常称为 DAO,Data Access Object)是一种软件设计模式,用于在应用程序和数据库之间提供一个抽象层。DAO 类的主要目标是隔离业务逻辑层与数据存储层,使得应用程序可以独立于特定的数据库实现...

Global site tag (gtag.js) - Google Analytics