数据库的分页查询.docx
- 文档编号:24568164
- 上传时间:2023-05-28
- 格式:DOCX
- 页数:17
- 大小:19.21KB
数据库的分页查询.docx
《数据库的分页查询.docx》由会员分享,可在线阅读,更多相关《数据库的分页查询.docx(17页珍藏版)》请在冰豆网上搜索。
数据库的分页查询
数据库的分页查询
分页,简单说就是将一大页的数据分割成两页或更多页来显示。
好处在于适应屏幕的大小,避免一拉到底出现数据的漏查;坏处就是加大了服务器的附和。
现在的分页方式主要有两种:
1.根据需求分批从数据库调取固定size的数据,2.使用集合类一次性从数据库调取数据,再进行分页处理。
今天,我讲解的是第一种分页方式。
首先,创建web工程并搭建好SSH框架环境。
在bean包下新建分页的封装类PageBean和普通Bean类User,编写User.hbm.xml。
详细代码如下:
PageBean
[java]viewplaincopy
importjava.util.List;
@SuppressWarnings("unchecked")
publicclassPageBean{
privateListlist;//要返回的某一页的记录列表
privateintallRow;//总记录数
privateinttotalPage;//总页数
privateintcurrentPage;//当前页
privateintpageSize;//每页记录数
privatebooleanisFirstPage;//是否为第一页
privatebooleanisLastPage;//是否为最后一页
privatebooleanhasPreviousPage;//是否有前一页
privatebooleanhasNextPage;//是否有下一页
publicListgetList(){
returnlist;
}
publicvoidsetList(Listlist){
this.list=list;
}
publicintgetAllRow(){
returnallRow;
}
publicvoidsetAllRow(intallRow){
this.allRow=allRow;
}
publicintgetTotalPage(){
returntotalPage;
}
publicvoidsetTotalPage(inttotalPage){
this.totalPage=totalPage;
}
publicintgetCurrentPage(){
returncurrentPage;
}
publicvoidsetCurrentPage(intcurrentPage){
this.currentPage=currentPage;
}
publicintgetPageSize(){
returnpageSize;
}
publicvoidsetPageSize(intpageSize){
this.pageSize=pageSize;
}
/***/
/**
*初始化分页信息
*/
publicvoidinit(){
this.isFirstPage=isFirstPage();
this.isLastPage=isLastPage();
this.hasPreviousPage=isHasPreviousPage();
this.hasNextPage=isHasNextPage();
}
/***/
/**
*以下判断页的信息,只需getter方法(is方法)即可
*
*@return
*/
publicbooleanisFirstPage(){
return(currentPage==1);//如是当前页是第1页
}
publicbooleanisLastPage(){
returncurrentPage==totalPage;//如果当前页是最后一页
}
publicbooleanisHasPreviousPage(){
returncurrentPage!
=1;//只要当前页不是第1页
}
publicbooleanisHasNextPage(){
returncurrentPage!
=totalPage;//只要当前页不是最后1页
}
/***/
/**
*计算总页数,静态方法,供外部直接通过类名调用
*
*@parampageSize
*每页记录数
*@paramallRow
*总记录数
*@return总页数
*/
publicstaticintcountTotalPage(finalintpageSize,finalintallRow){
inttotalPage=allRow%pageSize==0?
allRow/pageSize:
allRow
/pageSize+1;
returntotalPage;
}
/***/
/**
*计算当前页开始记录
*
*@parampageSize
*每页记录数
*@paramcurrentPage
*当前第几页
*@return当前页开始记录号
*/
publicstaticintcountOffset(finalintpageSize,finalintcurrentPage){
finalintoffset=pageSize*(currentPage-1);
returnoffset;
}
/***/
/**
*计算当前页,若为0或者请求的URL中没有"?
page=",则用1代替
*
*@parampage
*传入的参数(可能为空,即0,则返回1)
*@return当前页
*/
publicstaticintcountCurrentPage(intpage){
finalintcurPage=(page==0?
1:
page);
returncurPage;
}
}
User
[java]viewplaincopy
packagecom.sram.bean;
importjava.util.ArrayList;
importjava.util.LinkedList;
importjava.util.List;
/**
*用户bean
*
*/
publicclassUser{
privateintid;
privateStringusername;//用户名
privateStringpassword;//密码
privateStringpicUrl;//图片
privateStringemail;//邮箱
privateStringtel;//电话
privateStringsex;//性别
privateStringjob;//工作
publicintgetId(){
returnid;
}
publicStringgetPicUrl(){
returnpicUrl;
}
publicvoidsetPicUrl(StringpicUrl){
this.picUrl=picUrl;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetUsername(){
returnusername;
}
publicvoidsetUsername(Stringusername){
this.username=username;
}
publicStringgetPassword(){
returnpassword;
}
publicvoidsetPassword(Stringpassword){
this.password=password;
}
publicStringgetEmail(){
returnemail;
}
publicvoidsetEmail(Stringemail){
this.email=email;
}
publicStringgetTel(){
returntel;
}
publicvoidsetTel(Stringtel){
this.tel=tel;
}
publicStringgetSex(){
returnsex;
}
publicvoidsetSex(Stringsex){
this.sex=sex;
}
publicStringgetJob(){
returnjob;
}
publicvoidsetJob(Stringjob){
this.job=job;
}
}
然后,编写Dao层的相关代码。
User的Dao接口IUserDao.java,部分代码如下:
[java]viewplaincopy
voidaddUser(Useruser);
//登录验证
UsertestLogin(Useruser);
//得到所有用户
publicList
finalintlength);
//得到记录总数
intgetAllRowCount(Stringhql);
在实现类UserDaoImpl.java中,实现对数据的分页提取
[java]viewplaincopy
publicList
finalintlength){
Listlist=hibernateTemplate.executeFind(newHibernateCallback(){
publicObjectdoInHibernate(Sessionsession)
throwsHibernateException,SQLException{
Queryquery=session.createQuery(hql);
query.setFirstResult(offset);
query.setMaxResults(length);
List
returnlist;
}
});
returnlist;
}
publicintgetAllRowCount(Stringhql){
returnthis.hibernateTemplate.find(hql).size();
}
之后,完成service层对Dao层类方法的封装,便于action调用
User的service层接口IUserService.java关键代码如下:
[java]viewplaincopy
//添加用户
voidaddUser(Useruser);
//登录验证
UsertestLogin(Useruser);
//得到对应页的数据信息
publicPageBeanqueryForPage(intpageSize,intcurrentPage);
User的service层实现类UserServiceImpl.java,部门代码实现
[java]viewplaincopy
@Repository
publicclassUserServiceImplimplementsIUserService{
@Resource
privateIUserDaoud;
publicvoidaddUser(Useruser){
ud.addUser(user);
}
publicList
finalintlength){
returnud.listUser(offset,length);
}
publicUsertestLogin(Useruser){
returnud.testLogin(user);
}
@SuppressWarnings("unchecked")
publicPageBeanqueryForPage(intpageSize,intpage){
finalStringhql="fromUser";//查询语句
intallRow=this.ud.getAllRowCount(hql);//总记录数
inttotalPage=PageBean.countTotalPage(pageSize,allRow);//总页数
finalintoffset=PageBean.countOffset(pageSize,page);//当前页开始记录
finalintlength=pageSize;//每页记录数
finalintcurrentPage=PageBean.countCurrentPage(page);
List
//把分页信息保存到Bean中
PageBeanpageBean=newPageBean();
pageBean.setPageSize(pageSize);
pageBean.setCurrentPage(currentPage);
pageBean.setAllRow(allRow);
pageBean.setTotalPage(totalPage);
pageBean.setList(list);
pageBean.init();
returnpageBean;
}
}
接下来,主要完成action包下对请求的获取和采取的响应。
在这里,我只对分页信息的提取部分做简单介绍:
1.定义分页所需的属性:
[java]viewplaincopy
privatePageBeanpageBean;//包含分布信息的bean
privateintpage;//第几页
上面的属性中没有每页要显示的记录条数,是因为在方法中默认显示条数为常量。
如果你需要实现分页记录的调整时,将此属性设为变量并编写其get/set方法即可获取。
2.对页面请求调用service方法。
[java]viewplaincopy
@Resource
privateIUserServiceus;
[java]viewplaincopy
//查看所有用户列表
publicStringenterUserList(){
this.pageBean=us.queryForPage(5,page);
ServletActionContext.getRequest().setAttribute("userList",
pageBean.getList());
return"query_user";
}
关于Struts的xml,和Spring的xml配置就不做过多阐述。
最后来看最终显示页面的代码如何编写:
[html]viewplaincopy
<%@pagelanguage="java"import="java.util.*"pageEncoding="utf-8"%>
<%@taglibprefix="s"uri="/struts-tags"%>
<%
Stringpath=request.getContextPath();
StringbasePath=request.getScheme()+":
//"+request.getServerName()+":
"+request.getServerPort()+path+"/";
%>
DOCTYPEHTMLPUBLIC"-//W3C//DTDHTML4.01Transitional//EN">
--
-->
用户名 | 用户密码 | iftest="%{pageBean.currentPage==1}"> 首页上一页 if> else> enterUserList? page=1">首页 enterUserList? page= propertyvalue="%{pageBean.currentPage-1}"/>"/>上一页 else> | iftest="%{pageBean.currentPage! =pageBean.totalPage}"> enterUserList? page= propertyvalue="%{pageBean.currentPage+1}"/>">下一页 [html]viewplaincopy enterUserList? page= propertyvalue="pageBean.totalPage"/>">尾页 if> else> 下一页尾页 else> | 页次 propertyvalue="pageBean.currentPage"/>/ propertyvalue="pageBean.totalPage"/>共 propertyvalue="pageBean.allRow"/>记录 |
---|
至此,分页代码操作基本完成,希望初学者看懂分页原理,设计自己满意的翻页效果,不要一味复制粘贴插件代码。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据库 分页 查询
![提示](https://static.bdocx.com/images/bang_tan.gif)