`
grandboy
  • 浏览: 124907 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

泛型给DAO带来的好处

    博客分类:
  • JAVA
DAO 
阅读更多
关于泛型的使用,最近才开始的,因为公司以前的产品都要求兼容1.4,所以没有办法用这些“新”功能,这里之所以打上引号,是因为现在已经算是旧的成熟的功能了。

刚开始使用的时候,感觉类型安全,同时可以减少不必要的类型强制转换,还可以很方便的使用for/in的语法, 带来很多方便,但是使用多了,觉得满眼都是尖括号(<>)又感觉有点不太爽,代码看得乱乱的,觉得付出代码“乱”的代价,得到效益好像不太大。

但是后来通过不断重构DAO代码,发现巨大的好处了。觉得DAO的代码不用以前那样写很多重复代码了,可以把大部分代码都转移到BasDAO这个基类里。而DAO实现类里基本没有什么代码的,有的就直接继承BasDAO就可以了。DAO的接口还是要保留原来的样子,就是对外该提供什么接口还提供什么接口,这有利于扩展,如果只是一个DAO接口需要的功能,可以直接在接口里加一个声明,然后在实现类里加一个实现,通过在这里都是加一些逻辑处理,而且可以直接使用BaseDAO的方法进行持久化。而且BaseDAO里的通常需要得到T.class, 可以参考:http://grandboy.iteye.com/admin/blogs/434062

下面给一个演示例子:
public abstract class AbstractBasDao <T> {
    static Logger logger = Logger.getLogger(AbstractBasDao.class);
        
    private Class<T> entityClass = (Class<T>) ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    
    public void deleteByIdList(List<String> idList) {
    //实现略
    }

    public void deleteAll() {
    //实现略
    }

    public void deleteById(String id) {
    //实现略
    }

    public Object insert(T entity) {
    //实现略
    }

    public T selectById(String id) {
    //实现略
    }

    public List<T> selectByPage(PageBean page) {
    //实现略
    }

    public List<T> selectByIdList(List<String> idList) {
    //实现略
    }

    public void updateById(T entity) {
    //实现略
    }
}

BaseDAO接口:
public interface BaseDao<T> {
    @Transactional
    public Object insert(T o);

    @Transactional
    public void deleteById(String id);

    @Transactional
    public void deleteByIdList(List<String> idList);

    @Transactional
    public void deleteAll(); // Just for unit testing
  
    @Transactional
    public void updateById(T o);

    @Transactional("readonly")
    public T selectById(String id);

    @Transactional("readonly")
    public List<T> selectByIdList(List<String> idList);
}


直接对上一层提供服务的DAO接口如下
public interface AccountDao extends BaseDao<Account>{
//如果需要提供新功能就在这里加方法声明
}


接口实现如下:
public final class AccountDaoImpl extends AbstractBasDao<Account> implements AccountDao {
    public void deleteById(String id) {
        //这个方法加要加一些逻辑
        //然后再调用基类的方法去持久化对象
        super.deleteById(id);
    }

}


是不是发现Dao没有以前那么多重复代码了? 这可是巨大好处。以后写DAO的代码少了,自然维护的代码量也就少了。可以把更多的精力放在业务逻辑上。





分享到:
评论

相关推荐

    Hibernate泛型Dao

    【标题】"Hibernate泛型Dao"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...

    spring hibernate 泛型DAO

    本文将深入探讨“Spring Hibernate 泛型DAO”这一主题,以及如何通过泛型DAO实现更加高效、可复用的代码。 首先,让我们理解什么是DAO(Data Access Object)模式。DAO是一种设计模式,它的主要作用是隔离业务逻辑...

    hibernate不是泛型的通用DAo1

    例如,一个泛型DAO接口可能定义如下: ```java public interface GenericDao&lt;T&gt; { void save(T entity); T get(Long id); void update(T entity); void delete(T entity); } ``` 然后,对于一个名为`User`的实体...

    SSH泛型DAO+Proxool+DisPlayTag+Jquery easyui

    标题中的"SSH泛型DAO+Proxool+DisPlayTag+Jquery easyui"涉及到的是一个基于Spring、Struts和Hibernate(SSH)框架的Web应用开发中的几个关键技术和组件。让我们逐一深入探讨这些技术。 1. **Spring**: Spring 是...

    DAO模式设计

    - `泛型dao的实现.doc`:可能详细描述了创建泛型DAO的具体步骤,包括如何处理CRUD(Create, Read, Update, Delete)操作。 - `使用AOP实现类型安全的泛型DAO.doc`:可能阐述了如何利用Spring AOP来增强泛型DAO,确保...

    泛型框架整合

    例如,定义一个泛型DAO(Data Access Object)接口,可以针对不同的实体类提供统一的操作,减少代码重复。 在“ssh-template”这个项目中,我们可以假设它提供了一种模板方式来整合SSH框架,并且实现了泛型和反射的...

    JAVA反射的实现(使DAO层变得更加简单)

    4. **泛型处理**:反射可以处理泛型,即使在编译时类型信息丢失的情况下,我们依然可以通过反射获取到运行时的泛型类型,从而实现更精确的数据转换。 5. **注解处理**:Java的注解机制可以与反射相结合,例如,我们...

    毕业设计学校图书管理系统spring+ibatis+struts2包含所有的jar包和数据库文件

    本文将详细探讨一款基于Spring、iBatis和Struts2框架的学校图书管理系统,它不仅包含了所有必要的jar包和数据库文件,还提供了泛型DAO接口定义,以供开发者参考和使用。 首先,Spring框架作为系统的核心,负责管理...

    Generic Architecture架构更新

    "Generic ArchitectureV2"的更新带来了更高效、更灵活的开发方式。通过继承`GenericDao`和优化iBatis配置,开发者可以快速构建具备基础CRUD功能的系统,同时保持代码的整洁和可扩展性。这种架构尤其适用于那些需求...

    MyBatis中英文文档.tar.gz

    在从iBatis升级到MyBatis的过程中,开发者可以享受到JDK泛型带来的类型安全性和便利性,以及注解带来的简化配置的体验。例如,使用注解可以直接在Mapper接口的方法上声明SQL语句,使得代码更加整洁。 提供的压缩包...

    ThreadLocal详解

    例如,在Spring的DAO模板类中,尽管底层的数据连接或会话资源是非线程安全的,但是通过使用ThreadLocal,可以为每个线程绑定独立的数据连接或会话,使得多个DAO可以复用同一个模板实例而不会发生资源冲突,极大地...

    代码生成器Mgicode生成器JAVA代码生成器

    开发过程的修改,就会带来原前置流程步骤的修改,所以软件开发完成之后,不会有很多公司其PDM与数据库、实体是一一对应的。而有一些是必须要修改,如在实体中修改属性,一定要到数据库中修改,到dao,service,action,...

    android面试题

    - **泛型**:在Android中的应用,如ArrayList泛型使用。 - **注解**:自定义注解、编译时注解处理(APT)及运行时注解处理(反射)。 3. **设计模式** - **MVC/MVVM**:理解模型-视图-控制器和模型-视图-...

    Spring-5的jar包自用

    Spring Data JPA简化了数据库访问,通过提供泛型Repository接口,开发者可以快速实现CRUD操作,而无需编写大量的DAO层代码。此外,Spring Data还支持多种NoSQL数据库,如MongoDB、Cassandra等,增强了对非关系型...

    Spring3 jar

    Spring3是该框架的第三个主要版本,发布于2009年,带来了许多新特性和改进,对后继的Java EE开发产生了深远影响。 在Spring3中,最重要的变化之一是增强了对Java 5和6的支持,包括泛型、注解(Annotation)和枚举等...

    iBatis和MyBatis对比

    MyBatis不仅继承了iBatis的优点,还引入了更多的增强功能,如泛型和注解的支持,使得框架更加现代化和易于使用。MyBatis的出现意味着iBatis的升级,它不再仅仅是SQL映射框架,而是发展成一个更全面的ORM解决方案。 ...

    spring3.0帮助文档

    Spring 3.0 完全基于Java 5进行构建,这意味着它充分利用了Java 5及更高版本的语言特性,如泛型、枚举、可变参数等,这为开发者提供了更为简洁的编程模型。 ##### 2.2 文档改进 随着Spring 3.0的到来,官方提供了...

Global site tag (gtag.js) - Google Analytics