SSM手动实现分页逻辑---非PageHelper方式
第一种方法:查询出所有数据再分页
分析:
- 分页时,需要获得前台传来的两个参数,分别为
pageNo
(第几页数据),pageSize
(每页的条数); - 根据这两个参数来计算出前端需要的数据是查出数据list中的开始索引和结束索引;
- 利用List 的subList方法来分割查询出来的所有数据并返回;
实现过程
1. 获取参数
这里返回的是json数据接口,实现方法在service层
@ResponseBody
@GetMapping("/allPage")
public String findAllPage(
@RequestParam(required = true,defaultValue = "1") Integer pageNo,
@RequestParam(required = false,defaultValue = "5") Integer pageSize) {
return customerService.findAllPage(pageNo,pageSize);
}
2. 截取数据
CustomerServiceImpl.java
- 里面的pageUtil类,iterCustomer()方法,JsonUtil类在下面有所介绍,抽离这些类或者方法的目的是提高代码的复用性,减少代码冗余;
@Override
public String findAllPage(Integer pageNo, Integer pageSize) {
List<Customer> customers = customerDao.findAll();
List<Map<String, String>> resultList = new ArrayList<>();
PageUtil<Customer> pageUtil = new PageUtil<>();
for (Customer customer : pageUtil.pageList(customers, pageNo, pageSize){
resultList.add(iterCustomer(customer));
}
return JsonUtil.toJSON(resultList);
}
PageUtil.java
这个类是我抽取出来的一个截取List的工具类,创建对象时需要传一个泛型,类型为处理列表List中的类型;
该类对象调用pageList方法即可返回一个截取好长度的List 数组;
pageList方法有三个参数,
- 第一个参数为保存所有数据的List数组;
- 第二个参数为页码;
- 第三个参数为每一页显示的数据条数;
public class PageUtil<T> {
private int beginIndex;//起始索引
private int endIndex;//终止索引
public List<T> pageList(List<T> list, int pageNo, int pageSize) {
int size = list.size();
beginIndex = (pageNo - 1) * pageSize;
endIndex = pageNo * pageSize > size ? size : pageNo * pageSize;
List<T> resultList = list.subList(beginIndex, endIndex);
return resultList;
}
}
iterCustomer()方法
- 作用是得到一个map存储一个Customer实例的值,用键值对表示;
- 参数为需要包装的类对象;
- 返回值为一个Map对象,里面存储了参数类对象的一些信息;
public Map<String, String> iterCustomer(Customer customer) {
Map<String, String> resultMap = new HashMap<>();
resultMap.put("id", customer.getId().toString());
resultMap.put("name", customer.getName());
resultMap.put("phone", customer.getPhone());
resultMap.put("email", customer.getEmail());
return resultMap;
}
JsonUtil.java
- 作用是封装Jackson,返回一个json字符串;
public class JsonUtil {
//使用jackson 转换 json 数据的第一步
private static ObjectMapper MAPPER = new ObjectMapper();
static String jsonString=null;
public static String toJSON(Object object){
try {
//jackson转任意object对象 为json 字符串
jsonString = MAPPER.writeValueAsString(object);
} catch (JsonProcessingException e) {
e.printStackTrace();
}
return jsonString;
}
}
第二种方法:用SQL分页,只查询当前页所需要的数据
分析:
第一种方法在数据量比较小时可以使用,但当数据量非常大时,如果我们仅需要某一页的几条数据,而去查找所有数据,显得没有必要,或者说代价太大,所有我们现在采用第二种分页方式;
第二种方法与第一种类似,获取前端传来的页码和每页显示的条数,通过自定义SQL语句查询数据库来得到需要的数据;
sql分页参考:
实现过程
1. 获取参数
分析
- 参数中,pageNo是前端传来的页码,即第几页;pageSize是每一页要显示的条数,默认为5;
- 使用SQL分页时,查询语句中需要的参数为显示数据在数据库中的索引和每页显示的数据条目数;
- 计算索引的公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数;
- 在这里还要判断一下前端传来的页码数是否超出总数据最大的分页数,如果超出则显示最大页数;
- 最大页数计算:
int maxPage =(int) Math.ceil(count/pageSize.doubleValue());
- 最大页数计算:
CustomerController.java
@Controller
public class CustomerController {
@Autowired
CustomerService customerService;
@ResponseBody
@GetMapping("/allSql")
public String findAllPageSql(
@RequestParam(required = true,defaultValue = "1") Integer pageNo,
@RequestParam(required = false,defaultValue = "5") Integer pageSize) {
/**
* pageSize 是每页显示的条数
* pageNo 是页码,sql分页传递的第一个参数是开始的索引;
* 计算公式:开始的索引 = (当前的页码 - 1) * 每页显示的条数
*/
//数据总数
int count = customerService.count();
//计算最大页码
int maxPage =(int) Math.ceil(count/pageSize.doubleValue());
//当前页码超出最大页码返回最大页码值:
pageNo = pageNo>maxPage?maxPage:pageNo;
//分页开始的索引值
int index = (pageNo - 1) * pageSize > count ? count : (pageNo - 1) * pageSize;
return customerService.findAllPageSql(index, pageSize);
}
}
2.分层调用方法
CustomerServiceImpl.java
@Service
public class CustomerServiceImpl implements CustomerService {
@Autowired
CustomerDao customerDao;
@Override
public String findAllPageSql(Integer index, Integer pageSize) {
return JsonUtil.toJSON(customerDao.findAllPageSql(index, pageSize));
}
}
CustomerDao.java
public interface CustomerDao {
List<Customer> findAllPageSql(Integer index,Integer pageSize);
}
3.定制sql
CustomerMapper.xml
注意,这里参数为两个,获取参数时要使用#{param1}#{param2},或者通过封装Map的形式传参;
sql分页参考:
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.vue.dao.CustomerDao">
<select id="findAllPageSql" parameterType="java.lang.Integer" resultType="com.vue.entity.Customer">
SELECT * FROM t_customer LIMIT #{param1},#{param2}
</select>
</mapper>
Mapper.xml映射文件获取多个参数参考:
Mybatis中的Mapper.xml映射文件sql查询接收多个参数 或
Mybatis中的Mapper.xml映射文件sql查询接收多个参数
以上
- 以上就是SSM框架不用PageHelper插件实现分页的全过程,推荐使用第二种定制SQL查询,因为此种查询方法更加符合分页逻辑的实现,每次只查询需要的数据,而不是每次都要查询所有数据,故效率更高。
- 有问题可以一起交流:
- my blog
- 邮箱:594983498@qq.com
SSM手动实现分页逻辑---非PageHelper方式的更多相关文章
- SSM框架手动实现分页逻辑(非PageHelper)
第一种方法:查询出所有数据再分页 分析: 分页时,需要获得前台传来的两个参数,分别为pageNo(第几页数据),pageSize(每页的条数); 根据这两个参数来计算出前端需要的数据是查出数据list ...
- SSM框架——实现分页和搜索分页
登录|注册 在路上 在路上,要懂得积累:在路上,要学会放下:我在路上!Stay hungry,Stay foolish. 目录视图 摘要视图 订阅 [公告]博客系统优化升级 ...
- 利用WPF建立自己的3d gis软件(非axhost方式)(七)实现简单的粒子效果
原文:利用WPF建立自己的3d gis软件(非axhost方式)(七)实现简单的粒子效果 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew密 ...
- MySQL高效分页-mybatis插件PageHelper改进
MySQL分页在表比较大的时候,分页就会出现性能问题,MySQL的分页逻辑如下:比如select * from user limit 100000,10 它是先执行select * from user ...
- Java项目开发中实现分页的三种方式一篇包会
前言 Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用 ...
- SpringMVC中注解和非注解方式下的映射器和适配器总结
1. 非注解方式 1.1 处理器适配器 上一节中使用的处理器适配器是:org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapte ...
- 11g使用非duplicate方式创建物理standby要注意的问题总结
在上篇博文中,使用了duplicate方式来创建物理standby http://blog.csdn.net/aaron8219/article/details/38434579 今天来说说在11g中 ...
- SSM框架实现分页
SSM框架实现分页 1,.首先创建一个分页的工具类 package cn.page.po; import java.io.Serializable; public class Page impleme ...
- j2ee model1模型完成分页逻辑的实现 详解!
在显示用户全部信息的页面,在显示全部数据的时候,长长的滚动条,像是没有边界的天空一样, 让用户查看数据很不方便. 于是, 我们要把这些数据分页显示, 就像office的word一样,每页显示一定数量的 ...
随机推荐
- 【编译系统01】编译器 - 词法分析器(lexial)的设计思路
时间:2019/11/29 首先,词法分析器由一个扫描器与状态机组成. 一. 词法分析器整体设计流程 二.设计细节 1. code.txt: 我们假设读取下面文本 2.符号类型的设计 我们使用 enu ...
- ASP.NET中WebService的创建和部署以及通过反射动态调用WebService
一.在ASP.NET中创建WebService 首先我们先创建一个ASP.NET Web 应用程序,此处我们以VS2017为例 点击新创建的项目,右键添加新建项,选择Web服务,输入名称后点击添加 这 ...
- 【C#】学习笔记(1) Delegates,Events,Lambda Expressions
C#是跟着杨老师的教程走的,在这里感谢一下老师的无私奉献,他的cnblog地址:>cgzl,他的B站地址:>solenovex. 进入正题: Delegate表示委托,委托是一种数据结构, ...
- opencv::证件照背景替换
证件照背景替换 K-Means 背景融合 – 高斯模糊 遮罩层生成 #include <opencv2/opencv.hpp> #include <iostream> usin ...
- 执行插件的替代方式:用JS调用操作
关注本人微信和易信公众号: 微软动态CRM专家罗勇 ,回复229或者20161028可方便获取本文,同时可以在第一间得到我发布的最新的博文信息,follow me!我的网站是 www.luoyong. ...
- Xamarin.Forms iOS 真机测试 打包
等着打包过程中记录一下如何打一个debug包到真机上测试的流程1. 需要在XCode中创建一个新的项目,选择iOS==>Single View App,点击Next 2. 在新的弹框中需要App ...
- c语言的全排列
在c语言中实现全排列,对于刚接触c语言,还没学习算法的人来说,比较困难了吧.估计大佬也不会看这种基础的东西,全排列实现的办法很多,在c++中有一个专门的函数可以使用,但是在c中实现就有点困难了.如果你 ...
- [日常] gitlab创建用户并把用户加入项目
在gitlab里创建用户 默认密码是要求创建的用户自己去邮箱重置,也可以创建完成后直接点击编辑,就可以更改密码了 创建完用户,用户登录的时候需要去重置密码 创建完项目,就可以去使用了 也可以为这个项目 ...
- 解构如何运用的解构--报错 throw new TypeError('Router.use() requires a middleware function but got a ' + gettype(fn))
let aa={ error_code: 0, reason: "插入数据成功" };//如何拿到 error_code 和 reason 的值 let { error_code, ...
- bootstrap如何去除自带的样式----导航栏中的菜单实现平滑的过渡到对应的菜单区域-------动态跟换模态框中的内容
问题1:如何去除bootstap中css中自带的overflow:hidden这个样式 今天遇见在bootstap中轮播图上的 附带图 片不能够显示出来,图片始终有一部分的高度 被隐藏了 后来通 ...