这一部分的实现确实让我学到不少东西。不管是后端还是前端部分的实现。
-
首先需要明确的是,实现分页查询,我们需要从前端获取到几个参数?第一个是当前在第几页,第二个是每一页有多少个值。分别叫做:currentPage和pageSize。
-
其次,明确我们从后端拿到哪些数据给前端输出?第一个是当前页的数据内容,这个结果是一个集合;第二个是所有数据的总数,这个结果就是一个数字。
-
最后,怎么把它们封装成一个东西传给后端呢?答案是用对象来,新增一个pageBean对象,这个对象里面就装两个属性,一个集合,一个数字。接下来是实现部分。
后端的实现我分为4步来实现
步骤一 ①准备好PageBean
以后这里面就用来存储返回给前端的内容。
import java.util.List;
//分页查询的JavaBean
public class PageBean<T> {
//总记录数
private int totalCount;
//当前页数据
private List<T> rows;
public int getTotalCount() {
return totalCount;
}
public void setTotalCount(int totalCount) {
this.totalCount = totalCount;
}
public List<T> getRows() {
return rows;
}
public void setRows(List<T> rows) {
this.rows = rows;
}
}
但是这里也有小细节需要注意。
那就是集合的类型。
集合需要传递什么类型呢?brand表用brand对象,user表用user对象,为了代码的复用性,这里干脆不设置类型,直接设置一个泛型,以后什么表就用什么类型。那当然,这里使用了泛型,类名的地方就需要有。
步骤二 ②写SQL代码
SQL就需要查询两个内容,第一个是当前页的数据,另一个是总数。总数好查,直接就一个方法count(*)就🆗,这个根据页面来进行查询确实在学习MySQL时忘了,其实就是:查询索引从1开始的5条数据。这种题改造过来的。
代码:
/**
* 分页查询
* @param begin
* @param size
* @return
*/
@Select("select * from tb_brand limit #{begin}, #{size}")
@ResultMap("brandResultMap")
List<Brand> selectByPage(@Param("begin") int begin, @Param("size")int size);
/**
* 查询总记录数
* @return
*/
@Select("select count(*) from tb_brand")
int selectTotalCount();
SQL语句中主要就是
limit
这个关键字,一般用的少,所以没有记住。传进来一个起始值,和一个大小,返回这个区间的一个结果集合。
步骤三 ③service层代码
- 老规矩,还是接口这部分的内容。
这里写的代码还确实跟以前不一样,让我不看代码来回忆回忆。首先看返回的类型–PageBean对象,其次确定泛型的值,是brand类型。最后是需要传入的值,分析好几遍了就不分析了。下面是代码:
/**
* 分页查询
* @param currentPage 当前页码
* @param pageSize 每页展示条数
* @return
*/
PageBean<Brand> selectByPage(int currentPage, int pageSize);
- 实现部分代码:
这里和之前也是有许多需要注意的点,能确定的是最后我们返回的是一个pagebean对象,那挨个分析。
① 第一个是根据当前页和大小来获取一个集合结果,当前页是currentPage,这里需要计算一下,开始的索引是多少,我们要将开始的索引传给SQL,这里是计算方法:int begin = (currentPage -1) * pageSize;
,索引的大小等于现在我们处于多少页减去一,再乘以这个页面的大小。比如说我们每一页展示5个数据,现在我们正处于第一页,那索引就是0,将0和5这两个数据传给SQL去执行,返回的就是第一到第五条数据。同理,假如我们现在每一页还是展示5个数据,现在处于第二页,那索引就是2减一再乘以5,等于5,那么我们需要传给SQL的就是,1和5这两个值。
② 第二个是查询有多少条数据,这个不需要任何参数,只单纯是一个查询。
最后将结果进行封装和返回就可以了。
代码:
@Override
public PageBean<Brand> selectByPage(int currentPage, int pageSize) {
SqlSession sqlSession = sqlSessionFactory.openSession();
BrandMapper mapper = sqlSession.getMapper(BrandMapper.class);
//计算开始索引
int begin = (currentPage -1) * pageSize;
//查询的条目数(总数)
int size = pageSize;
//查询当前页数据
List<Brand> rows = mapper.selectByPage(begin, size);
//查询总记录数
int totalCount = mapper.selectTotalCount();
//封装成PageBean对象
PageBean<Brand> PageBean = new PageBean<>();
PageBean.setRows(rows);
PageBean.setTotalCount(totalCount);
//释放资源
sqlSession.close();
return PageBean;
}
步骤四 ④ servlet代码
这部分代码也是跟以前不一样。
-
首先就是,前端怎么把值穿过来?之前只传对象和值,现在怎么传递这个变动的值?我想的是传递一个数组到servlet,这个数组就负责告诉servlet我现在的pagesize以及目前处于的索引。但是跟着老师学是使用在url中进行传值
url?currentPage=1&pageSize=5
,最后通过request
,来取值。也是开拓了一个思路。 -
之后需要将取到的值转换成int类型的。最后调用方法,转json,还是以前的套路。就是返回的是pagebean对象以及将pagebean对象转为json对象,一下子还没有适应过来。
/**
* 分页查询
* @param request
* @param response
* @throws IOException
*/
public void selectByPage(HttpServletRequest request, HttpServletResponse response) throws IOException {
//1.接收参数: 当前页码 和 每页分的条目数 url?currentPage=1&pageSize=5
String _currentPage = request.getParameter("currentPage");
String _pageSize = request.getParameter("pageSize");
//转换成int类型的
int currentPage = Integer.parseInt(_currentPage);
int pageSize = Integer.parseInt(_pageSize);
//调用service进行查询
PageBean<Brand> pageBean = brandService.selectByPage(currentPage, pageSize);
//2. 转为json
String jsonString = JSON.toJSONString(pageBean);
//3. 防止乱码以及写数据
response.setContentType("text/json;charset=utf-8");
response.getWriter().write(jsonString);
}
总结
总的来说,这里更多的是开拓思路,分页查询的SQL、存储pageBean、泛型的使用、索引的计算、从前端通过request取值的思想这一切都感觉很新奇,但是这一切其实让我们去做都应该是在能力之内的事。还是,多进行学习,开拓思路。