一个强大的父类:BaseDao

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;
    }
  }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值