通用分页 1

标签: 分页

为什么要使用通用分页
首先呢,在以前如果很多地方都有用到分页,那样就要写很多重复的分页方法,所以就产生了通用分页,所有能够用到分页的地方都可以调用这个封装好的分页方法,以此减少代码冗余,提高开发效率

分页三要素 (要建的实体类)
page 页码 视图层传递过来
rows 页大小 视图层传递过来
total 总记录数 后台查出来
pagination 是否分页 视图层传递过来
(如果为true就查列表,进行分页,为false就以下 拉框的形式展示出来)

还有写DBAccess(jdbc)
还有个判空的实体类,因为经常要用到这个判空的方法,就封装成了一个类
在这里插入图片描述

还有个实体类就是数据库里的那张表

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();
	}

首先先写那个分页的dao方法,
要使用泛型,

public class BaseDao<T> {
	
	/**
	 * @param sql  决定查询那张表的数据
	 * @param clz  查询出来的数据封装到那个实体类中
	 * @param pagebean  决定是否分页
	 * @return
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 * @throws SQLException 
	 */
	public List<T> executeQuery(String sql,Class clz,PageBean pagebean) throws InstantiationException, IllegalAccessException, 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()) {
				/*	list.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()));
				}
				list.add(t);
			} 
		} 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 (select * from t_mvc_book where bname like '%"+sql+"%') t";
	}
	
}

接下来就要写这个数据库的那个实体类的dao方法,要继承自BaseDao

public class BookDao extends BaseDao<Book>{

	/**
	 * 
	 * @param book 是从jsp传递过来的参数封装成对象的作为参数查询并执行sql
	 * @param pagebean  决定是否分页
	 * @return
	 * @throws SQLException 
	 * @throws IllegalAccessException 
	 * @throws InstantiationException 
	 */ 
	public List<Book> list(Book book,PageBean pagebean) throws SQLException, InstantiationException, IllegalAccessException{
		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 bd=new BookDao();
		try {
			Book b=new Book();
			PageBean pagebean=new PageBean();
			//pagebean.setPagination(false);
			//b.setBname("圣墟");
			List<Book> list= bd.list(b, pagebean);;
			for (Book book : list) {
				System.out.println(book);
			} 
		} catch (SQLException e) {
			e.printStackTrace();
		} catch (InstantiationException e1) {
			e1.printStackTrace();
		} catch (IllegalAccessException e1) {
			e1.printStackTrace();
		}
	}
	
}

下面就是输出的结果,只展示了10条数据
在这里插入图片描述

版权声明:本文为weixin_45092850原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_45092850/article/details/90749068

智能推荐

循环

与任何程序设计语言一样Java利用条件语句与循环结构确定流程控制,一下总结一下Java中的循环语句: while do while for switch 对于golang来说: switch非常灵活。从第一个expr为true的case开始执行,如果case带有fallthrough,程序会继续执行下一条case,不会再判断下一条case的expr,如果之后的case都有fallthrough,d...

1638 统计只差一个字符的子串数目(动态规划)

1. 问题描述: 给你两个字符串 s 和 t ,请你找出 s 中的非空子串的数目,这些子串满足替换一个不同字符以后,是 t 串的子串。换言之,请你找到 s 和 t 串中恰好只有一个字符不同的子字符串对的数目。比方说, "computer" 和 "computation"...

websocket基本原理

HTTP中一个request只能有一个response。而且这个response也是被动的,不能主动发起 因此过去的服务端推送信息是通过客户端不停的轮询实现的 websocket是双向通信协议,提供了服务端主动推送信息的能力 需要客户端(浏览器)和服务端同时支持 如果经过代理的话,还需要代理支持,否则有些代理在长时间无通信时会自动切断连接 因此WS为了保证连接不被断掉,会发心跳 WebSocket...

mybatis+ehcache二级缓存

导入jar包 mapper.xml文件开启二级缓存 pojo类实现序列化接口 配置ehcache.xml 测试...

python+opencv实现图像拼接

任务 拍摄两张图片去除相同部分,拼接在一起 原图 结果 步骤 读取两张图片 使用sift检测关键点及描述因子 匹配关键点 处理并保存关键点 得到变换矩阵 图像变换并拼接 代码实现 扩展 这里对右边图像进行变换,右边变得模糊,可以修改代码对左边图像变换 这里只有两张图片拼接,可以封装实现多张图片拼接 可以修改代码实现上下图片的拼接...

猜你喜欢

python_sklearn机器学习算法系列之AdaBoost------人脸识别(PCA,决策树)

          注:在读本文之前建议读一下之前的一片文章python_sklearn机器学习算法系列之PCA(主成分分析)------人脸识别(k-NearestNeighbor,KNN)         本文主要目的是通过一个简单的小...

memmove函数与memcpy函数的模拟实现

memmove函数和memcpy函数都是在内存复制任意类型的,但是它俩也有区别。当源区域和目标区域有重复的,memmove函数会复制缓冲区重叠的部分,而memcpy相反,会报出未知错误。 下面给出两个函数的实现 首先,memmove函数。 实现的基本原理如下图。 具体代码如下: memcpy函数的实现很简单,就直接给出源代码了...

SpringFramework核心 - IOC容器的实现 - 总结

1. 概述 把Spring技术内幕第一章和第二章过了一遍,也做了一些笔记, 对IOC容器的实现有了一定皮毛理解,现在跟着源码再过一遍总结一下IOC容器的初始化,Bean的初始化的过程,做一下总结 ① IOC容器和简单工厂模式 在开始之前,先想想我们平时是怎么使用IOC容器为我们管理Bean的,假设我们要把下面的User类交给IOC容器管理 我们不想关心如何创建一个User对象实例的,仅仅在需要他的...

Python和Django的安装

个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈  一、下载并安装Python Python 官方下载地址:http://www.python.org/ftp/python/ 我们这里选择的是 Python 2.7.2 。虽然目前最新版是Python 3.2.2, 但是Django目前还不支持 Python 3.2.2。 安装步骤很简单,双击安装包开...