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

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

分析:

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

原文地址:https://www.cnblogs.com/tassel/p/11623974.html

时间: 2024-11-08 05:33:58

SSM框架手动实现分页逻辑(非PageHelper)的相关文章

SSM框架下分页的实现(封装page.java和List&lt;?&gt;)

之前写过一篇博客  java分页的实现(后台工具类和前台jsp页面),介绍了分页的原理. 今天整合了Spring和SpringMVC和MyBatis,做了增删改查和分页,之前的逻辑都写在了Servlet里, 如今用了SSM框架,业务逻辑应该放在业务层(service), 这里有一个小问题:实现分页时,我们需要向页面中传两个参数: page对象(封装了页码,页容,总页数,总记录数,取得选择记录的初始位置) 集合对象(封装了bean类的信息) 也就是说,我们需要从service层获取到两个值,但是一

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

登录|注册     在路上 在路上,要懂得积累:在路上,要学会放下:我在路上!Stay hungry,Stay foolish. 目录视图 摘要视图 订阅 [公告]博客系统优化升级     [收藏]Html5 精品资源汇集     博乐招募开始啦 SSM框架——实现分页和搜索分页 标签: springMVC分页搜索分页mybatisssm 2014-05-21 11:09 5517人阅读 评论(9) 收藏 举报 分类: J2EE(9) 版权声明:本文为博主原创文章,欢迎转载,请注明地址. 目录(

SSM框架使用分页插件显示信息

1.在该SSM工程的pom.xml中加入PageHelper的分页插件依赖(若是版本号不对,可以尝试修改一下) 1 <!-- 分页插件 --> 2 <dependency> 3 <groupId>com.github.miemiedev</groupId> 4 <artifactId>mybatis-paginator</artifactId> 5 <version>1.2.15</version> 6 <

关于在SSM框架下使用PageHelper

很长一段时间里,我学习编程很少总结代码.后来代码总结也只是写在一个电脑里的文件夹,觉得与互联网脱轨了,哈哈哈,所以现在也准备写一写博客,记录自己,提高水平. 这是我的第一篇,也是关于SSM框架下使用PageHelper. 这里不具体写我做的项目课题的全部内容,主要专注于PageHelper部分 工程结构如下图: 首先在pom.xml(parking_dao模块下)引入PageHelper依赖 1 <?xml version="1.0" encoding="UTF-8&q

基于SSM框架贺州学院校园二手交易平台设计与实现

注:毕业有一段时间了,这里了做一下当年毕设的经验分享. 绪论 随着中国新四大发明的诞生,网购成了千千万万网友们购物的新方式,新的购物方式促进商业的发展,但随着人们生活水平的提高,许多新购置的物品用了没多少天,甚至没多少次就开始嫌弃.就开始不再使用,成为了闲置物品,大量的闲置物品已然爆发式增长. 在网购人群中,学生网购已经是非常常见,随着购物的便捷,学生们四年下来手里头有着太多的闲置的废旧物,一到大四毕业季,学生离校时都会丢弃一些学习资料和生活用具,这些闲置的废旧物造成校园垃圾增长,给环境保洁员工

日常开发系列——Maven+Spring+Spring MVC+MyBatis+MySQL整合SSM框架

进入公司开发已经3个多月了,项目用的是Maven+Spring+Spring MVC+MyBatis+MySQL,趁这个周末有空,仔细研读一下公司项目的基本框架,学习一下这个环境是怎么搭建起来的,经过自己的研究终于是成功地试验出来.自己亲手做的才算是自己学到的,决定将其记录下来,以便日后查询,源码同时也欢迎大家拍砖. 一.数据库的准备 这次整合试验想着做个简单的,就决定做一个普通的用户登陆,就一张表吧 我新建的数据库名字是test,然后新建了一张表 DROP TABLE IF EXISTS `u

实习小结(二)---SSM框架搭建

SSM项目框架搭建 前几天做了一个学生信息管理的项目,使用纯控制台输入,查询数据库,将信息在控制台中打印,功能完善得差不多之后,老师让将这个项目移植到Web中,使用Spring+SpringMVC+MyBatis将项目做成网页,借此机会熟悉一下SSM框架的搭建流程. 项目的目录结构如下: SSM框架搭建流程: 1.项目所需要的jar包 图片中的jar包可能一些多于的包,另外在开发中遇到没有导入的包的时候再去下载 2.配置文件 (1)web.xml <?xml version="1.0&qu

史上最简单的spring+springMVC+mybaits整合SSM框架~Simple-SSM

github地址: https://github.com/FaceGhost/Simple-SSM 起因来源于搭建ssm系列教程,为此整理一个最简单CURD的全套源码,高手请勿喷,仅供参考学习,想学习的同学的可以参考下列文章 教你一步步搭建ssm框架,第一步实现springmvc下的页面跳转 - 2018 教你一步步搭建ssm框架,第二步集成mybatis实现数据的保存 - 2018 教你一步步搭建ssm框架,第三步数据库事务验证及ssm常见事务不起作用排除 - 2018 教你一步步搭建ssm框

详解intellij idea搭建SSM框架(spring+maven+mybatis+mysql+junit)(上)

SSM(Spring+SpringMVC+MyBatis)框架集由Spring.SpringMVC.MyBatis三个开源框架整合而成,常作为数据源较简单的web项目的框架. 其中spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架. SpringMVC分离了控制器.模型对象.分派器以及处理程序对象的角色,这种分离让它们更容易进行定制. MyBatis是一个支持普通SQL查询,存储过程和高级映射的优秀持久层框架. 本文旨在快速且详细的介绍intellij idea 搭建SS