对分页的理解:
分页:
分页一张表:创建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中,分页功能通常用于从数据库或数据集合中提取部分数据,提高性能和用户体验。分页的基本思路是根据页码和每页显示的数据量来限制查询结果。