通用分页

什么为通用分页
1.简单的就是自己封装的一个分页类
2.自己可以直接调用,更改里面的sql语句即可
3分页三个属性 page页码 rows 每页的数量值 total 总记录数 pagination 是否分页
封装一个分页实体类
分页类的必要属性
1.page首页码
2.rows 每页的数量值
3.total 总记录数
4.pagination 是否分页

package com.aixincheng.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 + "]";
   }
}

案例:需要一个数据类book
所查询的数据类

package com.aixincheng.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) {
		super();
		this.bid = bid;
		this.bname = bname;
		this.price = price;
	}

	public Book() {
		super();
	}
}

作用于泛型类调用了分页类
1.用到了泛型类方法
2.sql的拼接模糊查询分页

package com.aixincheng.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.aixincheng.entity.Book;
/**
 * 
 *  T  =Book.class 
 *  T =
 * @author 
 *
 * @param <T>
 */

public class BaseDao<T> {
	/**
	 * 
	 * @param sql 决定查询那张表的数据
	 * @param clz 查询出来的数据封装到那个实体类中
	 * @param pageBean	决定是否分页
	 * @return
	 * @throws Exception 
	 */
	
	public List<T> executeQuery(String sql,Class clz,PageBean pageBean) throws Exception{
		List<T> list =new ArrayList<>();
		Connection con = DBAccess.getConnection();
		PreparedStatement pst = null;
		ResultSet rs = null;
		try {
			if(pageBean !=null && pageBean.isPagination()) {//判断是否查询到数据并且是否分页
				//该分页了
				String countSql = getCountSql(sql);
				pst = con.prepareStatement(countSql);//调用了记录数s为1的sql语句
				rs = pst.executeQuery();
				if(rs.next()) {
					pageBean.setTotal(rs.getLong(1)+"");
				}
				String pageSql =getpageSql(sql,pageBean);//调用了分页的查询语句
				pst = con.prepareStatement(pageSql);
				rs = pst.executeQuery();
			}else {
				pst = con.prepareStatement(sql);
				rs = pst.executeQuery();
			}
				while (rs.next()) {
					/**
					 * 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()));
					}
					list.add(t);
				} 
			} finally {
			// TODO: handle finally clause
			DBAccess.close(con,pst,rs);
		}
		return list;
		
	}
	
	/**
	 * 将原生sql拼接出符合条件的某一页的数据查询sql
	 * @param sql
	 * @param pageBean
	 * @return
	 */
	 //分页的查询语句
	private String getpageSql(String sql, PageBean pageBean) {
		// TODO Auto-generated method stub
		return  sql  + " limit  "+pageBean.getStartIndex() + "," + pageBean.getRows();
	}
	/**
	 * 用原生sql拼接处查询符号条件的记录数
	 * @param sql
	 * @return
	 */
	// 符合条件的记录数方法
	private String getCountSql(String sql) {
		// TODO Auto-generated method stub
		return "select count(1) from ("+ sql +") t";
	}
}

通用的调用分页效果的dao方法
1.在这个dao方法中只需要修改你的sql语句和你所要根据什么列来模糊查询的数据就可以任意实现分页效果
2.继承baseDao

package com.aixincheng.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.page.entity.Book;
import com.page.util.BaseDao;
import com.page.util.DBAccess;
import com.page.util.PageBean;
import com.page.util.StringUtils;

public class BookDao extends BaseDao<Book> {	
	/**
	 * 
	 * @param book 是从jsp传递过来的参数封装成对象的作为参数查询并执行sql
	 * @param pageBean	决定是否分页
	 * @return
	 * @throws Exception 
	 */

	public List<Book> list(Book book,PageBean pageBean) throws Exception{
		List<Book> list =new ArrayList<>();
		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);
	}
	
	public static void main(String[] args) {
		BookDao bookDao =new BookDao();
		try {
			Book b =new Book();
			PageBean pageBean =new PageBean();
			//pageBean.setPagination(false);//禁止分页效果
			//pageBean.setPage(2);//可查看第2页的10条数据
			b.setBname("圣墟");//模糊查询为圣墟的值
			List<Book> list = bookDao.list(b, pageBean);
			for (Book book : list) {
				System.out.println(book);
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

运行效果为该数据库“圣墟”的前10组数据
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值