一个强大的父类:BaseDao
来源:互联网 发布:mac能打dota2吗 编辑:程序博客网 时间:2024/06/03 12:39
import static com.xxx.travel.common.utils.ClassUtils.getActualTypeArguments;import static com.xxx.travel.common.utils.ClassUtils.getUUField;import java.lang.reflect.Field;import java.sql.SQLException;import java.util.HashMap;import java.util.Iterator;import java.util.List;import java.util.Map;import org.hibernate.HibernateException;import org.hibernate.Query;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.transform.Transformers;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.dao.support.DaoSupport;import org.springframework.orm.hibernate3.HibernateCallback;import org.springframework.orm.hibernate3.HibernateTemplate;import com.xxx.travel.common.base.bo.Page;import com.xxx.travel.common.base.dao.interfaces.BaseDaoInterface;/** * 数据层的基类 * * @author IXR * @param <M> * 模型对象 */public class BaseDao<M> extends DaoSupport implements BaseDaoInterface<M> { @Autowired private SessionFactory sessionFactory; private HibernateTemplate hibernateTemplate; /** * 获取数据库操作模版 */ public final HibernateTemplate getHibernateTemplate() { return this.hibernateTemplate; } /** 初始化hibernateTemplate对象 */ protected void checkDaoConfig() throws IllegalArgumentException { hibernateTemplate = new HibernateTemplate(sessionFactory); } /** 获取SessionFactory工厂 */ protected SessionFactory getSessionFactory() { return sessionFactory; } /** * 保存数据 * * @param m * 模型对象 * @author IXR */ public void save(M m) { getHibernateTemplate().save(m); } /** * 加载数据 * * @param m * 模型对象 * @author IXR */ public void load(M m) { try { Field field = getUUField(getModelClass()); field.setAccessible(true); getHibernateTemplate().load(m, field.get(m).toString()); } catch (Exception e) { // TODO : ERROR logger.error(e); } } /** * 删除对象 * * @param m * 模型对象 * @author IXR */ public void delete(M m) { getHibernateTemplate().delete(m); } /** * 更新数据 * * @param m * 模型对象 * @author IXR */ public void update(M m) { getHibernateTemplate().update(m); } /** * 根据条件查询数量 * * @return Long * @author IXR */ public Long findExampleCount(M m) { ModuleExample example = new ModuleExample(m); return (Long) getObject("select count(*) " + example.getHql(), example.getParameters()); } /** * 保存集合 * * @param mList * 对象集合 */ public void saveAll(List<M> mList) { Session session = sessionFactory.openSession(); for (M m : mList) { session.save(m); } session.flush(); session.close(); } /** * 执行无返回结果语句 * * @param hql * 执行语句 * @param parameters * 参数列表 */ public void execute(final String hql, final Map<String, Object> parameters) { getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); if (parameters != null && parameters.size() > 0) { for (String key : parameters.keySet()) { query.setParameter(key, parameters.get(key)); } } return query.executeUpdate(); } }); } /** * 根据条件分页查询数据 * * @param page * 分页信息 * @return List<M> * @author IXR */ @SuppressWarnings("unchecked") public List<M> findExampleByPage(Page<M> page) { ModuleExample example = new ModuleExample(page.getModel()); return (List<M>) findExampleByPage(example.getHql(), example.getParameters(), page.getStartRow(), page.getPageSize()); } /** * 根据条件查询数据 * * @param M * 模型信息 * @return List<M> * @author IXR */ public List<M> findExample(M m) { ModuleExample example = new ModuleExample(m); return findByParameters(example.getHql(), example.getParameters()); } /** * 分页查询数据 * * @param hql * 查询语句 * @param parameters * 查询条件 * @param firstResult * 开始条数 * @param maxResults * 查询条数 * @return */ public List<?> findExampleByPage(final String hql, final Map<String, Object> parameters, final int firstResult, final int maxResults) { return getHibernateTemplate().executeFind(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); if (parameters != null && parameters.size() > 0) { for (String key : parameters.keySet()) { query.setParameter(key, parameters.get(key)); } } query.setFirstResult(firstResult); query.setMaxResults(maxResults); return query.list(); } }); } /** * 返回单一对象方法<br> * 如count、sum等<br> * 多用于分页总数统计<br> * * @param hql * 查询语句 * @param parameters * 查询参数 * @return Object * @author IXR */ protected Object getObject(final String hql, final Map<String, Object> parameters) { return getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); if (parameters != null && parameters.size() > 0) { for (String key : parameters.keySet()) { query.setParameter(key, parameters.get(key)); } } List<?> result = query.list(); return result.size() > 0 ? result.get(0) : null; } }); } /** * 根据M类型来算出带命名空间 * * @return 返回类型为 Class<M> * @author IXR */ @SuppressWarnings("unchecked") protected Class<M> getModelClass() { return (Class<M>) getActualTypeArguments(this.getClass())[0]; } /** * 根据参数查询列表 * * @param hql * 查询语句 * @param parameters * 查询参数 * @return 集合信息 */ protected List<?> findByParametersEx(String hql, Map<String, Object> parameters) { String[] keys = new String[parameters.size()]; Object[] values = new Object[parameters.size()]; Iterator<String> keyIterator = parameters.keySet().iterator(); for (int i = 0; i < parameters.size(); i++) { keys[i] = keyIterator.next(); values[i] = parameters.get(keys[i]); } return getHibernateTemplate().findByNamedParam(hql, keys, values); } /** * 根据参数查询列表 * * @param hql * 查询语句 * @param parameters * 查询参数 * @param boClass * 返回对象的类型 * @return * @return 集合信息 */ @SuppressWarnings("unchecked") protected <T> List<T> findByParametersEx(final String hql, final Map<String, Object> parameters, final Class<T> boClass) { return (List<T>) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) throws HibernateException, SQLException { Query query = session.createQuery(hql); if (parameters != null && parameters.size() > 0) { for (String key : parameters.keySet()) { query.setParameter(key, parameters.get(key)); } } return query.setResultTransformer(Transformers.aliasToBean(boClass)).list(); } }); } /** * 根据参数查询列表 * * @param hql * 查询语句 * @param parameters * 查询参数 * @return 集合信息 */ @SuppressWarnings("unchecked") protected List<M> findByParameters(String hql, Map<String, Object> parameters) { return (List<M>) findByParametersEx(hql, parameters); } protected ModuleExample newInstanceModuleExample(M m) { return new ModuleExample(m); } /** * 模糊查询 */ protected class ModuleExample{ public ModuleExample(M m) { Map<String, Object> parameters = new HashMap<String, Object>(); StringBuffer hql = new StringBuffer(); hql.append("from "); hql.append(getModelClass().getName()); if (m == null) { try { m = getModelClass().newInstance(); } catch (Exception e) { // TODO : ERROR logger.error(e); } } else { hql.append(" where "); StringBuffer where = new StringBuffer(); where.append("1=1"); Field[] fields = getModelClass().getDeclaredFields(); for (Field field : fields) { if(field.getName().equals("serialVersionUID")){ continue; } field.setAccessible(true); Object obj = null; try { obj = field.get(m); } catch (Exception e) { // TODO : ERROR logger.error(e); } if (obj != null && (!field.getType().equals(String.class) || !"".equals(obj))) { where.append(" and "); where.append(field.getName()); if(obj.toString().startsWith("=")) { where.append(" = :"); }else if(obj.toString().startsWith("!")) { where.append(" != :"); obj = obj.toString().substring(1); }else { where.append(" like :"); } where.append(field.getName()); parameters.put(field.getName(), obj); } } this.where = where.toString(); hql.append(this.where); } this.hql = hql.toString(); this.parameters = parameters; } private String where; public String getWhere(){ return where; } public String getWhere(String prefix){ return where.replaceAll("and ", "and " + prefix + "."); } private String hql; private Map<String, Object> parameters = new HashMap<String, Object>(); public String getHql() { return hql; } public Map<String, Object> getParameters() { return parameters; } }}