天天看点

通用分页(一)

通用分页

分页三要素

page        页码        视图层传递过来
  rows        页大小      视图层传递过来
  total       总记录数    后台查出来
           

分页思路:

1、将原有的查询向上抽取
2、让返回值变成泛型
3、使用回调函数处理resultset
4、利用反射处理回调函数
5、获取总记录数(页面展示,计算总页数)
6、拼接分页sql语句,获取对应的结果集
           

例:完成一个普通的查询方法(根据数据库中的数据查询)

1.封装一个分页的工具类PageBean来控制分页的页码 页大小 总记录数 是否分页 (可更改)

package 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.创建一个实体类Book

package com.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() {
	}

	
}

           

3.在book的dao层中实现一个普通的查询方法

package com.tanzhixian.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.entity.Book;

import util.DBAccess;
import util.PageBean;
import util.StringUtils;
/*
 * book 封装这jsp传递过来的查询参数
 * pagebean 决定dao层的list调用时是否分页
 */
public class BookDao {
	public List<Book> list(Book book,PageBean pageBean) throws SQLException{
		String sql="select * from t_mvc_book where true";
		String bname=book.getBname();
//		调用StringUtils类中的方法
		if(StringUtils.isNotBlank(bname)) {
//			拼接(String sql="select * from t_mvc_book where true";)
			sql+="and bname like '%"+bname+"%'";
		}
		Connection con = DBAccess.getConnection();
		PreparedStatement pst = con.prepareStatement(sql);
		ResultSet rs = pst.executeQuery();
		List<Book> list=new ArrayList<>();
		while(rs.next()) {
			list.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price")));
		}
		DBAccess.close(con, pst, rs);
		return list;
	
	}
}


           

测试

//	为了方便测试,main方法可直接写在BookDao类下
	public static void main(String[] args) {
		BookDao bookdao=new BookDao();
		Book book=new Book();
		try {
			List<Book> list = bookdao.list(book, null);
			for (Book b : list) {
				System.out.println(b);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

           

测试结果为:

通用分页(一)
public static void main(String[] args) {
		BookDao bookdao=new BookDao();
		Book book=new Book();
//      可以添加模糊查
		book.setBname("圣墟");
		try {
			List<Book> list = bookdao.list(book, null);
			for (Book b : list) {
				System.out.println(b);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

           

输出结果为:

通用分页(一)

例:使用通用查询(实体类,数据库与上一致)

1.写一个通用的BaseDao

注:"T"为通用的重要组成部分

package 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.entity.Book;

/*
 * <T>代表你要对哪个实体类对应表进行分页查询 (通用)
 */
public class BaseDao<T> {
	/*
	 * sql 查询不同的实体类对用的sql语句不同所以需要传递
	 * clz 生产出不同的实体类对应的实例,然后装进list容器中返回
	 * pagebean 决定是否分页
	 */
	public List<T> executeQuery(String sql,Class clz,PageBean pageBean) throws SQLException, Exception, IllegalAccessException{
		Connection con = DBAccess.getConnection();
		PreparedStatement pst = con.prepareStatement(sql);
		ResultSet rs = pst.executeQuery();
		List<T> list=new ArrayList<>();
//		减小内存使用放while外
		T t;
		while(rs.next()) {
			/*
			 * 代码list.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price")));作用
			 * 1.实例化一个book对象(该对象是空的)
			 * 2.取book的所有属性,然后给其赋值
			 *  2.1 获取所有属性对象
			 *  2.2 给属性对象赋值
			 * 3.赋完值的book对象装进List容器中
			 */
//			list.add(new Book(rs.getInt("bid"), rs.getString("bname"), rs.getFloat("price")));
			
			t = (T) clz.newInstance();
			Field[] fields = clz.getDeclaredFields();
			for (Field field : fields) {
				field.setAccessible(true);
				field.set(t, rs.getObject(field.getName()));
			}
			list.add(t);
			
		}
		DBAccess.close(con, pst, rs);
		return list;
	
	}

}

           

2.将BookDao继承于BaseDao然后将T改成实体类Book

package com.tanzhixian.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.entity.Book;

import util.BaseDao;
import util.DBAccess;
import util.PageBean;
import util.StringUtils;
/*
 * book 封装这jsp传递过来的查询参数
 * pagebean 决定dao层的list调用时是否分页
 */
public class BookDao extends BaseDao<Book>{
	public List<Book> list(Book book,PageBean pageBean) throws Exception, Exception{
		String sql="select * from t_mvc_book where true";
		String bname=book.getBname();
//		调用StringUtils类中的方法
		if(StringUtils.isNotBlank(bname)) {
//			拼接(String sql="select * from t_mvc_book where true";)
			sql += " and bname like '%"+bname+"%'";
		}
		
		return super.executeQuery(sql, Book.class, pageBean);
	
	}
}


           

运行代码:

//	为了方便测试,main方法可直接写在BookDao类下
	public static void main(String[] args) throws Exception {
		BookDao bookdao=new BookDao();
		Book book=new Book();
		book.setBname("圣墟");
		try {
			List<Book> list = bookdao.list(book, null);
			for (Book b : list) {
				System.out.println(b);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

           

输出结果为:

通用分页(一)

例:进行通用的分页查询(实体类,数据库与上一致)

1.封装一个分页的工具类PageBean来控制分页的页码 页大小 总记录数 是否分页 (可更改)

package 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中写分页方法

package 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.entity.Book;

/*
 * <T>代表你要对哪个实体类对应表进行分页查询 (通用)
 */
public class BaseDao<T> {
	/*
	 * sql 查询不同的实体类对用的sql语句不同所以需要传递
	 * clz 生产出不同的实体类对应的实例,然后装进list容器中返回
	 * pagebean 决定是否分页
	 */
	public List<T> executeQuery(String sql,Class clz,PageBean pageBean) throws SQLException, Exception, IllegalAccessException{
		Connection con = DBAccess.getConnection();
		PreparedStatement pst=null;
		ResultSet rs=null;
		
		if(pageBean!=null && pageBean.isPagination() ) {
//			需要分页
//			1.算总记录数
			String countSql=getCountSql(sql);
			pst = con.prepareStatement(countSql);
			rs = pst.executeQuery();
			if(rs.next()) {
				pageBean.setTotal(rs.getLong(1)+"");
			}
			
//			2.查询出当前页的结果集
			String pageSql=getPageSql(sql,pageBean);
			pst = con.prepareStatement(pageSql);
			rs = pst.executeQuery();
			
			
		}else {
//			不分页
			pst = con.prepareStatement(sql);
			rs = pst.executeQuery();
		}
		
		List<T> list=new ArrayList<>();
//		减小内存使用放while外
		T t;
		while(rs.next()) {
			t = (T) clz.newInstance();
			Field[] fields = clz.getDeclaredFields();
			for (Field field : fields) {
				field.setAccessible(true);
				field.set(t, rs.getObject(field.getName()));
			}
			list.add(t);
			
		}
		DBAccess.close(con, pst, rs);
		return list;
	
	}
	
	/*
	 * 利用原生sql拼接出符合条件的结果集查询sql
	 */
	
private String getPageSql(String sql, PageBean pageBean) {
	return sql+"limit "+pageBean.getStartIndex()+","+pageBean.getRows();
	}

	/*
 * 获取符合条件的总记录数的sql语句
 */
	private String getCountSql(String sql) {
		// TODO Auto-generated method stub
		return "select count(1) from ("+sql+") t";
	}

}

           

测试:

package com.tanzhixian.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.entity.Book;

import util.BaseDao;
import util.DBAccess;
import util.PageBean;
import util.StringUtils;
/*
 * book 封装这jsp传递过来的查询参数
 * pagebean 决定dao层的list调用时是否分页
 */
public class BookDao extends BaseDao<Book>{
	public List<Book> list(Book book,PageBean pageBean) throws Exception, Exception{
		String sql="select * from t_mvc_book where true";
		String bname=book.getBname();
//		调用StringUtils类中的方法
		if(StringUtils.isNotBlank(bname)) {
//			拼接(String sql="select * from t_mvc_book where true";)
			sql += " and bname like '%"+bname+"%'";
		}
		
		return super.executeQuery(sql, Book.class, pageBean);
	
	}
//	为了方便测试,main方法可直接写在BookDao类下
	public static void main(String[] args) throws Exception {
		BookDao bookdao=new BookDao();
		Book book=new Book();
		book.setBname("圣墟");
		PageBean pageBean=new PageBean();
//		pageBean.setPage(2);
		try {
			List<Book> list = bookdao.list(book, pageBean);
			for (Book b : list) {
				System.out.println(b);
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}


           

注:

PageBean pageBean=new PageBean();
//也可以通过pageBean.setPage(2);来调节自己想要查询的页数
           

输出结果为

通用分页(一)