关于泛型的使用,最近才开始的,因为公司以前的产品都要求兼容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"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...
本文将深入探讨“Spring Hibernate 泛型DAO”这一主题,以及如何通过泛型DAO实现更加高效、可复用的代码。 首先,让我们理解什么是DAO(Data Access Object)模式。DAO是一种设计模式,它的主要作用是隔离业务逻辑...
例如,一个泛型DAO接口可能定义如下: ```java public interface GenericDao<T> { void save(T entity); T get(Long id); void update(T entity); void delete(T entity); } ``` 然后,对于一个名为`User`的实体...
标题中的"SSH泛型DAO+Proxool+DisPlayTag+Jquery easyui"涉及到的是一个基于Spring、Struts和Hibernate(SSH)框架的Web应用开发中的几个关键技术和组件。让我们逐一深入探讨这些技术。 1. **Spring**: Spring 是...
- `泛型dao的实现.doc`:可能详细描述了创建泛型DAO的具体步骤,包括如何处理CRUD(Create, Read, Update, Delete)操作。 - `使用AOP实现类型安全的泛型DAO.doc`:可能阐述了如何利用Spring AOP来增强泛型DAO,确保...
例如,定义一个泛型DAO(Data Access Object)接口,可以针对不同的实体类提供统一的操作,减少代码重复。 在“ssh-template”这个项目中,我们可以假设它提供了一种模板方式来整合SSH框架,并且实现了泛型和反射的...
4. **泛型处理**:反射可以处理泛型,即使在编译时类型信息丢失的情况下,我们依然可以通过反射获取到运行时的泛型类型,从而实现更精确的数据转换。 5. **注解处理**:Java的注解机制可以与反射相结合,例如,我们...
本文将详细探讨一款基于Spring、iBatis和Struts2框架的学校图书管理系统,它不仅包含了所有必要的jar包和数据库文件,还提供了泛型DAO接口定义,以供开发者参考和使用。 首先,Spring框架作为系统的核心,负责管理...
"Generic ArchitectureV2"的更新带来了更高效、更灵活的开发方式。通过继承`GenericDao`和优化iBatis配置,开发者可以快速构建具备基础CRUD功能的系统,同时保持代码的整洁和可扩展性。这种架构尤其适用于那些需求...
在从iBatis升级到MyBatis的过程中,开发者可以享受到JDK泛型带来的类型安全性和便利性,以及注解带来的简化配置的体验。例如,使用注解可以直接在Mapper接口的方法上声明SQL语句,使得代码更加整洁。 提供的压缩包...
例如,在Spring的DAO模板类中,尽管底层的数据连接或会话资源是非线程安全的,但是通过使用ThreadLocal,可以为每个线程绑定独立的数据连接或会话,使得多个DAO可以复用同一个模板实例而不会发生资源冲突,极大地...
开发过程的修改,就会带来原前置流程步骤的修改,所以软件开发完成之后,不会有很多公司其PDM与数据库、实体是一一对应的。而有一些是必须要修改,如在实体中修改属性,一定要到数据库中修改,到dao,service,action,...
- **泛型**:在Android中的应用,如ArrayList泛型使用。 - **注解**:自定义注解、编译时注解处理(APT)及运行时注解处理(反射)。 3. **设计模式** - **MVC/MVVM**:理解模型-视图-控制器和模型-视图-...
Spring Data JPA简化了数据库访问,通过提供泛型Repository接口,开发者可以快速实现CRUD操作,而无需编写大量的DAO层代码。此外,Spring Data还支持多种NoSQL数据库,如MongoDB、Cassandra等,增强了对非关系型...
Spring3是该框架的第三个主要版本,发布于2009年,带来了许多新特性和改进,对后继的Java EE开发产生了深远影响。 在Spring3中,最重要的变化之一是增强了对Java 5和6的支持,包括泛型、注解(Annotation)和枚举等...
MyBatis不仅继承了iBatis的优点,还引入了更多的增强功能,如泛型和注解的支持,使得框架更加现代化和易于使用。MyBatis的出现意味着iBatis的升级,它不再仅仅是SQL映射框架,而是发展成一个更全面的ORM解决方案。 ...
Spring 3.0 完全基于Java 5进行构建,这意味着它充分利用了Java 5及更高版本的语言特性,如泛型、枚举、可变参数等,这为开发者提供了更为简洁的编程模型。 ##### 2.2 文档改进 随着Spring 3.0的到来,官方提供了...