美文网首页
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层封装-分页

    1. 说明 上接[hibernate的dao层封装-基础功能] 2.设计思路 查询操作基本都要经过三步1.调用者发...

  • hibernate的DAO层封装-扩展功能

    1.说明 以[hibernate的dao层封装-基础功能]所说明的方法为基础 某些需求不太确定,根据实际需要进行调...

  • hibernate的DAO层封装-基础功能

    1.需求/目的 提供对数据库操作的常用方法 隐藏实现细节,使之专注于业务的开发 2.使用环境 spring boo...

  • 什么是SSH框架(spring+) 一.Hibernate(控制dao层):全自动化,对jdbc的封装,是一个标准...

  • Node Dao层的封装与分页

    传统的写法 这样的话,我们可以看出用户在每次操作的时候,就要连接依次数据库,这样的话效率很低,所以我们把数据库的增...

  • AOP + PageHelper 无侵入完成分页

    梗概 @EnablePaging注解开启分页,获取分页条件,返回分页对象 @ExecutePaging在DAO层执...

  • spring 笔记1

    ssh struts:web层,ValueStack值栈,拦截器 hibernate mydatis: dao层 ...

  • 工程结构

    三大层: DAO层: DAO层:DAO层主要是做数据持久层的工作,负责与数据库进行联络的一些任务都封装在此,DAO...

  • Hibernate学习(环境搭建)

    JavaEE三层结构 web层Struts2框架 service层Spring框架 dao层hibernate M...

  • Hibernate框架

    Hibernate:基于持久层的框架(数据访问层使用) Service业务逻辑层 Dao 数据访问层 ORM(Ob...

网友评论

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

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