• Hibernate抽取BaseDao


    package com.cky.dao;
    
    import org.hibernate.Query;
    import org.hibernate.Session;
    import org.hibernate.criterion.DetachedCriteria;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.orm.hibernate3.HibernateTemplate;
    import org.springframework.util.Assert;
    
    import java.io.Serializable;
    import java.lang.reflect.ParameterizedType;
    import java.lang.reflect.Type;
    import java.util.List;
    import java.util.regex.Matcher;
    import java.util.regex.Pattern;
    
    public class BaseDao<T> {
        private Class<T> entityClass;
        private HibernateTemplate hibernateTemplate;
        @Autowired
        public void setHibernateTemplate(HibernateTemplate hibernateTemplate){
            this.hibernateTemplate=hibernateTemplate;
        }
      //反射获取泛型类型
    public BaseDao(){ Type genType=getClass().getGenericSuperclass(); Type[] types=((ParameterizedType)genType).getActualTypeArguments(); entityClass=(Class)types[0]; }   //通过Id查找对象 public T findById(Serializable id){ return getHibernateTemplate().get(entityClass,id); }
      //离线查询对象
    public List<T> findByCriteria(DetachedCriteria criteria){ return (List<T>) getHibernateTemplate().findByCriteria(criteria); }   //查询所有对象 public List<T> findAll(){ return getHibernateTemplate().loadAll(entityClass); }   //保存对象 public void save(T entity){ getHibernateTemplate().save(entity); }   //删除对象 public void removeByEntity(T entity){ getHibernateTemplate().delete(entity); }
      //根据id删除对象
    public void removeById(final Serializable id){ T obj=findById(id); getHibernateTemplate().delete(obj); }   //更新对象
      //更新操作通常是先查询数据库对象,然后修改此对象,最后再更新。
      //需要注意的是如果查询和修改在一个session中(或同一事务),不用使用update()。
      //因为session缓存和快照的存在,会自动进行修改,如果使用update(),反而会报缓存中已存在此对象的异常
    public void update(T entity){ getHibernateTemplate().update(entity); }   //获取HibernateTemplate public HibernateTemplate getHibernateTemplate(){ return hibernateTemplate; }
      //获取当前线程的session
    public Session getSession(){ return hibernateTemplate.getSessionFactory().getCurrentSession(); }   //分页查询 public Pager pagedQuery(String hql,int pageNo,int pageSize,Object... values){ Assert.hasText(hql); Assert.isTrue(pageNo >= 1, "pageNo should start from 1"); // Count查询 String countQueryString = " select count (*) " + removeSelect(removeOrders(hql)); List countlist = getHibernateTemplate().find(countQueryString, values); long totalCount = (Long) countlist.get(0); if (totalCount < 1) return new Pager(); // 实际查询返回分页对象 int startIndex = Pager.getStartOfPage(pageNo, pageSize); Query query = createQuery(hql, values); List list = query.setFirstResult(startIndex).setMaxResults(pageSize).list(); return new Pager(startIndex, pageSize, totalCount,list); } /** * 创建Query对象. 对于需要first,max,fetchsize,cache,cacheRegion等诸多设置的函数,可以在返回Query后自行设置. * 留意可以连续设置,如下: * <pre> * dao.getQuery(hql).setMaxResult(100).setCacheable(true).list(); * </pre> * 调用方式如下: * <pre> * dao.createQuery(hql) * dao.createQuery(hql,arg0); * dao.createQuery(hql,arg0,arg1); * dao.createQuery(hql,new Object[arg0,arg1,arg2]) * </pre> * * @param values 可变参数. */ public Query createQuery(String hql, Object... values) { Assert.hasText(hql); Query query = getSession().createQuery(hql); for (int i = 0; i < values.length; i++) { query.setParameter(i, values[i]); } return query; } /** * 去除hql的select 子句,未考虑union的情况,用于pagedQuery. * * @see #pagedQuery(String,int,int,Object[]) */ private static String removeSelect(String hql) { Assert.hasText(hql); int beginPos = hql.toLowerCase().indexOf("from"); Assert.isTrue(beginPos != -1, " hql : " + hql + " must has a keyword 'from'"); return hql.substring(beginPos); } /** * 去除hql的orderby 子句,用于pagedQuery. * * @see #pagedQuery(String,int,int,Object[]) */ private static String removeOrders(String hql) { Assert.hasText(hql); Pattern p = Pattern.compile("order\s*by[\w|\W|\s|\S]*", Pattern.CASE_INSENSITIVE); Matcher m = p.matcher(hql); StringBuffer sb = new StringBuffer(); while (m.find()) { m.appendReplacement(sb, ""); } m.appendTail(sb); return sb.toString(); } }

     分页pager.java

    package com.cky.dao;
    
    import lombok.Data;
    
    import java.util.ArrayList;
    import java.util.List;
    
    @Data
    public class Pager<T> {
        private static int DEFAULT_PAGE_SIZED=20;
    
        private int start;  //开始位置
        private int pageSize=DEFAULT_PAGE_SIZED;//一页显示的个数
        private long totalCount;//总记录数
    
        private List<T> data;//当前页存放的记录
    
        public Pager(){
            this(0,0,DEFAULT_PAGE_SIZED,new ArrayList<T>());
        }
    
        public Pager(int start, int pageSize, long totalCount, List<T> data) {
            this.start = start;
            this.pageSize = pageSize;
            this.totalCount = totalCount;
            this.data = data;
        }
    
        /**
         * 取总页数
         */
        public long getTotalPageCount(){
            if(totalCount%pageSize==0)
                return totalCount/pageSize;
            else
                return totalCount/pageSize+1;
        }
    
        /**
         *获取当前页
         */
        public long getCurrentPageNo(){
            return start/pageSize+1;
        }
    
        /**
         *是否有下一页
         */
        public boolean isHasNextPage(){
            return this.getCurrentPageNo()<this.getTotalPageCount();
        }
    
        /**
         *是否有上一页
         */
        public boolean isHasPreviousPage(){
            return this.getCurrentPageNo()>1;
        }
    
        /**
         *
         * @param pageNo    页数
         * @param pageSize  一页显示记录数
         * @return           该页第一条数据位置
         */
        public   static int getStartOfPage(int pageNo,int pageSize){
            return (pageNo-1)*pageSize;
        }
    
        /**
         * 任意一页第一条数据在数据集的位置
         */
        protected  static int getStartOfPage(int pageNo){
            return getStartOfPage(pageNo,DEFAULT_PAGE_SIZED);
        }
    
        public int getStart() {
            return start;
        }
    
        public void setStart(int start) {
            this.start = start;
        }
    
        public int getPageSize() {
            return pageSize;
        }
    
        public void setPageSize(int pageSize) {
            this.pageSize = pageSize;
        }
    
        public long getTotalCount() {
            return totalCount;
        }
    
        public void setTotalCount(long totalCount) {
            this.totalCount = totalCount;
        }
    
        public List<T> getData() {
            return data;
        }
    
        public void setData(List<T> data) {
            this.data = data;
        }
    }
  • 相关阅读:
    LeetCode-Read N Characters Given Read4 II
    LeetCode-One Edit Distance
    LeetCode-Palindrome Permutation II
    LeetCode- Longest Absolute File Path
    LeetCode-Strobogrammatic Number II
    LeetCode-Strobogrammatic Number
    LeetCode-Flatten 2D Vector
    LeetCode-Shortest Word Distance III
    LeetCode-Shortest Word Distance II
    Cookie/Session
  • 原文地址:https://www.cnblogs.com/chenkeyu/p/7989054.html
Copyright © 2020-2023  润新知