分页查询
分页查询事实上和其它的没什么差别。主要差别在一个地方,就是查询语句不通。分页查询可能比較麻烦一点,以下来说一下该怎样实现我们的分页查询功能:
一、代码展示
1、封装分页实体PageModel,保存一些分页查询的基本信息
/**
* 封装分页信息
*/</span>
public class PageModel {
//结果集</span>
private List list;
//查询记录数</span>
private int totalRecords;
//每页多少条数据</span>
private int pageSize;
//第几页</span>
private int pageNo;
//总页数</span>
public int getTotalPages(){
return (totalRecords+pageSize-1)/pageSize;
}
//取得首页</span>
public int getTopPageNo(){
return 1;
}
//取得尾页</span>
public int getButtomPageNo(){
return getTotalPages();
}
//上一页</span>
public int getPreviousPageNo(){
if (pageNo<=1){
return 1;
}
return pageNo-1;
}
//下一页</span>
public int getNextPageNo(){
if (pageNo>= getTotalPages()){
return getTotalPages();
}
return pageNo+1;
}
public List getList() {
return list;
}
public void setList(List list) {
this.list = list;
}
public int getTotalRecords() {
return totalRecords;
}
public void setTotalRecords(int totalRecords) {
this.totalRecords = totalRecords;
}
public int getPageSize() {
return pageSize;
}
public void setPageSize(int pageSize) {
this.pageSize = pageSize;
}
public int getPageNo() {
return pageNo;
}
public void setPageNo(int pageNo) {
this.pageNo = pageNo;
}
} </span>
2、编写分页查询方法
/**
* 分页查询
* @param pageNo 第几页
* @param pageSize 每页多少条数据
* @return pageMode
*/
public PageModel findUserList(int pageNo,int pageSize){
//利用StringBuffer存放分页查询语句
StringBuffer sbSql=new StringBuffer();
sbSql.append("select user_id,user_name,password,contract_tel,email,create_date ")
.append("from ")
.append("( ")
.append("select ROWNUM rn,user_id,user_name,password,contract_tel,email,create_date ")
.append("from")
.append("( ")
.append("select * from T_USER where USER_ID<>'root' ORDER BY USER_ID ")
.append(") where ROWNUM <= ? ")
.append(") where rn > ? ");
//创建Connection对象和PreparedStatement对象
Connection conn=null;
PreparedStatement pstmt=null;
//创建ResultSet存放查询结果
ResultSet rs=null;
PageModel pageModel=null;
try{
//获取连接
conn=DbUtil.getConnection();
pstmt=conn.prepareStatement(sbSql.toString());
//设置參数
pstmt.setInt(1, pageNo * pageSize);
pstmt.setInt(2, (pageNo-1)*pageSize);
rs=pstmt.executeQuery();
List userList=new ArrayList();
//处理查询结果
while (rs.next()){
User user=new User();
user.setUserId(rs.getString("USER_ID"));
user.setUserName(rs.getString("USER_NAME"));
user.setPassword(rs.getString("PASSWORD"));
user.setContactTel(rs.getString("CONTRACT_TEL"));
user.setEmail(rs.getString("EMAIL"));
user.setCreateDate(rs.getTimestamp("CREATE_DATE"));
userList.add(user);
}
pageModel=new PageModel();
pageModel.setList(userList);
pageModel.setTotalRecords(getTotalRecords(conn));
pageModel.setPageSize(pageSize);
pageModel.setPageNo(pageNo);
}catch (SQLException e) {
e.printStackTrace();
}finally{
DbUtil.close(rs);
DbUtil.close(pstmt);
DbUtil.close(conn);
}
//返回分页查询结果pageModel
return pageModel;
}
public int getTotalRecords(Connection conn) throws SQLException {
String sql="select count(*) from t_user where user_id <> 'root'";
PreparedStatement pstmt=null;
ResultSet rs=null;
int count=0;
try{
pstmt=conn.prepareStatement(sql);
rs=pstmt.executeQuery();
rs.next();
count=rs.getInt(1);
}finally{
DbUtil.close(rs);
DbUtil.close(pstmt);
}
return count;
} 二、功能分析
综合上面的东西,事实上分页查询本质上就是一个查询语句的事:
《第三部分表3--開始》
select
user_id,user_name,password,contract_tel,email,create_date from
(《第二部分表2--開始》select ROWNUM rn,user_id,user_name,password,contract_tel,email,create_date from(《第一部分表1---開始》
select * from T_USER where USER_ID<>'root' ORDER BY USER_ID《第一部分表1---结束》)where ROWNUM <= (pageNo * pageSize)《第二部分表2--结束》) where rn > (pageNo-1)*pageSize《第三部分表3--结束》
三、总结:由上面可知,分页查询事实上就是表的嵌套查询。第一步:先将要查询的内容查出来,如第一部分;第二步:在去掉大于最大记录的那部分记录。如第二部分。第三步:在将小于最小记录的那部分去掉,如第三部分。
掐头去尾。剩下的正好是我们所须要的分页查询数据。

浙公网安备 33010602011771号