- MySQL的分页查询语句
- 如何设置《上一页》和《下一页》的有效性呢?
- 示例代码
使用 MySQL 的分页查询语句 select * from project limit 5,5
,打开表 project,获取全部记录,只要第 5 条记录后的 5 条记录,不包含第 5 条记录在内,记录编号从 1 开始;如果记录编号从 0 开始,那么则从第 5 条记录起,要 5 条记录,包含第 5 条记录在内。
在 DAO 中将 select * from project limit ?,?
这条SQL语句框架准备好,在设置参数的时候,第1个参数设置为 (page-1)*rowsPerPage
, 第 2 个参数设置为 rowsPerPage
。page
就是你要查看第几页,rowsPerPage
就是每页显示多少行,如果你要查看第 5 页,每页显示 5 行,那么就应该扣除前面 4 页的 20 行,应该从 21 条开始查询 5 条记录,MySQL 是通过索引值来定位记录的位置,第 21 行记录的索引值为 20,而 (page-1)*rowsPerPage
这个表达式计算出来正好是 20,那么第 2 个参数则是 5,表示的含义就是从索引值为 20 的记录开始获取5条记录(含起始行),正好就是第 5 页要显示的数据了。
查询的页数是第一页时,表示前面已经没有了,那么《上一页》按钮则不可以点击;查询的页数如果是最后一页时,表示后面已经没有了,那么《下一页》按钮则不可以点击。
这里使用 jstl 标签 结合 el 表达式来实现。
上一页
上一页
示例代码
DAO 的示例代码:
package priv.lwx.struts2.dao;
import priv.lwx.struts2.entity.Project;
import priv.lwx.struts2.util.ConnectionUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
/**
* description
*
* @author liaowenxiong
* @date 2022/2/7 13:18
*/
public class ProjectDAO {
private static final String findAll = "select id,name,start_date,end_date from t_project";
private static final String findAll2 = "select id,name,start_date,end_date from t_project limit ?, ?";
private static final String totalRows = "select count(*) from t_project";
/**
* 获取所有项目的集合
* @return
*/
public List findAll() {
Connection conn;
PreparedStatement pstmt;
ResultSet rs;
List list = new ArrayList();
try {
conn = ConnectionUtils.getConnection();
pstmt = conn.prepareStatement(findAll);
rs = pstmt.executeQuery();
while (rs.next()) {
Project project = new Project();
project.setId(rs.getInt("id"));
project.setName(rs.getString("name"));
project.setStartDate(rs.getDate("start_date"));
project.setEndDate(rs.getDate("end_date"));
list.add(project);
}
} catch (SQLException e) {
e.printStackTrace();
}
return list;
}
/**
* 根据提供的页码和每页显示的行数获取工程集合
*
* @param page
* @param rowsPerPage
* @return 工程的集合
*/
public List findAll(int page, int rowsPerPage) {
Connection conn = ConnectionUtils.getConnection();
PreparedStatement pstmt;
ResultSet rs;
List list = new ArrayList();
try {
pstmt = conn.prepareStatement(findAll2);
pstmt.setInt(1, (page - 1) * rowsPerPage);
pstmt.setInt(2, rowsPerPage);
rs = pstmt.executeQuery();
while (rs.next()) {
Project project = new Project();
project.setId(rs.getInt(1));
project.setName(rs.getString(2));
project.setStartDate(rs.getDate(3));
project.setEndDate(rs.getDate(4));
list.add(project);
}
} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}
return list;
}
/**
* 获取总的页数
* @param rowsPerPage 传入每页显示的行数
* @return 返回总的页数
*/
public int getTotalPages(int rowsPerPage) {
Connection conn;
PreparedStatement pstmt;
ResultSet rs;
conn = ConnectionUtils.getConnection();
try {
pstmt = conn.prepareStatement(totalRows);
rs = pstmt.executeQuery();
rs.next();
int totalRows = rs.getInt(1);
if (totalRows % rowsPerPage == 0) {
return totalRows / rowsPerPage;
} else {
return totalRows / rowsPerPage + 1;
}
} catch (SQLException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
}
Action 的示例代码:
package priv.lwx.struts2;
import priv.lwx.struts2.dao.ProjectDAO;
import priv.lwx.struts2.entity.Project;
import java.util.List;
/**
* description
*
* @author liaowenxiong
* @date 2022/2/7 15:19
*/
public class ProjectListAction {
// input
private int page = 1;
private int rowsPerPage = 3;
// output
private List projects;
private int totalPages;
public int getTotalPages() {
return totalPages;
}
public void setTotalPages(int totalPages) {
this.totalPages = totalPages;
}
public String execute() {
ProjectDAO pdao = new ProjectDAO();
// projects = pdao.findAll();
projects = pdao.findAll(page, rowsPerPage);
totalPages = pdao.getTotalPages(rowsPerPage);
return "success";
}
public List getProjects() {
return projects;
}
public void setProjects(List projects) {
this.projects = projects;
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getRowsPerPage() {
return rowsPerPage;
}
public void setRowsPerPage(int rowsPerPage) {
this.rowsPerPage = rowsPerPage;
}
}
jsp 示例代码:
Title
Project List
上一页
上一页
|第${page}页|
下一页
下一页
ID
NAME
Start Date
End Date
${project.id}
${project.name}
${project.startDate}
${project.endDate}
以上的方式是通过 jstl 标签库和 el 表达式相结合来实现的,当然我们也可以通过 Java 代码来实现,就是在 jsp 中添加如下的 Java 代码片段: