天天看點

通用分頁(一)

通用分頁

分頁三要素

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);來調節自己想要查詢的頁數
           

輸出結果為

通用分頁(一)