首页>代码>Struts2.3.5+Hibernate3+Spring3.1基于注解实现的多文件上传,下载>/FileUploadDownLoad/FileUploadDownLoad/src/cn/gov/csdn/base/dao/impl/BaseDaoImpl.java
package cn.gov.csdn.base.dao.impl;

import java.lang.reflect.ParameterizedType;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.SQLQuery;
import org.hibernate.SessionFactory;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;

import cn.gov.csdn.base.dao.BaseDao;
import cn.gov.csdn.base.util.ValidateUtil;
import cn.gov.csdn.base.vo.Paginater;

/**
*
* File:    BaseDaoImpl抽象类
* Author:  admin
* Version: 1.0
* Date:    2014/01/02 15:33
* Modify:
* Description:用于继承
* Copyright csdn
 */
public abstract class BaseDaoImpl<T> implements BaseDao<T> {

	private Class clazz;

	/* 注入SessionFactory */
	@Resource
	private SessionFactory sf;

	public BaseDaoImpl() {
		ParameterizedType type = (ParameterizedType) this.getClass()
				.getGenericSuperclass();
		clazz = (Class) type.getActualTypeArguments()[0];
	}

	public void saveEntity(T t) {
		sf.getCurrentSession().save(t);
	}

	public void saveOrUpdateEntity(T t) {
		sf.getCurrentSession().saveOrUpdate(t);
	}

	public void updateEntity(T t) {
		sf.getCurrentSession().update(t);
	}

	public void deleteEntity(T t) {
		sf.getCurrentSession().delete(t);
	}

	public SessionFactory getSf() {
		return sf;
	}

	public void setSf(SessionFactory sf) {
		this.sf = sf;
	}

	/**
	 * 按照hql语句批量写操作
	 */
	public void batchEntityByHQL(String hql, Object... objects) {
		Query q = sf.getCurrentSession().createQuery(hql);
		for (int i = 0; i < objects.length; i++) {
			q.setParameter(i, objects[i]);
		}
		q.executeUpdate();
	}

	public T loadEntity(Integer id) {
		return (T) sf.getCurrentSession().load(clazz, id);
	}

	public T getEntity(Integer id) {
		return (T) sf.getCurrentSession().get(clazz, id);
	}

	public List<T> findAllEntities() {
		String hql = "from " + clazz.getSimpleName();
		return findEntityByHQL(hql);
	}

	// 执行原生sql语句
	protected void executeSQL(String sql, Object... objects) {
		SQLQuery q = sf.getCurrentSession().createSQLQuery(sql);
		for (int i = 0; i < objects.length; i++) {
			q.setParameter(i, objects[i]);
		}
		q.executeUpdate();
	}

	protected List<T> findEntityByHQL(String hql, Object... objects) {
		Query q = sf.getCurrentSession().createQuery(hql);
		for (int i = 0; i < objects.length; i++) {
			q.setParameter(i, objects[i]);
		}
		return q.list();
	}

	// 按照sql查询
	protected List<T> findObjectBySQL(String sql, Object... objects) {
		SQLQuery q = sf.getCurrentSession().createSQLQuery(sql);
		for (int i = 0; i < objects.length; i++) {
			q.setParameter(i, objects[i]);
		}
		// 给查询添加实体
		q.addEntity(clazz);
		return q.list();
	}

	// 单值检索,查询结果有且仅有一条记录
	protected Object uniqueResult(String hql, Object... objects) {
		Query q = sf.getCurrentSession().createQuery(hql);
		for (int i = 0; i < objects.length; i++) {
			q.setParameter(i, objects[i]);
		}
		return q.uniqueResult();
	}

	/**
	 * 开启hibernate二级缓存的查询缓存版本 hibernate二级缓存共有四部分,除了用于缓存hql的查询缓存
	 * 剩下三部分是:类缓存,集合缓存,更新时间戳缓存
	 */
	@SuppressWarnings("rawtypes")
	protected List batchEntityByHQLCacheable(String hql, Object... objects) {
		Query q = getSf().getCurrentSession().createQuery(hql);
		for (int i = 0; i < objects.length; i++) {
			q.setParameter(i, objects[i]);
		}
		q.setCacheable(true);
		return q.list();
	}

	// 解决hibernate的a different object with the same identifier
	// value was already associated with the session问题
	// saveOrUpdate之前先clear();
	public void saveOrUpClearFirst(T t) {
		sf.getCurrentSession().clear();
		sf.getCurrentSession().saveOrUpdate(t);
	}

	/**
	 * 分页,模糊查询目前版本没有实现。等下个版本。
	 */
	public Paginater findPaging(int pageNo, int pageSize, Object... objects) {
		if (objects == null) {
			return findPaging(pageNo, pageSize, null, null);
		} else {
			List<Criterion> lst = new ArrayList<Criterion>();
			Criterion criterion = Restrictions.eq(objects[0].toString(),
					objects[1]);
			lst.add(criterion);
			return findPaging(pageNo, pageSize, lst, null);
		}

	}

	protected Paginater findPaging(int pageNo, int pageSize,
			List<Criterion> crits, List<Order> orders) {
		Criteria criteria = sf.getCurrentSession().createCriteria(clazz);
		if (ValidateUtil.isValid(crits)) {
			// 拼装查询条件
			for (int i = 0; i < crits.size(); i++) {
				criteria.add(crits.get(i));
			}
		}

		if (ValidateUtil.isValid(orders)) {
			// 拼装排序条件
			for (int i = 0; i < orders.size(); i++) {
				criteria.addOrder(orders.get(i));
			}

		} else {
			criteria.addOrder(Order.desc("id"));
		}

		int currentPage = pageNo == 0 ? 1 : pageNo;

		// 获取根据条件分页查询的总行数
		int count = ((Long) criteria.setProjection(Projections.rowCount())
				.uniqueResult()).intValue();
		// 查完条数记得清空Projection
		criteria.setProjection(null);

		int totalPage = count % pageSize == 0 ? count / pageSize : count
				/ pageSize + 1;

		int start = (currentPage - 1) * pageSize;
		// 进行查库
		List<T> list = criteria.setFirstResult(start).setMaxResults(pageSize)
				.list();

		// 封装分页对象
		Paginater paginater = new Paginater();
		paginater.setPageSize(pageSize);
		paginater.setCurrentPage(currentPage);
		paginater.setTotalNum(count);
		paginater.setTotalPage(totalPage);
		paginater.setRoot(list);
		if (currentPage == 1) {
			paginater.setFirstPage(true);
			paginater.setHasPreviousPage(false);
		} else {
			paginater.setFirstPage(false);
			paginater.setHasPreviousPage(true);
		}
		if (currentPage == totalPage) {
			paginater.setHasNextPage(false);
		} else {
			paginater.setHasNextPage(true);
		}

		if (totalPage < currentPage) {
			paginater.setHasPreviousPage(true);
		} else {
			paginater.setHasNextPage(false);
		}
		return paginater;
	}
}
最近下载更多
597117933  LV8 2020年12月17日
17704627276  LV17 2020年10月19日
annazhang  LV29 2020年7月19日
lwp011  LV27 2020年7月7日
1404002391  LV12 2020年5月20日
912299793  LV21 2020年5月15日
angujj  LV1 2020年3月23日
13148918399  LV9 2019年12月10日
592381035  LV1 2019年12月5日
hzhsh0223  LV18 2019年9月18日
最近浏览更多
WBelong  LV7 2023年12月11日
似鹤不是鹤似鹤不是鹤  LV1 2023年5月5日
彩色天空  LV5 2023年4月8日
and123456  LV11 2022年3月16日
mafangnu  LV8 2021年12月26日
i967967  LV2 2021年12月14日
yema2986  LV2 2021年11月18日
Echo  LV1 2021年10月8日
铁血战士  LV1 2021年6月2日
ssy961021  LV7 2021年5月20日
顶部 客服 微信二维码 底部
>扫描二维码关注最代码为好友扫描二维码关注最代码为好友