package org.student.entity;
import java.util.List;
public class Page {
private int currentPage; //当前页
private int pageSize ; //页面大小
private int totalCount; //数据库中能查到的总数据量
private int totalPage ; //总页数
private List<Student> students; //当前页的数据集合
public Page() {
}
public Page(int currentPage, int pageSize, int totalCount, int totalPage,
List<Student> students) {
this.currentPage = currentPage;
this.pageSize = pageSize;
this.totalCount = totalCount;
this.totalPage = totalPage;
this.students = students;
}
/*
* 总页数 = 数据总数%页面大小==0? 数据总数/页面大小:数据总数/页面大小+1 ;
*
* 当我们调换用了 数据总数的set() 和 页面大小的set()以后,自动计算出 总页数
* 务必注意顺序:先set 数据总数 再set 页面大小
*/
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
this.totalPage =this.totalCount%this.pageSize==0?
this.totalCount/this.pageSize:totalCount/this.pageSize+1;
}
//...... 其他简单的 get 和 set 方法
}
在请求的时候,servlet 的需要的参数及函数:
int count = studentService.getTotalCount() ;//数据总数
//将分页所需的5个字段(其中有1个自动计算,因此实际只需要组装4个即可),组装到page对象之中
Page page = new Page();
String cPage = request.getParameter("currentPage");
if(cPage == null) {cPage = "1" ;}
int currentPage = Integer.parseInt( cPage );
page.setCurrentPage(currentPage);
int currentPage = 2; //页码
int totalCount = studentService.getTotalCount() ;//总数据数
page.setTotalCount(totalCount);
/* currentPage:当前页(页码)
students :当前页的数据集合(当前页的所有学生)
*/
int pageSize = 3;
page.setPageSize(pageSize);// 这里会计算得到 totalPage
// service 到 数据库的数据的检索
List<Student> students = studentService.queryStudentsByPage(currentPage,pageSize) ;
page.setStudents(students);
request.setAttribute("p", page);
request.getRequestDispatcher("index.jsp").forward(request, response);
queryStudentsByPage函数
@Override
public List<Student> queryStudentsByPage(int currentPage, int pageSize) {
String sql = "select * from
(select rownum r, t.* from
(select s.* from student order by sno asc) t
where rownum<=? )
where r>=?";
Object[] params = {currentPage*pageSize,(currentPage-1)*pageSize+1};
List<Student> students = new ArrayList<>();
ResultSet rs = DBUtil.executeQuery(sql, params) ;
while(rs.next()) {
Student student = new Student(rs.getInt("sno"),rs.getString("sname"),
rs.getInt("sage"),rs.getString("saddress")) ;
students.add(student) ;
}
return students;
}
executeQuery 函数
private static final String URL ="jdbc:mysql://localhost:3306" ;
private static final String USERNAME ="scott" ;
private static final String PASSWORD ="tiger" ;
public static PreparedStatement pstmt = null ;
public static Connection connection = null ;
public static ResultSet rs = null ;
public static ResultSet executeQuery( String sql ,Object[] params){
Class.forName("com.mysql.jdbc.Driver") ;
Connection connection = DriverManager.getConnection( URL,USERNAME,PASSWORD ) ;
pstmt = connection.prepareStatement(sql)
for(int i=0;i<params.length;i++) {
pstmt.setObject(i+1, params[i]);
}
rs = pstmt.executeQuery() ;
return rs;
}
获得数据简单的方式是根据mysql sql 语句去实现的,上面的代码上的sql语句是oracle的语句,上面的代码也是看的某机构培训视频中自己跟着敲代码做个记录而放上来的,接下来,看看再mysql 中试如何写分页得查询的。
limit实现分页
--语法:
SELECT * FROM table LIMIT [offset,] rows | rows OFFSET offset
--举例:
select * from table limit 5; --返回前5行
select * from table limit 0,5; --同上,返回前5行
select * from table limit 5,10; --返回6-15行
当一个查询语句偏移量offset很大的时候,如select * from table limit 10000,10, 最好不要直接使用limit,而是先获取到offset的id后,再直接使用limit size来获取数据。效果会好很多。这篇文章会详细对比着两种方式得查询时间。
select * From customers Where customer_id >=(
select customer_id From customers Order By customer_id limit 10000,1
) limit 10;
mysql top查询
--语法:
SELECT TOP number|percent column_name(s) FROM table_name;
-- 列子
select top 2 * from table; -- 选取表中前2条记录
select top 50 persent * from table; -- 选取表中50%的记录
--从数据库中检索第10—20条记录
SELECT TOP 10 * FROM TestTable WHERE
(ID NOT IN (SELECT TOP 20 id FROM TestTable ORDER BY id))
ORDER BY ID;