一、分页的作用
1、分页可以提高客户体验度,适当地选择合适的数据条数,让页面显得更有条理,使得用户体验感良好,避免过多数据的冗余。(冗余:多余的、重复的,或者啰嗦内容)
2、提高性能的需要。分页技术,有选择的加载某部分数据,在数据量较大的时候,分部分加载数据、显示数据,可以有效提高程序的性能,当然,单纯的js的分页技术并没有这种效果。
二、分页的三要素
page 页码 视图层传递过来
rows 页大小 视图层传递过来
total 总记录数 后台查出来
注:pagination 是否分页 视图层传递过来
三、分页的案例
1、我们先建立实体类Book和PageBean
Book
package com.zking.entity;
public class Book {
private int bid;
private String bname;
private float price;
@Override
public String toString() {
return "Book [bid=" + bid + ", bname=" + bname + ", price=" + price + "]";
}
public int getBid() {
return bid;
}
public void setBid(int bid) {
this.bid = bid;
}
public String getBname() {
return bname;
}
public void setBname(String bname) {
this.bname = bname;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public Book(int bid, String bname, float price) {
this.bid = bid;
this.bname = bname;
this.price = price;
}
public Book() {}
}
package com.zking.util;
/**
* 分页工具类
*
*/
public class PageBean {
private int page = 1;// 页码
private int rows = 10;// 页大小
private int total = 0;// 总记录数
private boolean pagination = true;// 是否分页
public PageBean() {
super();
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
public int getTotal() {
return total;
}
public void setTotal(int total) {
this.total = total;
}
public void setTotal(String total) {
this.total = Integer.parseInt(total);
}
public boolean isPagination() {
return pagination;
}
public void setPagination(boolean pagination) {
this.pagination = pagination;
}
/**
* 获得起始记录的下标
*
* @return
*/
public int getStartIndex() {
return (this.page - 1) * this.rows;
}
@Override
public String toString() {
return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", pagination=" + pagination + "]";
}
}
2、接下来建立一个通用的方法
BaseDao (注:DBAccess是跟Mysql数据库获得连接的一个类)
package com.zking.dao;
import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.zking.entity.Book;
import com.zking.util.DBAccess;
import com.zking.util.PageBean;
import com.zking.util.StringUtils;
/**
* T = Book.class
* T = Student.class
* @author Administrator
*
* @param <T>
*/
public class BaseDao<T> {
/**
*
* @param sql 决定查询那张表的数据
* @param clz 查询出来的数据封装到那个实体类中
* @param pb 决定是否分页
* @return
* @throws SQLException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public List<T> executeQuery(String sql,Class clz,PageBean pb) throws SQLException, InstantiationException, IllegalAccessException{
List<T> ls = new ArrayList<>();
Connection con = DBAccess.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
try {
if(pb!=null&&pb.isPagination()) {
//该分页了
String countSql = getCountSql(sql);
ps = con.prepareStatement(countSql);
rs = ps.executeQuery();
if(rs.next()) {
pb.setTotal(rs.getLong(1)+"");
}
String pageSql = getPageSql(sql,pb);
ps = con.prepareStatement(pageSql);
rs = ps.executeQuery();
}
else {
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
}
while(rs.next()) {
// ls.add(new Book(rs.getInt("bid"),
// rs.getString("bname"),
// rs.getFloat("price")));
/*
* 1、创建了一个Book对象
* 2、从ResultSet结果集中获取值放入Book对象属性中
* 2.1 获取到Book的属性对象
* 2.2 给属性对象赋值
* 3、将已经有值的book对象放入list中
*/
T t = (T) clz.newInstance();
Field[] fields = clz.getDeclaredFields();
for (Field field : fields) {
field.setAccessible(true);
field.set(t, rs.getObject(field.getName()));
}
ls.add(t);
}
} finally {
DBAccess.close(con, ps, rs);
}
return ls;
}
/**
* 用原生sql拼接查询符合条件的某一页的数据查询sql
* @param sql
* @param pb
* @return
*/
private String getPageSql(String sql,PageBean pb) {
return sql+" limit "+pb.getStartIndex()+","+pb.getRows();
}
/**
* 用原生sql拼接查询符合条件的记录
* @param sql
* @return
*/
private String getCountSql(String sql) {
return "select count(1) from ("+sql+") t";
}
}
3、接下来我们建立一个BookDao来调用BaseDao
BookDao (注:StringUtils是一个类,isNotBlank(String sql)是个方法,如果字符串不等于null或去空格后不等于"",则返回true,否则返回false)
package com.zking.dao;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.zking.entity.Book;
import com.zking.util.DBAccess;
import com.zking.util.PageBean;
import com.zking.util.StringUtils;
/**
* 操作数据库中t_mvc_book表
* 1、获得连接
* 2、加载驱动
* 3、获取预定义处理对象
* 4、执行sql语句
* 5、处理结果集
* 6、关闭连接
*
* @author Administrator
*
*/
public class BookDao extends BaseDao<Book>{
/**
*
* @param b 是从jsp传递过来的参数封装成对象的作为参数查询并执行sql
* @param pb 决定是否分页
* @return
* @throws SQLException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public List<Book> list(Book b,PageBean pb) throws SQLException, InstantiationException, IllegalAccessException{
List<Book> ls = new ArrayList<>();
String sql = "select * from t_mvc_book where 1 = 1";
if(StringUtils.isNotBlank(b.getBname())) {
sql += " and bname like '%"+b.getBname()+"%'";
}
return super.executeQuery(sql, Book.class, pb);
}
}
4、最后我们就可以测试结果了
public static void main(String[] args) {
BookDao bd = new BookDao();
Book b = new Book();
PageBean pb = new PageBean();
try {
b.setBname("圣墟");
List<Book> ls = bd.list(b,pb);
for (Book book : ls) {
System.out.println(book);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (InstantiationException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
输出
上面显示的数据是名称为“圣墟”的第一页的10条数据。
b.setBname(); 括号内放想查询的名称
pb.setPage() 括号内放页数;
pb.setPagination(); 括号内放true(可以分页)或false(不分页)