Java--简易分页

对分页的理解:

分页:
     分页一张表:创建entry类
     分页多张表:创建pojo类
  A. 准备实体类:com.jr.entry.DVD
  B. 接口问题:

      1.根据条件,获得符合条件的总条数
      2.根据条件,获得符合条件的集合数据。


  C. 分页工具类:
     分土豆:    有一堆土豆, 分完之后,一小堆有5个土豆, 能分几堆?
     a. 每页有几条数据?  直接设置。   4
     b. 一共有多少条数据?  按条件查询数据库。  20
     c. 一共能分多少页?   通过计算可以获得 c= b/a
     d. 当前是第几页?   程序刚运行的时候,默认当前是第一页。
     e. 当前页显示的数据集合!(分页的终极目的:)

以dvd表为例;

运行结果:

代码实现

entry 层

DVD类:

package demo.entry;

import demo.enumDemo.DvdType;

public class DVD {
    private String id;
    private String dname;
    private Integer state;
    private String lenddate;
    private Integer lendCount;
    

    public DVD() {
    }

    public DVD(String id, String dname, Integer state, String lenddate, Integer lendCount) {
        this.id = id;
        this.dname = dname;
        this.state = state;
        this.lenddate = lenddate;
        this.lendCount = lendCount;
        //this.dvdType = dvdType;
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getDname() {
        return dname;
    }

    public void setDname(String dname) {
        this.dname = dname;
    }

    public Integer getState() {
        return state;
    }

    public void setState(Integer state) {
        this.state = state;
    }

    public String getLenddate() {
        return lenddate;
    }

    public void setLenddate(String lenddate) {
        this.lenddate = lenddate;
    }

    public Integer getLendCount() {
        return lendCount;
    }

    public void setLendCount(Integer lendCount) {
        this.lendCount = lendCount;
    }

 

    @Override
    public String toString() {
        return this.id+"\t"+this.dname+"\t"
                +(this.state==0?"未借出":"已借出")+"\t"
                +this.lenddate+"\t"+this.lendCount;
               
    }
}


uitl层

DBHelper类:(工具类)

package demo.uitl;

import java.lang.reflect.Field;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class DBHelper {
    public Connection getCon(){
        Connection con =null;
        try{
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://127.0.0.1:3306/dvd?useSSL=false&useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai&allowPublicKeyRetrieval=true";
            String userName = "root";//用户名
            String password = "23456";//数据库密码
            con = DriverManager.getConnection(url,userName,password);
        }catch(Exception e){
            e.printStackTrace();
        }
        return con;
    }

    public static void Close(Connection con, PreparedStatement ps, ResultSet rs){
        try{
            if(con !=null){
                con.close();
            }
            if(ps != null){
                ps.close();
            }
            if(rs != null){
                rs.close();
            }
        }catch(Exception e){
            e.printStackTrace();
        }
    }

    public int update(String sql,Object...arrs){
        Connection con = getCon();
        PreparedStatement ps = null;
        int count = 0;
        try{
            ps = con.prepareStatement(sql);
            for (int i = 0; i < arrs.length; i++) {
                ps.setObject((i+1),arrs[i]);
            }
            count = ps.executeUpdate();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }finally {
            Close(con,ps,null);
        }
        return count;
    }

    public List  query(String sql,Class cla,Object...arrs){
        Connection con = getCon();
        PreparedStatement ps =null;
        ResultSet rs = null;
        List list = new ArrayList<>();
        try{
            ps = con.prepareStatement(sql);
            for (int i = 0; i < arrs.length ; i++) {
                ps.setObject((i+1),arrs[i]);
            }
            rs = ps.executeQuery();
            while(rs.next()){
                Object obj = cla.newInstance();
                Field[] fi = cla.getDeclaredFields();
                for(Field f : fi){
                   f.setAccessible(true);
                   f.set(obj,rs.getObject(f.getName()));
                }
                list.add(obj);
            }
        }catch(Exception e){
            e.printStackTrace();
        }finally{
            Close(con,ps,rs);
        }
        return list;
    }
}

PageHelper类:(工具类)

package demo.uitl;

import demo.entry.DVD;

import java.util.ArrayList;

public class PageHelper {

    /*属性部分*/
    /*
    * 每页有多少条数据
    * */
    private Integer showCount = 3;
    /*
    * 一共有多少条数据
    * */
    private Integer dataCount;
    /*
    * 一共能分多少页
    * */
    private Integer pageCount;
    /*
    * 当前是第几页,默认当前是第一页
    * */
    private Integer indexPage = 1;
    /*
    * 当前页要显示的集合数据
    * */
    private ArrayList<DVD> list;

    public PageHelper() {
    }

    public PageHelper(Integer showCount, Integer dataCount, Integer pageCount, Integer indexPage, ArrayList<DVD> list) {
        this.showCount = showCount;
        this.dataCount = dataCount;
        this.pageCount = pageCount;
        this.indexPage = indexPage;
        this.list = list;
    }

    public Integer getShowCount() {
        //return (showCount != null) ? showCount : 10; // 如果 showCount 为 null,返回 10
        return showCount;
    }

    public void setShowCount(Integer showCount) {
        this.showCount = showCount;
    }

    public Integer getDataCount() {
        return dataCount;
    }

    public void setDataCount(Integer dataCount) {
        this.dataCount = dataCount;
        getPageCount();
    }

    public Integer getPageCount() {
        //一共有12条数据,一共有多少页 12%4==0 ?13/4 : 13/4+1
        return this.dataCount % this.showCount == 0?
                this.dataCount / this.showCount:
                this.dataCount / this.showCount +1;
    }

    public void setPageCount(Integer pageCount) {
        this.pageCount = pageCount;
    }


    public Integer getIndexPage() {
        return indexPage;
    }

    public void setIndexPage(Integer indexPage) {
        this.indexPage = indexPage;
    }

    public ArrayList<DVD> getList() {
        return list;
    }

    public void setList(ArrayList<DVD> list) {
        this.list = list;
    }
}

Dao层

DVDDao接口:

package demo.dao1;

import demo.entry.DVD;
import demo.uitl.PageHelper;

import java.util.ArrayList;

public interface DVDDao {

    /**
     * 根据条件查询总条数
     *
     * @return
     */
    int selectCountByDVD(DVD dvd);

    /**
     * 根据条件查询所有数据
     * @param dvd
     * @return
     */
    ArrayList<DVD> selectByDVD(DVD dvd, PageHelper ph);
}

DVDDaoImpl实现类:

package demo.dao1.impl;

import demo.entry.DVD;
import demo.dao1.DVDDao;
import demo.uitl.DBHelper;
import demo.uitl.PageHelper;

import java.util.ArrayList;

public class DVDDaoImpl implements DVDDao {
    private DBHelper db = new DBHelper();

    @Override
    public int selectCountByDVD(DVD dvd) {
        ArrayList args = new ArrayList();
        StringBuilder sql = new StringBuilder("select * from dvd where 1=1 ");
        if (dvd.getId() != null) {
            sql.append("and id=?");
            args.add(dvd.getId());
        }
        if (dvd.getDname() != null) {
            sql.append("and dname=?");
            args.add(dvd.getDname());
        }
        if (dvd.getState() != null) {
            sql.append("and state=?");
            args.add(dvd.getState());
        }
        if (dvd.getLendCount() != null) {
            sql.append("and lendCount=?");
            args.add(dvd.getLendCount());
        }
        if (dvd.getLenddate() != null) {
            sql.append("and lendDate=?");
            args.add(dvd.getLenddate());
        }
        return db.query(sql.toString(), DVD.class, args.toArray()).size();
    }

    @Override
    public ArrayList<DVD> selectByDVD(DVD dvd, PageHelper ph) {
        ArrayList args = new ArrayList();
        StringBuilder sql = new StringBuilder("select * from dvd where 1=1 ");
        if (dvd.getId() != null) {
            sql.append("and id=?");
            args.add(dvd.getId());
        }
        if (dvd.getDname() != null) {
            sql.append("and dname=?");
            args.add(dvd.getDname());
        }
        if (dvd.getState() != null) {
            sql.append("and state=?");
            args.add(dvd.getState());
        }
        if (dvd.getLendCount() != null) {
            sql.append("and lendCount=?");
            args.add(dvd.getLendCount());
        }
        if (dvd.getLenddate() != null) {
            sql.append("and lendDate=?");
            args.add(dvd.getLenddate());
        }
        sql.append("limit ?,?");//(index -1)*showCount
        args.add((ph.getIndexPage() - 1) * ph.getShowCount());
        args.add(ph.getShowCount());
        return (ArrayList<DVD>) db.query(sql.toString(), DVD.class, args.toArray());
    }
}

service层:

DVDService接口:

package demo.service;

import demo.entry.DVD;
import demo.uitl.PageHelper;

import java.util.ArrayList;

public interface DVDService {

    int getDataCount(DVD dvd);

    ArrayList<DVD> getindexPageList(DVD dvd, PageHelper pg);


}

DVDServiceImpl实现类:

package demo.service.impl;


import demo.entry.DVD;
import demo.service.DVDService;
import demo.dao1.DVDDao;
import demo.dao1.impl.DVDDaoImpl;
import demo.uitl.PageHelper;

import java.util.ArrayList;

public class DVDServiceImpl implements DVDService {
    private  DVDDao dvdDao = new DVDDaoImpl();

    @Override
    public int getDataCount(DVD dvd) {
        return dvdDao.selectCountByDVD(dvd);
    }

    @Override
    public ArrayList<DVD> getindexPageList(DVD dvd, PageHelper pg) {
        return dvdDao.selectByDVD(dvd,pg);
    }
}

controller层

DVDController实现类:

package demo.controller;

import demo.entry.DVD;

import demo.service.DVDService;
import demo.service.impl.DVDServiceImpl;
import demo.uitl.PageHelper;
import java.util.Scanner;

public class DVDController {
    private DVDService dvdService = new DVDServiceImpl();
    private Scanner input = new Scanner(System.in);
    PageHelper ph = new PageHelper();
    DVD dvd = new DVD();
    Integer i = null;


    public void menu() {
        while (true) {

            /*System.out.println("请输入要查询的id:");
            String id = input.next();
            dvd.setId(id);*/

            ph.setDataCount(dvdService.getDataCount(dvd));
            if (i != null) {
                ph.setIndexPage(i);
                if (i < 1 || i > ph.getPageCount()) {
                    System.out.println("输入错误,程序退出");
                    return;
                }
            }
            ph.setList(dvdService.getindexPageList(dvd,ph));
            System.out.println("一共有" + ph.getPageCount() + "页");
            System.out.println("当前是第:" + ph.getIndexPage() + "页");
            System.out.println("id\t\t\t名称\t\t状态\t\t借出时间\t\t借出次数");
            for (DVD d : ph.getList()) {
                System.out.println(d);
            }
            System.out.println("请输入你查看的页面数(1-" + ph.getPageCount() + "):");
            i = input.nextInt();
        }
    }

}

test层

Test测试类:

package demo.test;

import demo.controller.DVDController;

public class Test {
    public static void main(String[] args) {
        DVDController dvdController = new DVDController();
        dvdController.menu();

    }
}

总结

在Java中,分页功能通常用于从数据库或数据集合中提取部分数据,提高性能和用户体验。分页的基本思路是根据页码和每页显示的数据量来限制查询结果。

显示效果: [页面总数小于等于10,全部显示,当前页特殊显示] 上一页 1 2 3 4 5 6 7 8 9 10 下一页 [页面总数大于10,部分显示,当前页特殊显示] 上一页 1 2 3 … 20 下一页 [当前页面为首页时,上一页不可用] 上一页 1 2 3 4 … 20 下一页 上一页 1 2 3 4 5 … 20 下一页 上一页 1 2 3 4 5 6 … 20 下一页 上一页 1 … 3 4 5 6 7 … 20 下一页 上一页 1 … 14 15 16 17 18 ... 20 下一页 上一页 1 … 15 16 17 18 19 20 下一页 上一页 1 … 16 17 18 19 20 下一页 上一页 1 … 17 18 19 20 下一页 上一页 1 … 18 19 20 下一页[当前页面为末页时,下一页不可用] 算法提取: 0.页码显示规则: 当前页为首页时不显示上一页; 上一页 1 2 3 … 20 下一页 当前页为尾页时不显示下一页; 上一页 1 … 17 18 19 20 下一页 1.页面总数(n)<=10 { 显示全部页码:上一页 1 2 3 4 5 6 7 8 9 10 下一页 } 2.页面总数(n) > 10 { 2.1 当前页码 <= 4 { 左侧显示所有 + 当前页码 + 右侧2个页码 + ... + 尾页 上一页 1 2 3 … 20 下一页 上一页 1 2 3 4 … 20 下一页 上一页 1 2 3 4 5 … 20 下一页 上一页 1 2 3 4 5 6 … 20 下一页 } 2.2 当前页码 > 4 且<= 页面总数(n) - 3 { 首页 + ... + 左侧2个页码 + 当前页码 + 右侧2个页码 + ... + 尾页 上一页 1 … 3 4 5 6 7 … 20 下一页 上一页 1 … 14 15 16 17 18 ... 20 下一页 } 2.3 当前页码 > 页面总数(n) - 3 { 首页 + ... + 左侧2个页面 + 当前页码 + 右侧显示所有 上一页 1 … 15 16 17 18 19 20 下一页 上一页 1 … 16 17 18 19 20 下一页 上一页 1 … 17 18 19 20 下一页 上一页 1 … 18 19 20 下一页 } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值