1.接口
package net.shopxx.dao;
import java.io.Serializable;
import java.util.List;
import net.shopxx.bean.Pager;
import org.hibernate.criterion.DetachedCriteria;
/**
* Dao接口 - Dao基接口
* ============================================================================
* 版权所有 2008-2010 长沙鼎诚软件有限公司,并保留所有权利。
* ----------------------------------------------------------------------------
* 提示:在未取得SHOP++商业授权之前,您不能将本软件应用于商业用途,否则SHOP++将保留追究的权力。
* ----------------------------------------------------------------------------
* 官方网站:http://www.shopxx.net
* ----------------------------------------------------------------------------
* KEY: SHOPXX0FF87D88DFDA50E4762E39A4625B158C
* ============================================================================
*/
public interface BaseDao<T, PK extends Serializable> {
/**
* 根据ID获取实体对象.
*
* @param id
* 记录ID
* @return 实体对象
*/
public T get(PK id);
/**
* 根据ID获取实体对象.
*
* @param id
* 记录ID
* @return 实体对象
*/
public T load(PK id);
/**
* 根据ID数组获取实体对象集合.
*
* @param ids
* ID对象数组
*
* @return 实体对象集合
*/
public List<T> get(PK[] ids);
/**
* 根据属性名和属性值获取实体对象.
*
* @param propertyName
* 属性名称
* @param value
* 属性值
* @return 实体对象
*/
public T get(String propertyName, Object value);
/**
* 根据属性名和属性值获取实体对象集合.
*
* @param propertyName
* 属性名称
* @param value
* 属性值
* @return 实体对象集合
*/
public List<T> getList(String propertyName, Object value);
/**
* 获取所有实体对象集合.
*
* @return 实体对象集合
*/
public List<T> getAll();
/**
* 获取所有实体对象总数.
*
* @return 实体对象总数
*/
public Long getTotalCount();
/**
* 根据属性名、修改前后属性值判断在数据库中是否唯一(若新修改的值与原来值相等则直接返回true).
*
* @param propertyName
* 属性名称
* @param oldValue
* 修改前的属性值
* @param oldValue
* 修改后的属性值
* @return boolean
*/
public boolean isUnique(String propertyName, Object oldValue, Object newValue);
/**
* 根据属性名判断数据是否已存在.
*
* @param propertyName
* 属性名称
* @param value
* 值
* @return boolean
*/
public boolean isExist(String propertyName, Object value);
/**
* 保存实体对象.
*
* @param entity
* 对象
* @return ID
*/
public PK save(T entity);
/**
* 更新实体对象.
*
* @param entity
* 对象
*/
public void update(T entity);
/**
* 删除实体对象.
*
* @param entity
* 对象
* @return
*/
public void delete(T entity);
/**
* 根据ID删除实体对象.
*
* @param id
* 记录ID
*/
public void delete(PK id);
/**
* 根据ID数组删除实体对象.
*
* @param ids
* ID数组
*/
public void delete(PK[] ids);
/**
* 刷新session.
*
*/
public void flush();
/**
* 清除Session.
*
*/
public void clear();
/**
* 清除某一对象.
*
* @param object
* 需要清除的对象
*/
public void evict(Object object);
/**
* 根据Pager对象进行查询(提供分页、查找、排序功能).
*
* @param pager
* Pager对象
* @return Pager对象
*/
public Pager findByPager(Pager pager);
/**
* 根据Pager和DetachedCriteria对象进行查询(提供分页、查找、排序功能).
*
* @param pager
* Pager对象
* @return Pager对象
*/
public Pager findByPager(Pager pager, DetachedCriteria detachedCriteria);
}
2,实现:
package net.shopxx.dao.impl;
import java.io.Serializable;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import javax.annotation.Resource;
import net.shopxx.bean.Pager;
import net.shopxx.bean.Pager.OrderType;
import net.shopxx.dao.BaseDao;
import org.apache.commons.lang.StringUtils;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.CriteriaSpecification;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.stereotype.Repository;
import org.springframework.util.Assert;
/**
* Dao实现类 - Dao实现类基类
* ============================================================================
* 版权所有 2008-2010 长沙鼎诚软件有限公司,并保留所有权利。
* ----------------------------------------------------------------------------
* 提示:在未取得SHOP++商业授权之前,您不能将本软件应用于商业用途,否则SHOP++将保留追究的权力。
* ----------------------------------------------------------------------------
* 官方网站:http://www.shopxx.net
* ----------------------------------------------------------------------------
* KEY: SHOPXXCED32589174C8D5905B5D0A02A2F33DF
* ============================================================================
*/
@Repository
public class BaseDaoImpl<T, PK extends Serializable> implements BaseDao<T, PK> {
private Class<T> entityClass;
protected SessionFactory sessionFactory;
@SuppressWarnings("unchecked")
public BaseDaoImpl() {
this.entityClass = null;
Class c = getClass();
Type type = c.getGenericSuperclass();
if (type instanceof ParameterizedType) {
Type[] parameterizedType = ((ParameterizedType) type).getActualTypeArguments();
this.entityClass = (Class<T>) parameterizedType[0];
}
}
@Resource
public void setSessionFactory(SessionFactory sessionFactory) {
this.sessionFactory = sessionFactory;
}
protected Session getSession() {
return sessionFactory.getCurrentSession();
}
@SuppressWarnings("unchecked")
public T get(PK id) {
Assert.notNull(id, "id is required");
return (T) getSession().get(entityClass, id);
}
@SuppressWarnings("unchecked")
public T load(PK id) {
Assert.notNull(id, "id is required");
return (T) getSession().load(entityClass, id);
}
@SuppressWarnings("unchecked")
public List<T> get(PK[] ids) {
Assert.notEmpty(ids, "ids must not be empty");
String hql = "from " + entityClass.getName() + " as model where model.id in(:ids)";
return getSession().createQuery(hql).setParameterList("ids", ids).list();
}
@SuppressWarnings("unchecked")
public T get(String propertyName, Object value) {
Assert.hasText(propertyName, "propertyName must not be empty");
Assert.notNull(value, "value is required");
String hql = "from " + entityClass.getName() + " as model where model." + propertyName + " = ?";
return (T) getSession().createQuery(hql).setParameter(0, value).uniqueResult();
}
@SuppressWarnings("unchecked")
public List<T> getList(String propertyName, Object value) {
Assert.hasText(propertyName, "propertyName must not be empty");
Assert.notNull(value, "value is required");
String hql = "from " + entityClass.getName() + " as model where model." + propertyName + " = ?";
return getSession().createQuery(hql).setParameter(0, value).list();
}
@SuppressWarnings("unchecked")
public List<T> getAll() {
String hql = "from " + entityClass.getName();
return getSession().createQuery(hql).list();
}
public Long getTotalCount() {
String hql = "select count(*) from " + entityClass.getName();
return (Long) getSession().createQuery(hql).uniqueResult();
}
public boolean isUnique(String propertyName, Object oldValue, Object newValue) {
Assert.hasText(propertyName, "propertyName must not be empty");
Assert.notNull(newValue, "newValue is required");
if (newValue == oldValue || newValue.equals(oldValue)) {
return true;
}
if (newValue instanceof String) {
if (oldValue != null && StringUtils.equalsIgnoreCase((String) oldValue, (String) newValue)) {
return true;
}
}
T object = get(propertyName, newValue);
return (object == null);
}
public boolean isExist(String propertyName, Object value) {
Assert.hasText(propertyName, "propertyName must not be empty");
Assert.notNull(value, "value is required");
T object = get(propertyName, value);
return (object != null);
}
@SuppressWarnings("unchecked")
public PK save(T entity) {
Assert.notNull(entity, "entity is required");
return (PK) getSession().save(entity);
}
public void update(T entity) {
Assert.notNull(entity, "entity is required");
getSession().update(entity);
}
public void delete(T entity) {
Assert.notNull(entity, "entity is required");
getSession().delete(entity);
}
public void delete(PK id) {
Assert.notNull(id, "id is required");
T entity = load(id);
getSession().delete(entity);
}
public void delete(PK[] ids) {
Assert.notEmpty(ids, "ids must not be empty");
for (PK id : ids) {
T entity = load(id);
getSession().delete(entity);
}
}
public void flush() {
getSession().flush();
}
public void clear() {
getSession().clear();
}
public void evict(Object object) {
Assert.notNull(object, "object is required");
getSession().evict(object);
}
public Pager findByPager(Pager pager) {
if (pager == null) {
pager = new Pager();
}
DetachedCriteria detachedCriteria = DetachedCriteria.forClass(entityClass);
return findByPager(pager, detachedCriteria);
}
public Pager findByPager(Pager pager, DetachedCriteria detachedCriteria) {
if (pager == null) {
pager = new Pager();
}
Integer pageNumber = pager.getPageNumber();
Integer pageSize = pager.getPageSize();
String property = pager.getProperty();
String keyword = pager.getKeyword();
String orderBy = pager.getOrderBy();
OrderType orderType = pager.getOrderType();
Criteria criteria = detachedCriteria.getExecutableCriteria(getSession());
if (StringUtils.isNotEmpty(property) && StringUtils.isNotEmpty(keyword)) {
String propertyString = "";
if (property.contains(".")) {
String propertyPrefix = StringUtils.substringBefore(property, ".");
String propertySuffix = StringUtils.substringAfter(property, ".");
criteria.createAlias(propertyPrefix, "model");
propertyString = "model." + propertySuffix;
} else {
propertyString = property;
}
criteria.add(Restrictions.like(propertyString, "%" + keyword + "%"));
}
Integer totalCount = (Integer) criteria.setProjection(Projections.rowCount()).uniqueResult();
criteria.setProjection(null);
criteria.setResultTransformer(CriteriaSpecification.ROOT_ENTITY);
criteria.setFirstResult((pageNumber - 1) * pageSize);
criteria.setMaxResults(pageSize);
if (StringUtils.isNotEmpty(orderBy) && orderType != null) {
if (orderType == OrderType.asc) {
criteria.addOrder(Order.asc(orderBy));
} else {
criteria.addOrder(Order.desc(orderBy));
}
}
pager.setTotalCount(totalCount);
pager.setList(criteria.list());
return pager;
}
}
3.继承
public class AdminDaoImpl extends BaseDaoImpl<Admin, int>{}
分享到:
相关推荐
dao接口 : PersonDAO extends GenericDao, Integer> 可以不写代码,方法已经在父类泛型dao里了,这里为了说明:可扩展添加 findByNameExact()方法 子类的附加方法。 泛型daoimpl :GenericDaoImpl, ID extends ...
泛型单例父类(带锁线程可释放),很好用的一个泛型单例父类,想将一个类变成单例类的时候,只有继承这个class就可以了;而且带线程锁,不怕多线程的时候出现错误了,而且还能手动释放;完全成品.cs文件,直接扔项目里就能用;...
### 泛型DAO层在SSH框架中的应用与详解 #### 引言 在现代软件开发中,特别是基于Java的企业级应用开发中,DAO(Data Access Object)层的设计扮演着至关重要的角色。它作为业务逻辑层与数据持久层之间的桥梁,承担...
【标题】"Hibernate泛型Dao"是针对Java开发中的数据持久化框架Hibernate的一个高级应用,主要目的是为了提高代码的复用性和简洁性。在传统的Hibernate使用中,针对每个实体类,我们都需要创建一个对应的Dao(Data ...
而泛型DAO是一个类型安全的,代码精简的设计模式(相对于传统DAO),尤其在DAO组件数量庞大的时候,代码量的减少更加明显。 泛型DAO的核心是定义一个GenericDao接口,声明基本的CRUD操作: 用hibernate作为持久化...
至于`Dao经典泛型.doc`文件,可能是更深入的关于Hibernate泛型DAO的文档,可能包含了如何配置Spring、如何处理复杂查询以及如何优化泛型DAO的更多细节。阅读这份文档将进一步提升你对泛型DAO的理解和应用能力。 ...
【泛型DAO】是一种在Java开发中常见的设计模式,它利用了Java泛型特性来提高代码的可重用性和类型安全性。在Java中,DAO(Data Access Object)模式是用来封装对数据库的操作,将业务逻辑与数据访问逻辑分离,使得...
本文将深入探讨`JdbcTemplate`通用泛型Dao实现的相关知识点,帮助开发者更好地理解和应用这一技术。 首先,让我们了解什么是`JdbcTemplate`。它是Spring框架的一部分,用于处理SQL操作。`JdbcTemplate`提供了一组...
本篇文章将深入探讨一个使用Spring注解和Hibernate实现的泛型DAO设计,以提高代码的复用性和可维护性。 首先,`HibernateBaseDao.java`是基础的Hibernate DAO类,它提供了对Hibernate操作的基本封装。这个类通常会...
泛型DAO模式有很多优点,包括: * 保证数据访问代码的类型安全性 * 提高代码的可读性和通用性 * 简化开发 * 提高系统的健壮性和可维护性 四、Struts框架和Spring框架的使用 Struts框架和Spring框架是两个常用的...
6. **泛型Dao**:在Java开发中,泛型Dao(Generic Dao)是一种设计模式,用于减少重复的数据库操作代码。通过定义一个通用的Dao接口,可以实现对不同类型的实体对象进行CRUD操作,提高了代码的复用性和可维护性。...
泛型DAO(Generic DAO)是DAO模式的一个扩展,它引入了泛型的概念,提高了代码的复用性和类型安全性。本篇文章将深入探讨泛型DAO的实现原理、优势以及如何在实际项目中应用。 首先,我们来理解什么是泛型。泛型是...
本文探讨了在Java Web程序中应用泛型DAO模式的作用和意义。首先,文章明确了Java Web技术的定义和在互联网领域中的重要性,阐述了随着软件功能需求的不断提高,Java Web技术也在不断升级和改造。随后,文章指出泛型...
本文将深入探讨“Spring Hibernate 泛型DAO”这一主题,以及如何通过泛型DAO实现更加高效、可复用的代码。 首先,让我们理解什么是DAO(Data Access Object)模式。DAO是一种设计模式,它的主要作用是隔离业务逻辑...
而泛型DAO是DAO模式的一个进阶应用,它通过引入泛型来提高代码的复用性和可维护性。 泛型(Generics)是Java 5引入的一个重要特性,它可以让我们在编译时检查类型安全,并且允许我们创建参数化的类型。在泛型DAO中...
而泛型DAO(Data Access Object)则是基于Hibernate进一步抽象出来的一个设计模式,用于提供更通用的数据操作方法。本文档主要探讨了如何在Spring+Hibernate环境中创建和使用泛型DAO。 首先,我们来看一下泛型DAO...
这个压缩包文件的标题"SSH 泛型DAO分页"表明它提供了一个实现SSH框架整合的示例,特别关注了泛型DAO(Data Access Object)以及分页功能。下面将详细介绍SSH框架及其分页和泛型DAO的概念。 1. **Struts2**: Struts2...
标题中的“基于Hibernate的泛型Dao框架”是指在Java开发中使用Hibernate ORM工具,并结合泛型设计模式构建的数据库访问对象(DAO)框架。这样的框架旨在提高代码复用性,减少重复工作,使得数据访问层的实现更加简洁...