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;