第一种方法:查询出所有数据再分页

分析:

  1. 分页时,需要获得前台传来的两个参数,分别为pageNo(第几页数据),pageSize(每页的条数);
  2. 根据这两个参数来计算出前端需要的数据是查出数据list中的开始索引和结束索引;
  3. 利用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分页参考:

    Mysql复杂查询

    【MySQL】条件查询之排序聚合分组分页查询

实现过程

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

<?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查询,因为此种查询方法更加符合分页逻辑的实现,每次只查询需要的数据,而不是每次都要查询所有数据,故效率更高。
  • 有问题可以一起交流:

SSM手动实现分页逻辑---非PageHelper方式的更多相关文章

  1. SSM框架手动实现分页逻辑(非PageHelper)

    第一种方法:查询出所有数据再分页 分析: 分页时,需要获得前台传来的两个参数,分别为pageNo(第几页数据),pageSize(每页的条数); 根据这两个参数来计算出前端需要的数据是查出数据list ...

  2. SSM框架——实现分页和搜索分页

    登录|注册     在路上 在路上,要懂得积累:在路上,要学会放下:我在路上!Stay hungry,Stay foolish.       目录视图 摘要视图 订阅 [公告]博客系统优化升级     ...

  3. 利用WPF建立自己的3d gis软件(非axhost方式)(七)实现简单的粒子效果

    原文:利用WPF建立自己的3d gis软件(非axhost方式)(七)实现简单的粒子效果 先下载SDK:https://pan.baidu.com/s/1M9kBS6ouUwLfrt0zV0bPew密 ...

  4. MySQL高效分页-mybatis插件PageHelper改进

    MySQL分页在表比较大的时候,分页就会出现性能问题,MySQL的分页逻辑如下:比如select * from user limit 100000,10 它是先执行select * from user ...

  5. Java项目开发中实现分页的三种方式一篇包会

    前言   Java项目开发中经常要用到分页功能,现在普遍使用SpringBoot进行快速开发,而数据层主要整合SpringDataJPA和MyBatis两种框架,这两种框架都提供了相应的分页工具,使用 ...

  6. SpringMVC中注解和非注解方式下的映射器和适配器总结

    1. 非注解方式 1.1 处理器适配器 上一节中使用的处理器适配器是:org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapte ...

  7. 11g使用非duplicate方式创建物理standby要注意的问题总结

    在上篇博文中,使用了duplicate方式来创建物理standby http://blog.csdn.net/aaron8219/article/details/38434579 今天来说说在11g中 ...

  8. SSM框架实现分页

    SSM框架实现分页 1,.首先创建一个分页的工具类 package cn.page.po; import java.io.Serializable; public class Page impleme ...

  9. j2ee model1模型完成分页逻辑的实现 详解!

    在显示用户全部信息的页面,在显示全部数据的时候,长长的滚动条,像是没有边界的天空一样, 让用户查看数据很不方便. 于是, 我们要把这些数据分页显示, 就像office的word一样,每页显示一定数量的 ...

随机推荐

  1. Elasticsearch Query DSL 语言介绍

    目录 0. 引言 1. 组合查询 2. 全文搜索 2.1 Match 2.2 Match Phase 2.3 Multi Match 2.4 Query String 2.5 Simple Query ...

  2. 诚聘.NET架构师、高级开发工程师(2019年8月29日发布)

    招聘单位是ABP架构设计交流群(134710707)群主阳铭所在的公司 公司简介 七二四科技有限公司成立于2015年,成立之初便由金茂资本按估值2亿投资2200万,进行“健康724”平台搭建,2017 ...

  3. Gallery -- 横向不断滚动 demo

    <%@ Page Language="C#" AutoEventWireup="true" %> <!DOCTYPE html> < ...

  4. 史上最全Winform中使用ZedGraph教程与资源汇总整理(附资源下载)

    场景 C#窗体应用中使用ZedGraph曲线插件绘制图表: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/99716066 Win ...

  5. crm-3权限

    1.权限基本实现 rbac: rbac基于角色的权限控制 ,权限本质就是url 权限表: url列表 角色表: 一个角色固定访问一些url的地址 用户表: 用户可以绑定角色 ,用户拥有了角色的权限 生 ...

  6. vue学习笔记(一): 建立 vue-cli 初始网站

    在安装vue-cli之前,要先安装node.js这个大家百度一下就可以了 1.安装 vue-cli npm install -g @vue/cli-init 2.初始化一个项目,名为 hcmanage ...

  7. js中for循环的研究

    转自:http://blog.csdn.net/lushuaiyin/article/details/8541500 <html> <body> <b><ce ...

  8. 微信小程序动画之圆形进度条

    微信小程序动画之圆形进度条 上图: js: //获取应用实例 var app = getApp() var interval; var varName; var ctx = wx.createCanv ...

  9. 【LeetCode】746. 使用最小花费爬楼梯

    使用最小花费爬楼梯 数组的每个索引做为一个阶梯,第 i个阶梯对应着一个非负数的体力花费值 cost[i](索引从0开始). 每当你爬上一个阶梯你都要花费对应的体力花费值,然后你可以选择继续爬一个阶梯或 ...

  10. [b0021] python 归纳 (七)_获得进程和线程信息

    # -*- coding: utf-8 -*- """ 获得线程, 进程 ID,NAME 总结: """ import threading ...