DAO泛型:
package com.dao;
import java.io.Serializable;
import java.util.List;
import com.domain.Attend;
import com.utils.Pagination;
//泛型的接口
/*泛型真正要做的事情就是找到具体的实体类是哪个
* <T>:占位符,代表真正在运行时候的实体类(Employee,Manager,Application....)
* <PK>:主键类,必须实现Serializable接口
*/
public interface GenerateDao<T,PK extends Serializable> {
public Integer save(T entity);
public void update(T entity);
public void delete(T entity);
public void delete(PK id);
public List<T> findAll();
public T get(PK id);
// 在工具类中定义2个基本方法
// 1.通过HQL和参数返回一个对象
public Object queryObject(final String hql,final Object[] values);
// 2.通过HQL和参数返回一个List
public List query(final String hql,final Object[] values);
// 3.实现分页的一个公共方法
public Pagination<T> getPagination(final String hql,final Object[] values,final int pageNow,final int rowCount,final int pageSize);
}
实现以上接口:
package com.dao.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.sql.SQLException;
import java.util.List;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
import com.dao.GenerateDao;
import com.domain.Attend;
import com.utils.Pagination;
/*
* 泛型DAO的实现
* (1)继承泛型接口
* (2)HiberanteDaoSupport
* (3)得到使用这个方法的实体类
* (4)实现具体的数据操作方法
*/
public class GenerateDaoImpl<T,PK extends Serializable> extends HibernateDaoSupport implements GenerateDao<T, PK>{
private final Class<T> clazz;
public GenerateDaoImpl(){
// 通过java反射机制,得到在运行时的具体的实体类
clazz = (Class<T>)((ParameterizedType)getClass()
.getGenericSuperclass())
.getActualTypeArguments()[0];
}
public void delete(T entity) {
this.getHibernateTemplate().delete(entity);
}
public void delete(PK id) {
this.getHibernateTemplate().delete(get(id));
}
public List<T> findAll() {
return this.getHibernateTemplate().find("from "+clazz.getName());
}
public Integer save(T entity) {
return (Integer)this.getHibernateTemplate().save(entity);
}
public void update(T entity) {
this.getHibernateTemplate().update(entity);
}
public T get(PK id) {
return this.getHibernateTemplate().get(clazz, id);
}
public List query(final String hql, final Object[] values) {
return this.getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session arg0)
throws HibernateException, SQLException {
Query q = arg0.createQuery(hql);
if(values != null){
for(int i=0;i<values.length;i++){
q.setParameter(i, values[i]);
}
}
return q.list();
}
});
}
public Object queryObject(final String hql, final Object[] values) {
return this.getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session arg0)
throws HibernateException, SQLException {
Query q = arg0.createQuery(hql);
if(values != null){
for(int i=0;i<values.length;i++){
q.setParameter(i, values[i]);
}
}
return q.list();
}
});
}
public Pagination<T> getPagination(final String hql, final Object[] values,
final int pageNow, final int rowCount, final int pageSize) {
return (Pagination<T>) this.getHibernateTemplate().execute(new HibernateCallback() {
public Object doInHibernate(Session arg0)
throws HibernateException, SQLException {
Pagination pagination = new Pagination<T>(pageSize, pageNow, rowCount);
Query q = arg0.createQuery(hql);
if(values != null){
for(int i=0;i<values.length;i++){
q.setParameter(i, values[i]);
}
}
q.setFirstResult(pageSize*(pageNow-1));
q.setMaxResults(pageSize);
List list = q.list();
pagination.setPageList(list);
return pagination;
}
});
}
}
分享到:
相关推荐
Struts2、Hibernate、Spring整合的泛型DAO (本人评价: 代码开发效率提高30% 代码出错率减少70%) 对于大多数开发人员,系统中的每个 DAO 编写几乎相同的代码到目前为止已经成为一种习惯。虽然所有人都将这种重复...
这篇博客"ssh2 + dao泛型"结合了这两个概念,探讨了如何在SSH2框架下利用泛型优化DAO层的操作。 SSH2框架主要由Spring、Struts和Hibernate三个部分组成,它为Java Web开发提供了强大的支持。Spring提供依赖注入和...
在这个项目"SSHWithAnnotationDemo"中,开发者利用注解功能,DAO泛型以及通用分页技术,进一步优化了代码结构和用户体验。 首先,让我们深入了解一下Struts2、Spring3和Hibernate的核心功能: 1. **Struts2**:这...
DAO泛型写法很好用 hibernate支持
【泛型DAO】是一种在Java开发中常见的设计模式,它利用了Java泛型特性来提高代码的可重用性和类型安全性。在Java中,DAO(Data Access Object)模式是用来封装对数据库的操作,将业务逻辑与数据访问逻辑分离,使得...
封装SpringSide扩展功能的Hibernat DAO泛型基类. 扩展功能包括分页查询,按属性过滤条件列表查询. 可在Service层直接使用,也可以扩展泛型DAO子类使用,见两个构造函数的注释.
综上所述,这个项目展示了如何利用Java的泛型和反射技术实现一个通用的DAO,使得数据库操作更加灵活和易于维护。泛型确保了类型安全,而反射则提供了运行时的动态行为。这种设计模式在实际开发中非常常见,尤其是在...
### 泛型DAO层在SSH框架中的应用与详解 #### 引言 在现代软件开发中,特别是基于Java的企业级应用开发中,DAO(Data Access Object)层的设计扮演着至关重要的角色。它作为业务逻辑层与数据持久层之间的桥梁,承担...
而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化...
【标题】"Hibernate泛型Dao"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...
至于`Dao经典泛型.doc`文件,可能是更深入的关于Hibernate泛型DAO的文档,可能包含了如何配置Spring、如何处理复杂查询以及如何优化泛型DAO的更多细节。阅读这份文档将进一步提升你对泛型DAO的理解和应用能力。 ...
本文将深入探讨`JdbcTemplate`通用泛型Dao实现的相关知识点,帮助开发者更好地理解和应用这一技术。 首先,让我们了解什么是`JdbcTemplate`。它是Spring框架的一部分,用于处理SQL操作。`JdbcTemplate`提供了一组...
【泛型DAO模型设计】是Java开发中一种高效且可复用的数据访问对象(DAO)设计方式,结合了泛型和反射技术。泛型在Java中引入,旨在提高代码的安全性和可读性,减少类型转换的繁琐过程。DAO设计模式主要用于数据库...
在这个主题中,我们将深入探讨"ssh通用泛型DAO"的相关知识点。 首先,我们来了解"BaseHibernateDAO"。BaseHibernateDAO是基于Hibernate框架的一个基类,它封装了常见的数据库操作,如增删查改(CRUD)。通过继承这...
### Java软件开发DAO层泛型模式详解 #### 泛型DAO模式概述 在Java软件开发过程中,DAO(Data Access Object)层的设计对于提高代码的可重用性与维护性至关重要。本文将详细介绍一种基于Hibernate技术的泛型DAO模式...
而泛型DAO(Data Access Object)则是基于Hibernate进一步抽象出来的一个设计模式,用于提供更通用的数据操作方法。本文档主要探讨了如何在Spring+Hibernate环境中创建和使用泛型DAO。 首先,我们来看一下泛型DAO...
本篇文章将深入探讨一个使用Spring注解和Hibernate实现的泛型DAO设计,以提高代码的复用性和可维护性。 首先,`HibernateBaseDao.java`是基础的Hibernate DAO类,它提供了对Hibernate操作的基本封装。这个类通常会...
6. **泛型Dao**:在Java开发中,泛型Dao(Generic Dao)是一种设计模式,用于减少重复的数据库操作代码。通过定义一个通用的Dao接口,可以实现对不同类型的实体对象进行CRUD操作,提高了代码的复用性和可维护性。...