实现分页

作用:分页展示,减少数据的处理量

封装一个MyBatisUtils工具类

一、直接使用sql中的关键字limit(物理分页)

使用Mybatis实现分页,核心仍为SQL

  1. 写mybatis的接口UserMapper

    List<User> getUserByLimit(Map<String,Integer> map);
  2. 写Mapper.xml

    <select id="getUserByLimit" parameterType="map" resultType="user">
    select * from mybatis.users limit #{startIndex},#{pageSize}
    </select>
  3. 可以测试了

        @Autowire
    UserMapper mapper; //分页
    @Test
    public void getUserByLimit(){
    HashMap<String, Integer> map = new HashMap<String, Integer>();
    map.put("startIndex",0);//从第0个开始
    map.put("pageSize",10);//每页10个 List<User> userList = mapper.getUserByLimit(map);
    for (User user : userList) {
    System.out.println(user);
    }
    }
    }

二、逻辑分页

/**
* 逻辑分页
* @param list 全量数据
* @param pageNum 页码
* @papram pageSize 每页显示条数
*/
private Map<String, Object> getLogicPage(List list, int pageNum, int pageSize){
Map<String, Object> map = new HashMap<>();
int firstIndex = (pageNum -1) * pageSize;
int lastIndex = 0;
int total = 0;
List subList = null;
if(list == null || list.size() == 0) {
subList = new ArrayList<>();
}else {
if(firstIndex > list.size()-1 || firstIndex < 0) {
subList = new ArrayList<>();
}
lastIndex = pageNum * pageSize;
if(lastIndex > list.size()) {
lastIndex = list.size();
}
subList = list.subList(firstIndex, lastIndex);
}
map.put("total", total);
map.put("list", subList);
return map;
}

三、使用RowBounds分页

使用代码实现分页,不需要用SQL 逻辑分页

MyBatis使用RowBounds实现的分页是逻辑分页,也就是先把数据记录全部查询出来,然在再根据 offset 和 limit 截断记录返回,表示从第几条开始,取多少条。

数据量小时,RowBounds不失为一种好办法。但是数据量大时,实现拦截器就很有必要了。

  1. 写接口UserInfoDao

    //RowBounds分页
    List<UserInfo> queryAllUserByRowBounds(RowBounds rowBounds);
  2. 写mapper.xml配置文件

    <!--RowBounds分页-->
    <select id="queryAllUserByRowBounds" resultType="UserInfo">
    select * from userinfo
    </select>
  3. 可以测试了

        @Autowired
    UserInfoService userInfoService; @GetMapping("/listByRowBounds")
    public List<UserInfo> queryAllUserByRowBounds(@RequestParam(defaultValue = "1")Integer pageNum, @RequestParam(defaultValue = "10")Integer pageSize){
    return userInfoService.queryAllUserByRowBounds(new RowBounds((pageNum-1)*pageSize,pageSize));
    }

四、使用分页插件pageHelper(拦截器)

第一种:使用PageHelper

  1. 导入pagehelper依赖

    <!-- pagehelper 分页插件 -->
    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper</artifactId>
    <version>5.1.2</version>
    </dependency>
    <dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.3.0</version>
    </dependency>
  2. Dao层

    @Mapper
    public interface UserMapper{
    // 接口上添加分页参数必须是pageNum, pageSize 自动会分页
    @Select("select * from user")
    List<User> queryByPageHelper(@Param("pageNum")int pageNum, @Param("pageSize")int pageSize);
    }
  3. Service实现类

    @ApiOperation("使用PageHelper来进行分页")
    @GetMapping("/listByPageHelper")
    public void queryByPageHelper(@RequestParam(defaultValue = "1")Integer pageNum, @RequestParam(defaultValue = "10")Integer pageSize) {
    //利用PageHelper分页查询
    /**
    注意:这个一定要放查询语句的前一行,否则无法进行分页,因为它对紧随其后第一个sql语句有效
    */
    PageHelper.startPage(pageNum, pageSize);
    List<User> userList = userMapper.queryByPageHelper(pageNum,pageSize);
    PageInfo<User> pageInfo = new PageInfo<User>(userList);
    }

    第二种:不使用PageHelper,实用配置分页参数

    1. 配置文件

      #mybatis分页
      pagehelper:
      helper-dialect: mysql
      reasonable: true
      support-methods-arguments: true
      params: count=countSql
    2. Service实现类 直接查

      @ApiOperation("使用PageHelper来进行分页")
      @GetMapping("/listByPageHelper")
      public void queryByPageHelper(@RequestParam(defaultValue = "1")Integer pageNum, @RequestParam(defaultValue = "10")Integer pageSize) {
      //不使用PageHelper ,自动会在Mapper接口分页
      List<User> userList = userMapper.queryByPageHelper(pageNum, pageSize);
      }

    五、使用List的subList方法

List下的方法:

List<E> subList(int fromIndex, int toIndex);  //参数一:集合元素下标,参数二:第几个元素。。。

/*例如list.subList(0,2)  即为从下标0开始,取到第二个元素,结果为下标0,1的元素*/

分页算法简单使用:

public void queryBySubList(Integer pageNum,Integer pageSize) {
List<User> list = userMapper.queryByPage();
try {
list.subList(pageSize*(pageNum-1),pageSize*pageNum); //从下标0开始,找到第10个 即0-9
} catch (IndexOutOfBoundsException e) {
list.subList(pageSize*(pageNum-1),list.size()); //数组越界异常时,取到最后一个元素
}
PageInfo<User> pageInfo = new PageInfo<User>(userList);
}

Mybatis-Plus 自带的分页插件

    @AutoWire
BookMapper bookMapper;
/**
* 分页查询
*/
@Test
public void testSelectPage(){
//current 目前的
Page<Book> page=new Page<>(1,5);
bookMapper.selectPage(page, Wrappers.<Book>lambdaQuery().ge(Book::getBookId,2));
List<Book> record=page.getRecords();
record.forEach(System.out::println); //常用方法
// boolean hasNext=page.hasNext();
// boolean hasPrevious=page.hasPrevious();
// System.out.println(hasNext+" "+hasPrevious);
}

实现分页几种常见方式(SpringBoot)的更多相关文章

  1. 适用于app.config与web.config的ConfigUtil读写工具类 基于MongoDb官方C#驱动封装MongoDbCsharpHelper类(CRUD类) 基于ASP.NET WEB API实现分布式数据访问中间层(提供对数据库的CRUD) C# 实现AOP 的几种常见方式

    适用于app.config与web.config的ConfigUtil读写工具类   之前文章:<两种读写配置文件的方案(app.config与web.config通用)>,现在重新整理一 ...

  2. C# DataGridView绑定数据源的几种常见方式

    开始以前,先认识一下WinForm控件数据绑定的两种形式,简单数据绑定和复杂数据绑定. 1. 简单的数据绑定 例1 using (SqlConnection conn = new SqlConnect ...

  3. jedis操作redis的几种常见方式总结

    Redis是一个著名的key-value存储系统,也是nosql中的最常见的一种,这篇文章主要给大家总结了关于在java中jedis操作redis的几种常见方式,文中给出了详细的示例代码供大家参考学习 ...

  4. Tomcat 部署项目的几种常见方式

    转自:https://www.cnblogs.com/yuht/p/5714624.html https://www.cnblogs.com/ysocean/p/6893446.html Tomcat ...

  5. 恶意软件开发——shellcode执行的几种常见方式

    一.什么是shellcode? shellcode是一小段代码,用于利用软件漏洞作为有效载荷.它之所以被称为"shellcode",是因为它通常启动一个命令shell,攻击者可以从 ...

  6. C# 实现AOP 的几种常见方式

    AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的中统一处理业务逻辑的一种技术,比较常见的场景是:日志记录,错误捕获 ...

  7. Azure登陆的两种常见方式(user 和 service principal登陆)

    通过Powershell 登陆Azure(Azure MoonCake为例)一般常见的有两种方式 1. 用户交互式登陆 前提条件:有一个AAD account 此种登陆方式会弹出一个登陆框,让你输入一 ...

  8. Tomcat部署项目的几种常见方式

    以前学习的时候只知道在Eclipse或者MyEclipse中发布项目到Tomcat,最近实习时发现不同的项目还有不同的发布方式,所以特地学习了Tomcat发布项目的方式,在此记录下来. 1 直接将we ...

  9. web实现数据交互的几种常见方式

    前言 在当今社会,作为一名前端程序猿,并不是一昧的去制作静态页面就可以满足滴:你说你会制作网页,好吧,只能说你算是一个前端程序猿.但这是你作为一个程序猿最基本的能力,并不会为你进行加分: 我们都明白, ...

  10. SQL判断NULL的几种常见方式

    第一种 where XX ='NULL' ,XX字段存的值就是NULL这四个字符, 第二种 where XX is null ,XX字段什么也没存,这是数据库的判断语法, 第三种 where isnu ...

随机推荐

  1. 对于 emlog pro 目前 avatar 头像不显示的问题,暂时使用这个方法解决

    avatar 头像 cdn 不稳定,目前 emlog 官方还没有放出更新包.因此,现在使用 JS 的方式暂时解决. 代码如下 <script> const avaUrl = 'https: ...

  2. Golang 语言学习路线

    学习Go语言是一个很好的选择,它具有高效的编译速度.强大的并发支持和简洁的语法.适用于初学者的Golang学习路线: 1. 学习基础: 安装Go:从官方网站下载并安装Go语言的最新版本. Hello, ...

  3. 泛型--java进阶day10

    1.泛型 2.泛型--统一数据类型 如下图,当我们在泛型中添加不同的数据类型,add方法需要的数据类型也随之改变 [1] [2] 泛型--默认类型object 当我们不指定泛型时,泛型的默认类型为ob ...

  4. el-tree 动态图标

    举个栗子 https://jsfiddle.net/taadis/x9crjsum/ https://jsrun.net/MYXKp - 上面看不了的,可以看这个...

  5. golang的条件编译

    写c/c++或者rust的开发者应该对条件编译不陌生,条件编译顾名思义就是在编译时让代码中的一部分生效或者失效,从而控制编译时的代码执行路径,进而影响编译出来的程序的行为. 这有啥用呢?通常在编写跨平 ...

  6. Modernize DevOps

    https://www.harness.io/ Continuous Delivery and gitops: while CD automates application deployment, G ...

  7. Python科学计算系列11—几何绘图

    1.显函数图像绘制 例:绘制y=sinx的图像 代码如下: from sympy import * x = symbols('x') plot(sin(x), (x, -2 * pi, 2 * pi) ...

  8. 使用 StreamJsonRpc 在 ASP.NET Core 中启用 JSON-RPC

    StreamJsonRpc 是微软开发的一个开源库,用于在 .NET 平台中实现基于 JSON-RPC 2.0 规范 的远程过程调用(RPC).它通过流(如管道.网络流等)实现高效的跨进程或跨网络通信 ...

  9. MySQL 插入一条 SQL 语句,redo log 记录的是什么?

    MySQL 插入一条 SQL 语句,redo log 记录的内容 在 MySQL 的 InnoDB 存储引擎中,redo log(重做日志)主要用来保证事务的持久性和崩溃恢复能力.redo log 记 ...

  10. 深度解析大厂vue 高频面试题(附答案)

    @charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...