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