呵呵,第一次发帖,希望不要被群体鄙视。前段时间在公司做项目时负责几个小模块,功能很简单,实现动态参数查询分页就可以。因为本人刚进入工作,属于菜鸟级别,之前是针对每张表写一个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中调用其一即可。各位大虾要是有什么好方法不吝赐教哈!