分页技巧_抽取出公共的分页用的Service方法

分页技巧_抽取出公共的分页用的Service方法

TopicAction.java

ForumAction.java

放在父类中DaoSupport.java

DaoSupportImpl.java

//@Transactional注解可以被继承,子类就不用写了
//@Transactional注解对父类中声明的方法无效
@Transactional
@SuppressWarnings("unchecked")
public abstract class DaoSupportImpl<T> implements DaoSupport<T> {

    @Resource
    private SessionFactory sessionFactory;// 通过注入得到SessionFactory,要把它放到容器里才能注入,在具体的实现类上声明@Repository

    private Class<T> clazz;
    
    public DaoSupportImpl() {
        //使用反射技术得到T的真实类型
        ParameterizedType pt = (ParameterizedType) this.getClass().getGenericSuperclass();//获取当前new类型的泛型的父类类型
        this.clazz = (Class<T>) pt.getActualTypeArguments()[0];//获取第一个类型参数的真实类型,只有一个泛型参数,所以写0
        System.out.println("clazz--->" + clazz);
    }

    /**
     * 获取当前可用的session对象,用protected修饰方便子类得到session
     */
    protected Session getSession() {
        return sessionFactory.getCurrentSession();
    }

    public void save(T entity) {
        // 不需要自己关事务了,spring框架已经帮我们做了,我们用它的事务管理
        getSession().save(entity);
    }

    public void update(T entity) {
        getSession().update(entity);
    }

    public void delete(Long id) {
        Object obj = getById(id);
        if (obj != null) {
            getSession().delete(obj);
        }
    }

    public T getById(Long id) {
        if(id == null) {
            return null;
        }else{
            return (T) getSession().get(clazz, id);
            
        }
    }

    public List<T> getByIds(Long[] ids) {
        if(ids == null || ids.length == 0) {
            //return new ArrayList<T>();//返回空的集合
            return Collections.EMPTY_LIST;
        }else {
            return getSession().createQuery(//
                "FROM " + clazz.getSimpleName() + " WHERE id IN (:ids)")//
                .setParameterList("ids", ids)
                .list();
        }
    }
    
    public List<T> findAll() {
        return getSession().createQuery(//
                "FROM " + clazz.getSimpleName())//
                .list();
    }
    //公共的查询分页信息的方法
    public PageBean getPageBean(int pageNum, int pageSize, String hql, List<Object> parameters) {
        System.out.println("------>DaoSupportImpl.getPageBean()");
        //查询本页的数据列表
        Query listQuery = getSession().createQuery(hql);//创建查询对象
        if(parameters != null) {//设置参数
            for(int i = 0; i < parameters.size(); i++) {
                listQuery.setParameter(i, parameters.get(i));
            }
        }
        listQuery.setFirstResult((pageNum - 1) * pageSize);
        listQuery.setMaxResults(pageSize);
        List list = listQuery.list();//执行查询
        
        //查询总记录数量
        Query countQuery = getSession().createQuery("SELECT COUNT(*)" + hql);
        if(parameters != null) {//设置参数
            for(int i = 0; i < parameters.size(); i++) {
                countQuery.setParameter(i, parameters.get(i));
            }
        }
        Long count = (Long)countQuery.uniqueResult();//执行查询
        return new PageBean(pageNum, pageSize, count.intValue(), list);
    }
}

原文地址:https://www.cnblogs.com/justdoitba/p/7965571.html