分页的第二种方式

本文介绍了一种分页查询的优化方法,通过重构代码减少了数据库的查询次数,并提高了查询效率。文章详细展示了如何通过创建PageData类来封装分页所需的所有信息,包括当前页数、总页数和数据列表。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

优点:
1.代码十分简洁
缺点:
1.不能及时响应数据库中变化
2.重复查询较多,每获取一个属性(总页数),都要查找数据库


将某一页的数据直接封装在此类中,调一个方法便可获取数据。
public class fengye {
// 查询所有用户
public List<User> selecthouse() {
// TODO Auto-generated method stub
Session session = HibernateUtil.getSession();
// 开启事物
Transaction tran = session.beginTransaction();

String hql = "from User";
Query q = session.createQuery(hql);

List<User> list = q.list();
HibernateUtil.closeSession();
return list;
}

// 计算页数
public int getTotalPages(int count, int pageSize) {
int totalpages = 0;
totalpages = (count % pageSize == 0) ? (count / pageSize) : (count
/ pageSize + 1);
return totalpages;
}

// 获取用户数
public int getConut() {
Session session = HibernateUtil.getSession();
Transaction tran = session.beginTransaction();

String hql = "select count(*) from User";
Query q = session.createQuery(hql);
List list = q.list();
String li = list.get(0).toString();
Integer count = Integer.parseInt(li);
HibernateUtil.closeSession();
return count;
}

// 获取当前页的记录
public List<User> selechouse(int pageIndex, int pageSize) {
Session session = HibernateUtil.getSession();
// 开启事物
Transaction tran = session.beginTransaction();
String hql = "from User";
Query query = session.createQuery(hql);
query.setFirstResult((pageIndex - 1) * pageSize);
query.setMaxResults(pageSize);
List<User> result = query.list();
HibernateUtil.closeSession();
return result;
}
}

JSP页面:
<%
//设置每页显示条数
int pageSize = 3;
//实例化
fengye newxw = new fengye();
//获取表中有多少条数据
int count = newxw.getConut();
//获取页码
String page1 = request.getParameter("pageIndex");
//得到分页数目
int pag = newxw.getTotalPages(count, pageSize);
//得到当前页码
int pageIndex = 0;

//判断得到的值是否有值
if (page1 == null) {
pageIndex = 1;
} else {
//把当前页赋值给pageIndex
pageIndex = Integer.parseInt(page1);
//判断当前页是否为最大页
if (pageIndex > pag) {
pageIndex = pag;
}
}
List<User> list = newxw.selechouse(pageIndex, pageSize);
request.setAttribute("list", list);
%>


<table id="cs_table" class="datatable">
<thead>
<tr>
<th>名称</th>
<th>性别</th>
<th>地址</th>
</tr>
</thead>
<tbody>
<c:forEach items="${requestScope.list}" var="mind" varStatus="id">
<tr>
<td>${mind.username}</td>
<td>${mind.sex}</td>
<td>${mind.address}</td>
</tr>
</c:forEach>
</tbody>

</table>

<div id="fy">
<%
//判断当前页是否为末页
if (pageIndex > 1) {
%>
<a href="page1.jsp?pageIndex=<%=1%>"> 首页</a> <a
href="index.jsp?pageIndex=<%=pageIndex - 1%>"> 上一页 </a>
<%
}
//判断当前页是否为首页
if (pageIndex < pag) {
%>
<a href="page1.jsp?pageIndex=<%=pageIndex + 1%>"> 下一页</a> <a
href="page1.jsp?pageIndex=<%=pag%>"> 末页 </a>
<%
}
%>
[<%=pageIndex%>/<%=pag%>]页
</div>


改进版:性能更优化,代码更简洁。

为页面数据新建一个类
public class PageData {
private int count;
private int pageIndex;
private int totalPages;
private List<User> list;
}省略get/set

此类减少到一个核心方法,将数据放入PageData对象中。
public class fengye {
private PageData data;
public fengye(){
data=new PageData();
}
public PageData getData(int pageIndex,int pageSize){
Session session = HibernateUtil.getSession();
// 开启事物
Transaction tran = session.beginTransaction();

String hql = "from User";
Query q = session.createQuery(hql);

List<User> list = q.list();
Integer count = list.size();
int totalpages = 0;
totalpages = (count % pageSize == 0) ? (count / pageSize) : (count
/ pageSize + 1);
data.setTotalPages(totalpages);
if(pageIndex>totalpages){
pageIndex=totalpages;
}
q.setFirstResult((pageIndex - 1) * pageSize);
q.setMaxResults(pageSize);
list = q.list();
data.setList(list);
data.setPageIndex(pageIndex);
data.setCount(count);
HibernateUtil.closeSession();
return data;
}
}

JSP
//设置每页显示条数
int pageSize = 3;
//实例化
fengye newxw = new fengye();
//得到当前页码
int pageIndex = 0;
//获取页码
String page1 = request.getParameter("pageIndex");
//判断传来的参数是否有值
if (page1 == null) {
pageIndex = 1;
} else {
//把当前页赋值给pageIndex
pageIndex = Integer.parseInt(page1);
//判断当前页是否为最大页
}
//获取表中有多少条数据
int count ;
//得到分页数目
int pag;
PageData data=newxw.getData(pageIndex, pageSize);
count=data.getCount();
page1=""+data.getPageIndex();
pag=data.getTotalPages();
List<User> list = data.getList();
request.setAttribute("list", list);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值