zoukankan      html  css  js  c++  java
  • 分页功能 (包含增删改查)工具类

    首先是接口 DAO

    package cn.itcast.service.base;

    import java.io.Serializable;
    import java.util.LinkedHashMap;

    import cn.itcast.bean.QueryResult;

    public interface DAO<T> {
     /**
      * 获取记录总数
      * @param entityClass 实体类
      * @return
      */
     public long getCount();
     /**
      * 清除一级缓存的数据
      */
     public void clear();
     /**
      * 保存实体
      * @param entity 实体id
      */
     public void save(T entity);
     /**
      * 更新实体
      * @param entity 实体id
      */
     public void update(T entity);
     /**
      * 删除实体
      * @param entityClass 实体类
      * @param entityids 实体id数组
      */
     public void delete(Serializable ... entityids);
     /**
      * 获取实体
      * @param <T>
      * @param entityClass 实体类
      * @param entityId 实体id
      * @return
      */
     public T find(Serializable entityId);
     /**
      * 获取分页数据
      * @param <T>
      * @param entityClass 实体类
      * @param firstindex 开始索引
      * @param maxresult 需要获取的记录数
      * @return
      */
     public QueryResult<T> getScrollData(int firstindex, int maxresult, String wherejpql, Object[] queryParams,LinkedHashMap<String, String> orderby);
     
     public QueryResult<T> getScrollData(int firstindex, int maxresult, String wherejpql, Object[] queryParams);
     
     public QueryResult<T> getScrollData(int firstindex, int maxresult, LinkedHashMap<String, String> orderby);
     
     public QueryResult<T> getScrollData(int firstindex, int maxresult);
     
     public QueryResult<T> getScrollData();
    }

    然后是实现此接口的抽象类

    DaoSupport

    package cn.itcast.service.base;

    import java.beans.Introspector;
    import java.beans.PropertyDescriptor;
    import java.io.Serializable;
    import java.lang.reflect.Method;
    import java.util.LinkedHashMap;

    import javax.persistence.EmbeddedId;
    import javax.persistence.Entity;
    import javax.persistence.EntityManager;
    import javax.persistence.PersistenceContext;
    import javax.persistence.Query;

    import org.springframework.transaction.annotation.Propagation;
    import org.springframework.transaction.annotation.Transactional;

    import cn.itcast.bean.QueryResult;
    import cn.itcast.utils.GenericsUtils;


    @SuppressWarnings("unchecked")
    @Transactional
    public abstract class DaoSupport<T> implements DAO<T>{
     protected Class<T> entityClass = GenericsUtils.getSuperClassGenricType(this.getClass());
     @PersistenceContext protected EntityManager em;
     
     public void clear(){
      em.clear();
     }

     public void delete(Serializable ... entityids) {
      for(Object id : entityids){
       em.remove(em.getReference(this.entityClass, id));
      }
     }
     
     @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
     public T find(Serializable entityId) {
      if(entityId==null) throw new RuntimeException(this.entityClass.getName()+ ":传入的实体id不能为空");
      return em.find(this.entityClass, entityId);
     }

     public void save(T entity) {
      em.persist(entity);
     }
     
     @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
     public long getCount() {
      return (Long)em.createQuery("select count("+ getCountField(this.entityClass) +") from "+ getEntityName(this.entityClass)+ " o").getSingleResult();
     }
     
     public void update(T entity) {
      em.merge(entity);
     }
     
     @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
     public QueryResult<T> getScrollData(int firstindex, int maxresult, LinkedHashMap<String, String> orderby) {
      return getScrollData(firstindex,maxresult,null,null,orderby);
     }
     
     @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
     public QueryResult<T> getScrollData(int firstindex, int maxresult, String wherejpql, Object[] queryParams) {
      return getScrollData(firstindex,maxresult,wherejpql,queryParams,null);
     }
     
     @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
     public QueryResult<T> getScrollData(int firstindex, int maxresult) {
      return getScrollData(firstindex,maxresult,null,null,null);
     }
     
     @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
     public QueryResult<T> getScrollData() {
      return getScrollData(-1, -1);
     }

     @Transactional(readOnly=true,propagation=Propagation.NOT_SUPPORTED)
     public QueryResult<T> getScrollData(int firstindex, int maxresult
       , String wherejpql, Object[] queryParams,LinkedHashMap<String, String> orderby) {
      QueryResult qr = new QueryResult<T>();
      String entityname = getEntityName(this.entityClass);
      Query query = em.createQuery("select o from "+ entityname+ " o "+(wherejpql==null || "".equals(wherejpql.trim())? "": "where "+ wherejpql)+ buildOrderby(orderby));
      setQueryParams(query, queryParams);
      if(firstindex!=-1 && maxresult!=-1) query.setFirstResult(firstindex).setMaxResults(maxresult);
      qr.setResultlist(query.getResultList());
      query = em.createQuery("select count("+ getCountField(this.entityClass)+ ") from "+ entityname+ " o "+(wherejpql==null || "".equals(wherejpql.trim())? "": "where "+ wherejpql));
      setQueryParams(query, queryParams);
      qr.setTotalrecord((Long)query.getSingleResult());
      return qr;
     }
     
     protected static void setQueryParams(Query query, Object[] queryParams){
      if(queryParams!=null && queryParams.length>0){
       for(int i=0; i<queryParams.length; i++){
        query.setParameter(i+1, queryParams[i]);
       }
      }
     }
     /**
      * 组装order by语句
      * @param orderby
      * @return
      */
     protected static String buildOrderby(LinkedHashMap<String, String> orderby){
      StringBuffer orderbyql = new StringBuffer("");
      if(orderby!=null && orderby.size()>0){
       orderbyql.append(" order by ");
       for(String key : orderby.keySet()){
        orderbyql.append("o.").append(key).append(" ").append(orderby.get(key)).append(",");
       }
       orderbyql.deleteCharAt(orderbyql.length()-1);
      }
      return orderbyql.toString();
     }
     /**
      * 获取实体的名称
      * @param <E>
      * @param clazz 实体类
      * @return
      */
     protected static <E> String getEntityName(Class<E> clazz){
      String entityname = clazz.getSimpleName();
      Entity entity = clazz.getAnnotation(Entity.class);
      if(entity.name()!=null && !"".equals(entity.name())){
       entityname = entity.name();
      }
      return entityname;
     }
     /**
      * 获取统计属性,该方法是为了解决hibernate解析联合主键select count(o) from Xxx o语句BUG而增加,hibernate对此jpql解析后的sql为select count(field1,field2,...),显示使用count()统计多个字段是错误的
      * @param <E>
      * @param clazz
      * @return
      */
     protected static <E> String getCountField(Class<E> clazz){
      String out = "o";
      try {
       PropertyDescriptor[] propertyDescriptors = Introspector.getBeanInfo(clazz).getPropertyDescriptors();
       for(PropertyDescriptor propertydesc : propertyDescriptors){
        Method method = propertydesc.getReadMethod();
        if(method!=null && method.isAnnotationPresent(EmbeddedId.class)){     
         PropertyDescriptor[] ps = Introspector.getBeanInfo(propertydesc.getPropertyType()).getPropertyDescriptors();
         out = "o."+ propertydesc.getName()+ "." + (!ps[1].getName().equals("class")? ps[1].getName(): ps[0].getName());
         break;
        }
       }
      } catch (Exception e) {
       e.printStackTrace();
      }
            return out;
     }
    }

  • 相关阅读:
    php底层HashTable的实现
    【问底】徐汉彬:PHP7和HHVM的性能之争
    linux查找系统中占用磁盘空间最大的文件
    深入理解Yii2.0(yii学习的经典博客)
    梦想天空(关注前端开发技术 html5+css3)
    风雪之隅(Laruence PHP开发组成员, Zend兼职顾问, Yaf, Yar, Yac, Opcache等项目作者、维护者.)
    阿里云收集服务器性能指标的python脚本
    简单5步,释放Mac磁盘空间
    我是如何自学Android,资料分享(2015 版)
    查询tensorflow中的函数用法
  • 原文地址:https://www.cnblogs.com/yaoboyyao/p/3543252.html
Copyright © 2011-2022 走看看