`
gaogengzhi
  • 浏览: 106144 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

SSH通用查询DAO

阅读更多

        呵呵,第一次发帖,希望不要被群体鄙视。前段时间在公司做项目时负责几个小模块,功能很简单,实现动态参数查询分页就可以。因为本人刚进入工作,属于菜鸟级别,之前是针对每张表写一个DAO,现把它做成一个通用的DAO,采用Hibernate的QBC查询。DAO代码如下:

package com.aostarit.erp.dao;

import java.util.List;
import java.util.Map;
import java.util.Set;

import org.hibernate.Criteria;
import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Example;
import org.hibernate.criterion.Projections;
import org.hibernate.criterion.Restrictions;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.aostarit.erp.util.Pager;

public class ManagerDao extends HibernateDaoSupport
{

	private Class entity;

	public Class getEntity()
	{
		return entity;
	}

	public void setEntity(Class entity)
	{
		this.entity = entity;
	}

	/**
	 * @function 根据传递过来的hql语句,做相应的查询
	 * @return 返回记录数的集合
	 */
	public List getAllInfo(String hql)
	{
		List list = this.getHibernateTemplate().find(hql);
		return list;
	}

	/**
	 * @function 根据传递过来的hql语句,做相应的查询
	 * @return 将查询结果封装成Bean返回
	 */
	public Object getBeanInfo(String hql)
	{

		List list = this.getHibernateTemplate().find(hql);
		return list.get(0);
	}

	/**
	 * @function 查询抢修人员所以记录数
	 * @return 返回记录数的个数
	 */
	public int getTotalCount(String hql)
	{
		List list = this.getHibernateTemplate().find(hql);
		Integer i = (Integer) list.get(0);
		return i;
	}

	/**
	 * @function 分页显示符合所有的记录数,将查询结果封装为Pager
	 * @param pageNo
	 *            当前页数
	 * @param pageSize
	 *            每页显示的条数
	 * @return 查询结果Pager
	 */
	public Pager findPageAll(int pageNo, int pageSize)
	{
		Pager pager = null;
		try
		{
			Criteria criteria = this.getSession().createCriteria(
					this.getEntity());

			// 获取总行数
			int rowCount = (Integer) criteria.setProjection(
					Projections.rowCount()).uniqueResult();
			criteria.setProjection(null);

			criteria.setFirstResult((pageNo - 1) * pageSize);
			criteria.setMaxResults(pageSize);

			List result = criteria.list();

			pager = new Pager(pageSize, pageNo, rowCount, result);

		} catch (RuntimeException re)
		{
			throw re;
		} finally
		{
			return pager;
		}
	}

	/**
	 * @function 分页显示符合所有的记录数,将查询结果封装为Pager
	 * @param pageNo
	 *            当前页数
	 * @param pageSize
	 *            每页显示的条数
	 * @param map
	 *            将查询条件封装为map
	 * @return 查询结果Pager
	 */
	public Pager findPageByCriteria(int pageNo, int pageSize, Map map)
	{
		Pager pager = null;
		try
		{
			Criteria criteria = this.getSession().createCriteria(
					this.getEntity());

			if (map != null)
			{
				Set keys = map.keySet();
				for (String key : keys)
				{
					criteria.add(Restrictions.like(key, map.get(key)));
				}
			}

			// 获取根据条件分页查询的总行数
			int rowCount = (Integer) criteria.setProjection(
					Projections.rowCount()).uniqueResult();
			criteria.setProjection(null);

			criteria.setFirstResult((pageNo - 1) * pageSize);
			criteria.setMaxResults(pageSize);

			List result = criteria.list();

			pager = new Pager(pageSize, pageNo, rowCount, result);

		} catch (RuntimeException re)
		{
			throw re;
		} finally
		{
			return pager;
		}

	}

	/**
	 * @function 分页显示符合所有的记录数,将查询结果封装为Pager
	 * @param pageNo
	 *            当前页数
	 * @param pageSize
	 *            每页显示的条数
	 * @param criterions
	 *            不定参数Criterion
	 * @return 查询结果Pager
	 */
	public Pager findPageByCriteria(int pageNo, int pageSize,
			Criterion... criterions)
	{
		Pager pager = null;
		try
		{
			Criteria criteria = this.getSession().createCriteria(
					this.getEntity());
			if (criterions != null)
			{
				for (Criterion criterion : criterions)
				{
					if (criterion != null)
					{
						criteria.add(criterion);
					}

				}
			}

			// 获取根据条件分页查询的总行数
			int rowCount = (Integer) criteria.setProjection(
					Projections.rowCount()).uniqueResult();
			criteria.setProjection(null);

			criteria.setFirstResult((pageNo - 1) * pageSize);
			criteria.setMaxResults(pageSize);

			List result = criteria.list();

			pager = new Pager(pageSize, pageNo, rowCount, result);

		} catch (RuntimeException re)
		{
			throw re;
		} finally
		{
			return pager;
		}

	}

	/**
	 * @function 根据传递过来的Object,在数据库中查找语气匹配的记录
	 * @param pageNo
	 *            当前页数
	 * @param pageSize
	 *            每页显示的记录数
	 * @param object
	 *            将查询条件封装为Object
	 * @return 将查询结果封装为Pager返回
	 */
	public Pager findPageByExample(int pageNo, int pageSize, Object object)
	{
		Pager pager = null;
		try
		{
			Criteria criteria = this.getSession().createCriteria(
					this.getEntity());

			if (object != null)
			{
				criteria.add(Example.create(object).enableLike());
			}

			// 获取根据条件分页查询的总行数
			int rowCount = (Integer) criteria.setProjection(
					Projections.rowCount()).uniqueResult();
			criteria.setProjection(null);

			criteria.setFirstResult((pageNo - 1) * pageSize);
			criteria.setMaxResults(pageSize);

			List result = criteria.list();

			pager = new Pager(pageSize, pageNo, rowCount, result);

		} catch (RuntimeException re)
		{
			throw re;
		} finally
		{
			return pager;
		}

	}

}


BO层代码如下:

package com.aostarit.erp.bo;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.MatchMode;
import org.hibernate.criterion.Restrictions;

import com.aostarit.erp.dao.MendManagerDao;
import com.aostarit.erp.po.EicMend;
import com.aostarit.erp.util.Pager;

public class MendBo
{

	/**
	 * 依靠Spring的依赖注入,注入抢修人员的Dao
	 */
	private MendManagerDao mendManagerDao;

	public MendManagerDao getMendManagerDao()
	{
		return mendManagerDao;
	}

	public void setMendManagerDao(MendManagerDao mendManagerDao)
	{
		this.mendManagerDao = mendManagerDao;
		try
		{
			// 设置该BO操作所对应的pojo
			this.mendManagerDao.setEntity(Class
					.forName("com.aostarit.erp.po.EicMend"));
		} catch (ClassNotFoundException e)
		{
			e.printStackTrace();
		}
	}

	/**
	 * @function 根据传递过来的列名,在数据库中查询该列不重复的记录,前台用下拉框显示
	 * @param column
	 *            传递过来的列名
	 * @return 该列不重复的记录
	 */
	public List getColumn(String column)
	{
		String table = "EicMend";
		StringBuffer hql = new StringBuffer();
		hql.append("select distinct(").append(column).append(") from ").append(
				table).append(" where ").append(column).append(" is not null");
		return mendManagerDao.getAllInfo(hql.toString());
	}

	/**
	 * @function 根据传递过来的分页的参数,分页查找数据库中的记录
	 * @param pageNo
	 *            当前的页码
	 * @param pageSize
	 *            每页显示的记录数
	 * @return 符合条件的记录数
	 */
	public Pager getAllInfo(int pageNo, int pageSize)
	{
		Pager pager = mendManagerDao.findPageAll(pageNo, pageSize);
		return pager;
	}

	/**
	 * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录
	 * @param pageNo
	 *            当前的页码
	 * @param pageSize
	 *            每页显示的记录数
	 * @param mendName
	 * @param specialt
	 * @param post
	 * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
	 */
	public Pager getInfoByQuery1(int pageNo, int pageSize, String mendName,
			String specialty, String post)
	{

		EicMend eicMend = new EicMend();
		if (mendName != null && mendName.length() > 0)
		{
			eicMend.setMendname(mendName);
		}
		if (specialty != null && specialty.length() > 0)
		{
			eicMend.setSpecialty(specialty);
		}
		if (post != null && post.length() > 0)
		{
			eicMend.setPost(post);
		}

		Pager pager = mendManagerDao.findPageByExample(pageNo, pageSize,
				eicMend);
		return pager;
	}

	/**
	 * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录
	 * @param pageNo
	 *            当前的页码
	 * @param pageSize
	 *            每页显示的记录数
	 * @param mendName
	 *            抢修人员的名称
	 * @param specialty
	 *            抢修人员的工种
	 * @param post
	 *            抢修人员的职称
	 * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
	 */
	public Pager getInfoByQuery2(int pageNo, int pageSize, String mendName,
			String specialty, String post)
	{

		Map map = new HashMap();

		if (mendName != null && mendName.length() > 0)
		{
			map.put("mendname", "%" + mendName + "%");
		}
		if (specialty != null && specialty.length() > 0)
		{
			map.put("specialty", specialty);
		}
		if (post != null && post.length() > 0)
		{
			map.put("post", post);
		}

		Pager pager = mendManagerDao.findPageByCriteria(pageNo, pageSize, map);
		return pager;
	}

	/**
	 * @function 将传递过来的参数封装成抢修人员Bean,分页查询符合条件的记录
	 * @param pageNo
	 *            当前的页码
	 * @param pageSize
	 *            每页显示的记录数
	 * @param mendName
	 *            抢修人员的名称
	 * @param specialty
	 *            抢修人员的工种
	 * @param post
	 *            抢修人员的职称
	 * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
	 */
	public Pager getInfoByQuery3(int pageNo, int pageSize, String mendName,
			String specialty, String post)
	{
		Criterion criterion1 = null, criterion2 = null, criterion3 = null;
		if (mendName != null && mendName.length() > 0)
		{
			criterion1 = Restrictions.ilike("mendname", mendName,
					MatchMode.ANYWHERE);
		}

		if (specialty != null && specialty.length() > 0)
		{
			criterion2 = Restrictions.ilike("specialty", specialty,
					MatchMode.EXACT);
		}

		if (post != null && post.length() > 0)
		{
			criterion3 = Restrictions.ilike("post", post, MatchMode.EXACT);
		}

		Pager pager = mendManagerDao.findPageByCriteria(pageNo, pageSize,
				criterion1, criterion2, criterion3);

		return pager;
	}

	/**
	 * @function 根据所属单位的Id,分页查询相关信息
	 * @param pageNo
	 *            当前页码
	 * @param pageSize
	 *            每页显示的记录数
	 * @param deptId
	 *            所属单位的Id
	 * @return 将符合条件的记录数以及页码信息封装成PagerBean返回
	 */
	public Pager getInfoByDept(int pageNo, int pageSize, String deptId)
	{

		Criterion criterion1 = null;

		if (deptId != null && deptId.length() > 0)
		{
			criterion1 = Restrictions.ilike("aorganization.orgCode", deptId,
					MatchMode.EXACT);
		}
		Pager pager = mendManagerDao.findPageByCriteria(pageNo, pageSize,
				criterion1);
		return pager;

	}

	/**
	 * @function 根据抢修人员的主键Id,查询抢修人员的详细信息
	 * @param equipId
	 *            抢修人员的主键
	 * @return 将查询结果封装成抢修人员Bean返回
	 */
	public EicMend getBeanInfo(String mendId)
	{
		StringBuffer hql = new StringBuffer();
		hql.append("from EicMend e where e.mendid = ").append(mendId);
		return (EicMend) mendManagerDao.getBeanInfo(hql.toString());
	}

}



注:MendBo类中,模糊查询采用两种方式:QBC和QBE,其中getInfoByQuery1为QBE查询,getInfoByQuery2采用map封装查询条件,getInfoByQuery3采用Criterion封装查询条件,在通过JDK1.5设置不定参数方法传递给DAO,三个方法均为实现同一目的,只是采取不同操作而已。实际项目中在Action中调用其一即可。各位大虾要是有什么好方法不吝赐教哈!

 

分享到:
评论
4 楼 qizikang 2008-11-19  
我也是菜鸟
3 楼 awary 2008-11-19  
linkjava 写道
在DAO里没有实现多表关联查询

对,这种设计也没有办法实现多表关联.另外,可扩展性不好,比如将来想加个某几个常用的TABLE加个缓存,跟本无处下手..
2 楼 linkjava 2008-11-19  
在DAO里没有实现多表关联查询
1 楼 yhily2005 2008-11-13  
也没有什么而已

相关推荐

Global site tag (gtag.js) - Google Analytics