美文网首页
hibernate的DAO层封装-分页

hibernate的DAO层封装-分页

作者: 东本三月 | 来源:发表于2019-04-09 15:04 被阅读0次

    1. 说明

    • 上接[hibernate的dao层封装-基础功能]

    2.设计思路

    • 查询操作基本都要经过三步
      1.调用者发起请求
      2.sql查出指定的数据
      3.将数据封装,响应给调用者
    • 针对分页查询去考虑这三步,
      1.调用者需要指定那页数据,每页有几条数据
      2.sql要根据页码和指定条数设置要执行的sql语句
      3.进行数据封装时,还需要包含当前数据是那页的数据,这页数据有几条,总共有多少条数据,总共有多少页

    3.设计实体类

    • 首先是分页请求
    /**
     * 发起查询请求时,进行分页需要的基本参数
     * 2019年4月5日11:36:41
     * authstr
     */
    public class QueryCommonPage implements QueryPage {
        //要查那页数据
        private Integer page;
        //每页有几条数据
        private Integer rows;
        //搜索值
        private String search;
    
        public Integer getRows() {
            return rows;
        }
        public void setRows(Integer rows) {
            this.rows = rows;
        }
        public Integer getPage() {
            return page;
        }
        public void setPage(Integer page) {
            this.page = page;
        }
        public String getSearch() {
            return search;
        }
        public void setSearch(String search) {
            this.search = search;
        }
    }
    
    • 分页数据的封装
    /**
     * 记录查询出的一页数据
     * @time 2018年10月15日 上午9:57:50
     * @author authstr
     */
    public class AbstractReturnPage implements ReturnPage {
        //数据总数
        private Integer total;
        //总页数
        private Integer pageTotal;
        //每页条数
        private Integer rows;
        //查询的页
        private Integer page;
        //该页数据
        private List record;
    
        public AbstractReturnPage(){}
    
        /**
         * 通过查询参数对象创建返回页
         * @param queryPage
         */
        public AbstractReturnPage(QueryPage queryPage){
            if (queryPage.getRows()!=null){
                rows=queryPage.getRows();
            }else{
                rows=DEFAULT_PAGE_ROWS;
            }
            if(queryPage.getPage()!=null){
                page=queryPage.getPage();
            }else{
                page=DEFAULT_PAGE_NUM;
            }
        }
    
        @Override
        public Integer getTotal() {
            return total;
        }
        @Override
        public Integer getFirst() {
            return (getPage() - 1) * getRows();
        }
        @Override
        public Integer getRows() {
            if (rows == null) {
                rows = DEFAULT_PAGE_ROWS;
            }
            return rows;
        }
        @Override
        public void setTotal(Integer total) {
            this.total = total;
        }
        @Override
        public String toJson() {
            return JSON.toJSONString((Object)this);
        }
        
        public void setPageTotal(Integer pageTotal) {
             this.pageTotal = pageTotal;
        }
        @Override
        public Integer getPageTotal() {
            pageTotal = getTotal() % rows == 0 ? Integer.valueOf(getTotal() / rows) : Integer.valueOf(getTotal() / rows + 1);
            return pageTotal;
        }
        @Override
        public void setPage(Integer pageNo) {
            page = pageNo;
        }
        @Override
        public Integer getPage() {
            if (page == null || page < 1) {
                page = 1;
            }
            return page;
        }
        @Override
        public void setRows(Integer length) {
            rows = length;
        }
        
        @Override
        public List getRecord() {
            return this.record;
        }
        @Override
        public void setRecord(List record) {
            this.record = record;
        }
        
    }
    
    • 为方便其他类进行调用和维护,这两个类都有对应实现的接口
    /**
     * 发起查询请求时,定义进行分页需要的相关参数
     * 2019年4月5日11:36:41
     * authstr
     */
    public interface QueryPage {
         Integer getRows();
         void setRows(Integer rows);
         Integer getPage();
         void setPage(Integer page);
    }
    
    /**
     * 定义查询出的一页数据应包含的内容
     * 2019年4月5日11:41:09
     * authstr
     */
    public interface ReturnPage {
        //默认的每页数据行数
        Integer DEFAULT_PAGE_ROWS = 20;
        //默认的页码数
        Integer DEFAULT_PAGE_NUM = 1;
    
        Integer getTotal();
    
        List getRecord();
    
        void setTotal(Integer var1);
    
        void setRecord(List var1);
    
        Integer getPageTotal();
    
        void setRows(Integer var1);
    
        Integer getRows();
    
        void setPage(Integer var1);
    
        Integer getPage();
    
        Integer getFirst();
    
        String toJson();
    }
    

    4.查询数据总条数

    • 在执行分页时,需要额外的查询出数据的总条数
        /**
         * 取出第一个map中的num值,用于获取分页信息
         * @param li sql查询的返回值
         * @return num的值
         * @time 2019年4月5日18:16:52
         * @author authst
         */
        public Integer getTotalNumValue(List<Map> li){
            if(li == null || li.isEmpty()){
                return 0;
            }
            //获取返回值
            Object Onum=li.get(0).get("num");
            //转换为Integer
            if(Onum instanceof BigInteger){
                BigInteger temp=(BigInteger) Onum;
                return temp.intValue();
            }else{
                return (Integer)Onum;
            }
        }
    
    
        /**
         * 获得查询结果的总条数
         * @param sqlstring 进行查询的sql语句
         * @param fields 参数项数组
         * @param values 参数值数组
         * @return 数据条数
         * @time 2019年4月5日18:17:11
         * @author authst
         */
        public Integer getTotalCount(String sqlstring, String[] fields,Object[] values) {
            String sql = " select count(1) AS num from ( " + sqlstring + " ) a";
            List<Map> li = getBySQL(sql,fields,values,Map.class);
            return getTotalNumValue(li);
        }
    
        /** 获得查询结果的总条数
         * @param sqlstring 进行查询的sql语句
         * @param kv 参数map
         * @return 数据条数
         * @time 2019年4月5日18:17:11
         * @author authst
         */
        public Integer getTotalCount(String sqlstring, Map<String, Object> kv) {
            String sql = " select count(1) AS num from ( " + sqlstring + " ) a";
            List<Map> li = getByMapSQL(sql,kv,Map.class);
            return getTotalNumValue(li);
        }
    
        /**
         *  获得查询结果的总条数
         * @param sqlstring  进行查询的sql语句
         * @param values 参数值
         * @return 数据条数
         * @time 2019年4月5日18:17:11
         * @author authst
         */
        public Integer getTotalCount(String sqlstring, Object[] values) {
            return getTotalCount(sqlstring,null,values);
        }
    

    5.分页的sql执行

    • 同样的,分页调用也有Map和单数组两种参数传递方式
         /**
         * 使用 属性+值 的参数方式,执行查询语句,获取一页数据(执行方法)
         * @param sqlstring  查询sql语句
         * @param paramAndValue sql参数,键为属性项数组,值为 属性值数组
         * @param page  分页对象
         * @param returnType 返回值类型
         * @return 分页数据
         * @time 2019年4月5日16:55:04
         * @author authstr
         */
        public ReturnPage queryByParamAndValue(String sqlstring,Map<String,Object> paramAndValue, ReturnPage page, Class returnType){
            page.setRecord(getByMapSQL(sqlstring,paramAndValue,page.getFirst(),page.getRows(),returnType));
            page.setTotal(getTotalCount(sqlstring,paramAndValue));
            return page;
        }
    
        /**
         * 使用 参数值 的参数方式,执行查询语句,获取一页数据(执行方法)
         * @param sqlstring  查询sql语句
         * @param values sql参数 属性值
         * @param page 分页对象
         * @param returnType 返回值类型
         * @return 分页数据
         * @time 2019年4月5日17:01:15
         * @author authstr
         */
        public ReturnPage queryByValue(String sqlstring,Object[] values, ReturnPage page, Class returnType){
            page.setRecord(getByValuesSql(sqlstring,values,page.getFirst(),page.getRows(),returnType));
            page.setTotal(getTotalCount(sqlstring,values));
            return page;
        }
    

    6.分页查询dao层流程

    • 首先,在执行时会根据参数方式,选择一个方法调用,执行时需提供一个QueryPage对象
    /**
         * 使用 属性+值 的参数方式,执行查询语句,获取一页数据(Map)(参数跳转)
         * @param sqlstring 查询sql语句
         * @param paramAndValue sql参数,键为属性项数组,值为 属性值数组
         * @param page 分页查询参数对象
         * @return 分页数据
         * @time 2019年4月5日17:05:05
         * @author author
         */
        public ReturnPage queryByParamAndValue(String sqlstring, Map<String, Object> paramAndValue, QueryPage page){
            return queryByParamAndValue(sqlstring,paramAndValue,page,Map.class);
        }
    
        /**
         * 使用 参数值 的参数方式,执行查询语句,获取一页数据(参数跳转)
         * @param sqlstring  查询sql语句
         * @param values sql参数 属性值
         * @param page 分页对象
         * @return 分页数据
         * @time 2019年4月5日17:13:46
         * @author authstr
         */
        public ReturnPage queryByValue(String sqlstring,Object[] values, QueryPage page ){
            return queryByValue(sqlstring,values,page,Map.class);
        }
    
    • 接着,通过QueryPage对象创建出一个ReturnPage对象,之后的分页数据就将封装到ReturnPage对象中进行返回
    /**
         * 使用 属性+值 的参数方式,执行查询语句,获取一页数据(参数跳转)
         * @param sqlstring 查询sql语句
         * @param paramAndValue sql参数,键为属性项数组,值为 属性值数组
         * @param page 分页查询参数对象
         * @param returnType 返回值类型
         * @return 分页数据
         * @time 2019年4月5日17:01:29
         * @author author
         */
        public ReturnPage queryByParamAndValue(String sqlstring, Map<String, Object> paramAndValue, QueryPage page, Class returnType){
            return queryByParamAndValue(sqlstring, paramAndValue,new AbstractReturnPage(page), returnType);
        }
    
        /**
         * 使用 参数值 的参数方式,执行查询语句,获取一页数据(参数跳转)
         * @param sqlstring  查询sql语句
         * @param values sql参数 属性值
         * @param page 分页对象
         * @param returnType 返回值类型
         * @return 分页数据
         * @time 2019年4月5日17:13:37
         * @author authstr
         */
        public ReturnPage queryByValue(String sqlstring,Object[] values, QueryPage page, Class returnType){
            return queryByValue(sqlstring,values,new AbstractReturnPage(page),returnType);
        }
    
    • 最后便是调用查询sql的执行

    7.方法整理

    方法整理
    • 另外两个方法
        /**
         * 使用 属性+值 的参数方式,执行查询语句,获取返回值(参数跳转)
         * @param sql 查询sql语句
         * @param kv sql参数,键为属性项数组,值为 属性值数组
         * @param returnType 结果集封装的类型
         * @param <T> 结果集类型
         * @return 查询结果
         * @time 2019年4月5日11:27:12
         * @author authstr
         */
        public  <T> List<T> getByMapSQL(String sql,Map<String,Object> kv,Class<T> returnType){
            return getByMapSQL(sql,kv,null,null,returnType);
        }
    
         /**
         * 使用 参数值 的参数方式,执行查询语句,获取返回值(参数跳转)
         * @param sql 查询sql语句
         * @param values
         * @param returnType 结果集封装的类型
         * @param <T> 结果集类型
         * @return 查询结果
         * @time 2019年4月5日16:53:36
         * @author authstr
         */
        public  <T> List<T> getByValuesSql(String sql,Object[] values,Class<T> returnType){
            return getByValuesSql(sql,values,null,null,returnType);
        }
    

    相关文章

      网友评论

          本文标题:hibernate的DAO层封装-分页

          本文链接:https://www.haomeiwen.com/subject/eoqbiqtx.html