通用分页(一)
1,为什么要使用通用的分页?
因为在实际项目的开发过程中我们的很多的数据展示不仅仅是只有一个页面的数据,数据量大,要展示的数据种类多,那么我们就需要写很多个分页的代码。我们就在想有没有一劳永逸的方法。。。。有的,下面我们就一起来了解了解通用的分页。
2,怎么去写通用的分页?
2.1,首先我们需要确定我们的需求是什么,分页。那么我们就先分析分析这个分页。。
在实际项目开发中分页需要哪些参数?
1.是否确定需要用到分页--------- pagination
2.页码 ------------------- page
3.这一页需要展示多少-----------rows
4.总共的数据-------------total
那么我们就需要写一个工具类来帮助我们跟好的实行
select * from stu where 1=1的作用:
这是为了方便在拼接字符时出现条件判断的时候无法判断下一个是否需要拼接where字符,所以统一用在这之前加一个where 1=1方便操作。
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.2.接下来我们就需要写一个通用的父类方法,来帮助我们实现通用的分类
package com.zking.util;
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;
/**
* T =
* @author huguiyun
*
* @param <T>
*/
public class BaseDao<T> {
/**
*
* @param sql 决定查询那张表的数据
* @param clz 查询出来的数据分装到那个实体类中
* @param pagebean 决定是否分页
* @return
* @throws IllegalAccessException
* @throws InstantiationException
* @throws SQLException
* @throws IllegalArgumentException
*/
public List<T> executeQuery(String sql,Class clz,PageBean pagebean) throws InstantiationException, IllegalAccessException, IllegalArgumentException, SQLException{
List<T> list = new ArrayList<>();
Connection con = DBAccess.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
try {
if (pagebean != null && pagebean.isPagination()) {//分页
String countSql = getCountSql(sql);//调用下面的方法 总共的数据
ps = con.prepareStatement(countSql);
rs = ps.executeQuery();
if(rs.next()) {
pagebean.setTotal(rs.getLong(1)+"");
}
String pageSql = getPageSql(sql,pagebean);//调用下面的方法 分页
ps = con.prepareStatement(pageSql);
rs = ps.executeQuery();
} else {//没有分页
ps = con.prepareStatement(sql);
rs = ps.executeQuery();
}
while (rs.next()) {
/**
* 1.创建了一个Book对象
* 2,从ResultSet结果集中获取值放入Book对象中
* 2.1 获取到Book的属性对象
* 2.2 给属性对象赋值
* 3.将已有值book对象放入list集合中
*/
T t = (T) clz.newInstance();//1
Field[] fields = clz.getDeclaredFields();//2.1
for (Field field : fields) {
field.setAccessible(true);
field.set(t, rs.getObject(field.getName()));//2.2
}
list.add(t);//3
}
} finally {
DBAccess.close(con, ps, rs);//关闭
}
return list;
}
/**
* 将原生SQL拼接出符合条件的某一页的数据查询sql
* @param sql
* @param pagebean
* @return
*/
private String getPageSql(String sql, PageBean pagebean) {
return sql+" limit "+pagebean.getStartIndex()+","+pagebean.getRows();
}
/**
* 用原来的SQL拼接出查询符合条件的记录数
* @param sql
* @return
*/
private String getCountSql(String sql) {
return "select count(1) from ("+sql+")t";
}
}
接下来我们就需要写我们的dao类了。dao类继承了BaseDao 父类。里面的代码比之前的少了很多。通用的都在父类里面
public class BookDao extends BaseDao<Book> {
public List<Book> list(Book book,PageBean pagebean) throws SQLException, InstantiationException, IllegalAccessException, IllegalArgumentException{
String sql = "select * from t_mvc_book where 1=1";
if(StringUtils.isNotBlank(book.getBname())) {//判断是否需要用到模糊查
sql += " and bname like '%"+book.getBname()+"%'";
}
return super.executeQuery(sql, Book.class, pagebean);
}
}
在这里需要说明一下StringUtils是一个类,isNotBlank(book.getBname())是它的方法。
下面我们就写一下main方法测试一下我们写的是否真实
public static void main(String[] args) {
BookDao bookdao = new BookDao();
try {
Book b = new Book();//实例化book
PageBean pa = new PageBean();
pa.setPage(2);//需要展示的页数
b.setBname("圣墟");//模糊查
List<Book> list = bookdao.list(b, pa);
for (Book book : list) {
System.out.println(book);//打印
}
} catch (Exception e) {
e.printStackTrace();
}
}
这个是查询的数据