很nice的泛型dao父类

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,apache,bean,.net,Hibernate)