实现分页

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

封装一个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. Nginx 之fastcgi常用配置项说明

    在LNMP环境中,我们都知道nginx如果要解析php脚本语言,就必须通过配置fastcgi模块来提供对php支持,那么在配置fastcgi的时候,关于fastcgi配置项的值应该怎么设置才能让其发挥 ...

  2. mysql [Err] 1067 - Invalid default value for

    出错原因 mysql5.7版本引起的默认值不兼容的问题,同样的问题在mysql8.0可能也会出现. 出问题的值有: NO_ZERO_IN_DATE 在严格模式下,不允许日期和月份为零. NO_ZERO ...

  3. 手把手教你下载b站视频并生成音频字幕

    1.下载b站视频: 可以直接使用https://bilibili.iiilab.com/ 贴进去网址就能下载了 2.提取音频 可以使用 ffmpeg 将音频文件提取出来(ffmpeg直接去官网下载即可 ...

  4. dotnet 源代码生成器分析器入门

    本文将带领大家入门 dotnet 的 SourceGenerator 源代码生成器技术,期待大家阅读完本文能够看懂理解和编写源代码生成器和分析器 恭喜你看到了本文,进入到 C# dotnet 的深水区 ...

  5. Vim 操作-替换

    Vim 操作-替换 substitute :[range]s[ubstitute]/{pattern}/{string}/{flag} 替换的操作范围以行为基础: %-全局范围,m,n-使用逗号隔开的 ...

  6. 从 sum 求和谈 axis=1 or 0

    二维数组 axis=0:表示从上往下 axis=1:表示从左往右 temp = np.array([[1, 2], [3, 4]]) print("原矩阵数组:\n",temp) ...

  7. 必看!2025 年颠覆测试行业的 10 大 AI 自动化测试工具/平台(上篇)

    大家好,我是狂师. 上周小孩子生病,住院照顾,停更了几天. 各位看官,等着急了吧,之前有粉丝后台留言,想了解学习一下,AI这么火爆,那市面上AI与自动化测试结合起来的有哪些推荐的工具/平台. 今天就这 ...

  8. 【Maven】POM基本概念

    目前的技术在开发中存在的问题: 一个项目就是一个工程 如果项目非常庞大,就不适合继续使用 package 来划分模块.最好是每一个模块对应一个工程,利于分工协作. 借助于 Maven 就可以将一个项目 ...

  9. SLAM在机器人中的应用

    SLAM在机器人中的应用​ 伴随着人工智能.机器人.无人驾驶等技术的蓬勃发展,越来越多的相关智能产品出现在了我们的日常生活中,作为底层技术基石之一的SLAM也逐渐被大家所熟知.下面通过"机器 ...

  10. 重生之我是操作系统(五)----CPU调度

    简介 当CPU有大量任务要处理,但由于资源有限,无法同时处理.所有就需要某种规则来决定任务处理的顺序,这就是调度. 调度层次 根据调度频率与层次,共分为三种 高级调度 也称为作业调度(Long-Tre ...