分页小结

数据库 waitig 502℃ 百度已收录 0评论

分页的简介

分页技术有哪些?

a)存储过程分页 

   在数据库中创建一个存储过程,传入SQL和页码获得当前页的记录。性能最好,不跨数据库平台。 

b)数据库专有sql特性分页 

   使用数据库专有的特性(MSSQL的top、Oracle的rownum、MySQL的limit等),不跨数据库平台。 

c)纯JDBC分页 

   通过Statement的setMaxRow(endIndex)和rs.absoulte(beginIndex)仅取得当前页范围内的记录。通用性是最好的,数据库平台无关。 

d)根据数据库类型自动生成数据库专有特性的sql语句   ,使用框架hibernate

分页的实现

为了分页方便,一般将用到的属性封装成一个javabean

/**

 * 用于封装分页用到的属性

 */

public
class
PageBean<T> {

 

    // 总记录数

    private
int
rowTotal;

    // 每页记录数,默认是3

    private
int
pageSize = 3;

    // 当前页码

    private
int
count;

    // 总页数

    private
int
total;

    //数据

    private List<T>
list;

   

    //起始记录行数

    private
int
beginIndex;

    //结束记录行数

    private
int
endIndex;

   

   

    public
int
getBeginIndex() {

       return
beginIndex;

    }

    public
void
setBeginIndex(int
beginIndex) {

       this.beginIndex =
beginIndex;

    }

    public
int
getEndIndex() {

       return
endIndex;

    }

    public
void
setEndIndex(int
endIndex) {

       this.endIndex =
endIndex;

    }

    public
int
getRowTotal() {

       return
rowTotal;

    }

    public
void
setRowTotal(int
rowTotal) {

       this.rowTotal =
rowTotal;

    }

    public
int
getPageSize() {

       return
pageSize;

    }

    public
void
setPageSize(int
pageSize) {

       this.pageSize =
pageSize;

    }

    public
int
getCount() {

       return
count;

    }

    public
void
setCount(int
count) {

       this.count =
count;

    }

    public
int
getTotal() {

       return
total;

    }

    public
void
setTotal(int
total) {

       this.total =
total;

    }

    public List<T> getList() {

       return
list;

    }

    public
void
setList(List<T> list) {

       this.list =
list;

    }

 

}

Jdbc的实现

主要的工作就是设计sql语句

private
static
List<Student> getPageList(PageBeanpageBean){

       Connection conn=null;

       PreparedStatement stat=null;

       ResultSet set=
null
;

       List<Student> list =
new
ArrayList<Student>();

       try {

       conn = BaseDao.getConnection();

       String sql="select * from "

              + "(select rownum r,s.* from"

              + "(select * from student orderby name) s "

              + "where rownum<=? ) ss"

              + "where ss.r>?";

 

       stat =
conn
.prepareStatement(sql);

       stat.setInt(1,
pageBean
.getEndIndex());

       stat.setInt(2,
pageBean
.getBeginIndex());

       set =
stat
.executeQuery();

       while(set.next()){

           Student
student
= new Student();

           student.setName(set.getString("name"));

           student.setScore(set.getDouble("score"));

           list.add(student);

       }

       } catch (SQLException
e) {

          

           e.printStackTrace();

       }

      

       return
list;

    }

如果添加上业务层的话,就可以计算开始和结束的记录下标了,就可以真正的完成视图化的分页了

 

框架实现

Hibernate实现:同样的需要一个pageBean进行传值,不过分页的方法在hibernate框架中已经封装好了

 

逻辑分析:在页面传两个值(当前页数)过来就可以了,封装pageBean的工作交给了业务层,通过传过来的当前页页码就可以将pageBean封装完整;计算出开始记录的行数和每次限制显示的记录数,将其传递给dao层,通过封装好的方法直接进行分页数据的查询

PageBean的作用就在于可以在页面和后台数据之间进行传递数据,在页面上可以根据pageBean中的属性进行完美的分页

 

    业务层:

    public PageBean<Product>findByCid(Integer
page) {

 

       // 每页显示的记录数

       int
limit
= 12;

       // 总页数

       int
totalPage
= 0;

 

       PageBean<Product>
pageBean
= new PageBean<Product>();

       pageBean.setLimit(limit);

       pageBean.setPage(page);

       // 获取总记录数

       Integer totalCount =
categorysDao
.findByCid();

       pageBean.setTotalCount(totalCount);

       // 总页数

       if (totalCount %
limit == 0) {

           totalPage =
totalCount
/ limit;

       } else {

           totalPage =
totalCount
/ limit + 1;

       }

       pageBean.setTotalPage(totalPage);

      

       //计算开始的行数

       int
begin
= (page-1)*limit;

       //查询数据

       List<Product> list=
categorysDao
.findByPage(begin,limit);

       pageBean.setList(list);

       return
pageBean;

    }

Dao层:实现在数据库中按照条件查询出数据,根据起始下标和每页包含数据的条数

 

public
List<Product>
findByPage(int
begin, int
limit) {

       String hql =
"select p from Product p joinp.categorysecond cs join cs.categorys c"
;

       List<Product> list =
this
.getHibernateTemplate().executeFind(newPageHibernateCallback<Product>(hql,
new Object[]{cid},
begin, limit))
;

       returnlist;

    }

在这里又需要一个工具类PageHibernateCallback:

publicclass PageHibernateCallback<T> implementsHibernateCallback<List<T>> {

 

       private String hql;// hql语句

       private Object[] params;// 参数

       private int startIndex;// 开始的位置

       private int pageSize;// 显示商品的数目

 

       public String getHql() {

              return hql;

       }

 

       public void setHql(String hql) {

              this.hql = hql;

       }

 

       public Object[] getParams() {

              return params;

       }

 

       public void setParams(Object[] params) {

              this.params = params;

       }

 

       public int getStartIndex() {

              return startIndex;

       }

 

       public void setStartIndex(int startIndex){

              this.startIndex = startIndex;

       }

 

       public int getPageSize() {

              return pageSize;

       }

 

       public void setPageSize(int pageSize) {

              this.pageSize = pageSize;

       }

 

      

      

       public PageHibernateCallback() {

              super();

              // TODO Auto-generated constructorstub

       }

 

       public PageHibernateCallback(String hql,Object[] params, int startIndex,

                     int pageSize) {

              super();

              this.hql = hql;

              this.params = params;

              this.startIndex = startIndex;

              this.pageSize = pageSize;

       }

 

       @Override

       public List<T>doInHibernate(Session session) throws HibernateException,

                     SQLException {

              Query query = session.createQuery(hql);

              // 处理参数

              if (params != null) {

                     for (int i = 0; i <params.length; i++) {

                            query.setParameter(i,params[i]);

                     }

              }

 

              // 分页

              query.setFirstResult(startIndex);

              query.setMaxResults(pageSize);

              return query.list();

       }

 

 分页小结至此结束。


本文由【waitig】发表在等英博客
本文固定链接:分页小结
欢迎关注本站官方公众号,每日都有干货分享!
等英博客官方公众号
点赞 (0)分享 (0)