一.分页
Java的分页功能通常在Web开发中用于展示数据列表的分页显示。这种场景下,数据量可能非常庞大,如果一次性将所有记录都展示出来,会导致页面加载缓慢,用户体验不佳。
分页功能可以将数据分为多个页面展示,每个页面仅包含一定数量的记录,大大提高了页面加载速度和响应时间,增强了用户体验。此外,分页功能还可以支持用户自行选择每页显示的记录数和跳转到指定页面的功能,更加满足用户的需求。
1.1分页需要的步骤
- 定义每页显示的记录数pageSize和当前页码pageNum。
- 查询总记录数total,并计算总页数pageCount(total/pageSize,若有余数则加1)。
- 计算每页的起始记录位置start((pageNum-1)*pageSize)。
- 编写查询语句时加上LIMIT语句,限制查询结果的起始位置和记录数,如:LIMIT start, pageSize。
- 返回查询结果以及总页数等信息。
在这里我是用了BaseDao
首先建立一个类,分页工具类里面写需要的属性----页码,条目(页大小),总记录数,及写了是否需要分页4个属性,在这个里面写了一个起始下标的方法
package com.yinzi.utils; /** * 分页工具类 * */ 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 + "]"; } }
先上整体代码,给大家康康!
/** * 带分页的模糊查询 * @param c * @param sql * @param pagebean * @return * @throws Exception */ public List<T> executeQuery(Class c ,String sql,PageBean pagebean) throws Exception{ //创建集合保存数据 List<T> list = new ArrayList<>(); //获取连接 Connection conn =null; //执行SQL语句 PreparedStatement ps = null; //结果集对象 ResultSet rs =null; //判断是否需要分页 if(pagebean!=null && pagebean.isPagination()) {//如果需要分页,就拼接SQL语句 String Countsql=getCountsql(sql);//获取总数量 conn = DBAccess.getConnection(); ps = conn.prepareStatement(Countsql);//执行改变后的SQL语句 rs = ps.executeQuery(); if(rs.next()) { pagebean.setTotal(rs.getObject("n").toString()); } String pagesql=getPagesql(sql,pagebean); conn = DBAccess.getConnection(); ps = conn.prepareStatement(pagesql);//执行改变后的SQL语句 rs = ps.executeQuery(); }else {//否则不需要,就按照原sql语句执行 conn = DBAccess.getConnection(); ps = conn.prepareStatement(sql); rs = ps.executeQuery(); } //循环遍历数据 while(rs.next()) { T t = (T) c.newInstance(); //拿到所有的属性 Field[] fields = c.getDeclaredFields(); for (Field field : fields) { //打开访问权限 field.setAccessible(true); field.set(t,rs.getObject(field.getName())); } list.add(t); } return list; }
二.详解BaseDao
1. 先是定义属性
2. 判断是否需要分页,如果需要就要拼接分页的SQL语句,如果不需要则按照原SQL语句执行
3. 遍历数据,需要用到反射,拿到属性,最后在进行设置保存
这是两个方法,来获取总记录数和限制当前页面的条目
三.在Dao方法中运行
package com.yinzi.dao; import java.util.ArrayList; /** * dao方法类 * @author 86131 * */ import java.util.List; import org.junit.Test; import com.yinzi.entity.Book; import com.yinzi.utils.PageBean; import com.yinzi.utils.StringUtils; public class BookDao extends BaseDao<Book>{ /** * 查询所有的方法 * @param book * @param pagebean * @return list * @throws Exception */ public List<Book> queryAll(Book book,PageBean pagebean) throws Exception{ //sql语句 //查询所有 String sql="select * from t_mvc_book where 1=1 ";//必然会进来 //根据name属性进行模糊查询 String bname = book.getBname();//获取bname属性 //判断(模糊查询) if(StringUtils.isNotBlank(bname)) {//如果字符串bname不为空就拼接在SQL语句 sql+=" and bname like '%"+bname+"%'"; } return super.executeQuery(Book.class, sql, pagebean); } //测试 public static void main(String[] args) throws Exception { Book book=new Book(); PageBean pagebean =new PageBean(); List<Book> queryAll = new BookDao().queryAll(book, pagebean); for (Book book2 : queryAll) { System.out.println(book2); } }
3.1 详解Dao方法
最后测试出来的结果是 10条数据