LIMIT关键字

  1. mapper代码
<select id="selectByPageInfo" resultMap="BaseResult">select * from tb_user limit #{pageNo}, #{pageSize}
</select>
  1. 业务层直接调用
public List<User> findByPageInfo(PageInfo info) {return userMapper.selectByPageInfo(info);}

3,优点

灵活性高,可优化空间大mysql分页语句优化

4,缺点

实现复杂。

RowBounds实现分页

Mybatis提供RowBounds类来实现逻辑分页。RowBounds中有2个字段offset和limit。这种方式获取所有的ResultSet,从ResultSet中的offset位置开始获取limit个记录。但这并不意味着JDBC驱动器会将所有的ResultSet存放在内存,实际上只加载小部分数据到内存,如果需要,再加载部分数据到内存。

  1. mapper代码
<select id="selectPage" resultType="com.example.demo.mapper.one.User">select * from user</select>
  1. dao代码
List<User> selectPage(RowBounds rowBounds);
  1. 分页查询
List<User> users = userMapper.selectPage(new RowBounds(5, 10));log.info("users:{}",users);

查询结果:

users:[User(id=6, username=柳云璇, grade=小三(5)班, age=25, phone=17358053274, sex=女), User(id=7, username=酆雨寒, grade=高一(5)班, age=19, phone=15394214112, sex=女), User(id=8, username=郑春阳, grade=小三(7)班, age=24, phone=15004202411, sex=男)]
  1. 优点

使用起来比直接limit简单。

5,缺点
DB压力比较大,因为将结果暂存在db了。

Interceptor实现

  1. 自定义Interceptor
@Intercepts({@Signature(type = StatementHandler.class, method = "prepare", args = {Connection.class, Integer.class})})
public class DefinedPageInterceptor implements Interceptor {@Overridepublic Object intercept(Invocation invocation) throws Throwable {//获取StatementHandler,默认的是RoutingStatementHandlerStatementHandler statementHandler = (StatementHandler) invocation.getTarget();//获取StatementHandler的包装类MetaObject metaObject = SystemMetaObject.forObject(statementHandler);//分隔代理对象while (metaObject.hasGetter("h")) {Object obj = metaObject.getValue("h");metaObject = SystemMetaObject.forObject(obj);}while (metaObject.hasGetter("target")) {Object obj = metaObject.getValue("target");metaObject = SystemMetaObject.forObject(obj);}//获取查看接口映射的相关信息MappedStatement mappedStatement = (MappedStatement) metaObject.getValue("delegate.mappedStatement");String mapId = mappedStatement.getId();//拦截以ByInterceptor结尾的请求,统一实现分页if (mapId.matches(".+ByInterceptor$")) {System.out.println("LOG:已触发分页拦截器");//获取进行数据库操作时管理参数的HandlerParameterHandler parameterHandler = (ParameterHandler) metaObject.getValue("delegate.parameterHandler");// 分页对象需要自己构建,到时候分页方法中要传入 //获取请求时的参数PageInfo info = (PageInfo) parameterHandler.getParameterObject();//获取原始SQL语句String originalSql = (String) metaObject.getValue("delegate.boundSql.sql");//构建分页功能的SQL语句String sql = originalSql.trim() + " limit " + info.getPageNum() + ", " + info.getPageSize();metaObject.setValue("delegate.boundSql.sql", sql);}//调用原对象方法,进入责任链下一级return invocation.proceed();}@Overridepublic Object plugin(Object target) {//生成Object对象的动态代理对象return Plugin.wrap(target, this);}@Overridepublic void setProperties(Properties properties) {//如果分页每页数量是统一的,可以在这里进行统一配置,也就无需再传入PageInfo信息了}
}
  1. 添加到mybatis中
@Bean("oneSqlSessionFactory")public SqlSessionFactory sqlSessionFactory() {SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();sqlSessionFactoryBean.setDataSource(dataSource);try {sqlSessionFactoryBean.setMapperLocations(// 设置mybatis的xml所在位置new PathMatchingResourcePatternResolver().getResources("classpath*:mapping/one/*Mapper.xml"));//设置自定义的插件sqlSessionFactoryBean.setPlugins(new DefinedPageInterceptor());return sqlSessionFactoryBean.getObject();} catch (Exception e) {return null;}}
  1. mapper方法
/*** Interceptor 实现分页,必须以ByInterceptor结构,自定义的Interceptor才能* 识别出来,并且必须传入PageInfo* @param pageInfo 自定义的分页* @return*/List<User> selectPageByInterceptor(PageInfo pageInfo);

xml

<select id="selectPageByInterceptor" resultType="com.example.demo.mapper.one.User">select * from user</select>
  1. 运行
/*** 自定义PageInterceptor分页*/@Testpublic void test04() {PageInfo pageInfo=new PageInfo();pageInfo.setPageNum(5);pageInfo.setPageSize(5);List<User> users = userMapper.selectPageByInterceptor(pageInfo);log.info("users:{}",users);}

拦截更改后的sql。

  1. 运行结果
users:[User(id=6, username=柳云璇, grade=小三(5)班, age=25, phone=17358053274, sex=女), User(id=7, username=酆雨寒, grade=高一(5)班, age=19, phone=15394214112, sex=女), User(id=8, username=郑春阳, grade=小三(7)班, age=24, phone=15004202411, sex=男)]

PageHelper

PageHelper是一个第三方实现的分页拦截器插件,使用起来灵活且方便。

  1. 添加pom
<dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper</artifactId><version>最新版本</version>
</dependency>

2,使用方式

//第一种,RowBounds方式的调用
List<User> list = sqlSession.selectList("x.y.selectIf", null, new RowBounds(0, 10));//第二种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.startPage(1, 10);
List<User> list = userMapper.selectIf(1);//第三种,Mapper接口方式的调用,推荐这种使用方式。
PageHelper.offsetPage(1, 10);
List<User> list = userMapper.selectIf(1);//第四种,参数方法调用
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {List<User> selectByPageNumSize(@Param("user") User user,@Param("pageNum") int pageNum, @Param("pageSize") int pageSize);
}
//配置supportMethodsArguments=true
//在代码中直接调用:
List<User> list = userMapper.selectByPageNumSize(user, 1, 10);//第五种,参数对象
//如果 pageNum 和 pageSize 存在于 User 对象中,只要参数有值,也会被分页
//有如下 User 对象
public class User {//其他fields//下面两个参数名和 params 配置的名字一致private Integer pageNum;private Integer pageSize;
}
//存在以下 Mapper 接口方法,你不需要在 xml 处理后两个参数
public interface CountryMapper {List<User> selectByPageNumSize(User user);
}
//当 user 中的 pageNum!= null && pageSize!= null 时,会自动分页
List<User> list = userMapper.selectByPageNumSize(user);//第六种,ISelect 接口方式
//jdk6,7用法,创建接口
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(new ISelect() {@Overridepublic void doSelect() {userMapper.selectGroupBy();}
});
//jdk8 lambda用法
Page<User> page = PageHelper.startPage(1, 10).doSelectPage(()-> userMapper.selectGroupBy());//也可以直接返回PageInfo,注意doSelectPageInfo方法和doSelectPage
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(new ISelect() {@Overridepublic void doSelect() {userMapper.selectGroupBy();}
});
//对应的lambda用法
pageInfo = PageHelper.startPage(1, 10).doSelectPageInfo(() -> userMapper.selectGroupBy());//count查询,返回一个查询语句的count数
long total = PageHelper.count(new ISelect() {@Overridepublic void doSelect() {userMapper.selectLike(user);}
});
//lambda
total = PageHelper.count(()->userMapper.selectLike(user));
  1. 官网

官网:https://pagehelper.github.io/

使用方式:https://github.com/pagehelper/Mybatis-PageHelper/blob/master/wikis/zh/HowToUse.md

来源:https://haitao.blog.csdn.net/article/details/120195945?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-120195945-blog-109134466.pc_relevant_multi_platform_whitelistv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-120195945-blog-109134466.pc_relevant_multi_platform_whitelistv1&utm_relevant_index=5

Mybatis的四种分页方式详解相关推荐

  1. Bitmap 的四种压缩方式详解

    本文介绍了 Bitmap 压缩的四种方式,相关代码可见:Githhub-GdTestHub 文章目录 一.质量压缩 二.采样率 三.缩放法 四.RGB_565 Android 中图片是以 bitmap ...

  2. 自平衡二叉树(AVL)及四种旋转方式详解

    推荐可视化插入.删除节点的二叉树网站:AVL Tree Visualzation (usfca.edu) 1. 概述 AVL树是一种自平衡二叉搜索树,他是搜索二叉树(BST)的优化,它在每次插入或删除 ...

  3. Mybatis的5种分页方式

    <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE mapperPUBLIC "-/ ...

  4. PCBA加工中常见的两种焊接方式详解

    PCBA加工中常见的两种焊接方式详解 PCBA加工,两种常见的焊接方式就是回流焊和波峰焊,与手动焊接技术相比,自动焊接技术具有减少人为因素的影响.提高效率.降低成本.提高质量等优势,在PCBA加工中, ...

  5. 文件服务器文件多备份方案,FileYee数据备份四种备份方案详解

    原标题:FileYee数据备份四种备份方案详解 其实有很多用户对FileYee数据备份软件不是特别熟悉,今天小编带大家了解一下FileYee的四种备份方案,一定会让大家对于数据备份有一个新的了解. 之 ...

  6. C++的三种继承方式详解

    文章目录 @[toc] C++的三种继承方式详解以及区别 前言 一.public继承 二.protected继承 三.private继承 四.三者区别 五.总结 后话 C++的三种继承方式详解以及区别 ...

  7. sqlserver的四种分页方式

    第一种:ROW_NUMBER() OVER()方式 select * from ( select *, ROW_NUMBER() OVER(Order by ArtistId ) AS RowId f ...

  8. @Resource,@Autowired,@Inject3种注入方式详解

    转载自 @Resource,@Autowired,@Inject3种注入方式详解 概况 @Resource,@Autowired,@Inject 这3种都是用来注入bean的,它们属于不同的程序中. ...

  9. mvc ajax提交html标签,Mvc提交表单的四种方法全程详解

    Mvc提交表单的四种方法全程详解 2019-01-05 编程之家 https://www.jb51.cc 编程之家收集整理的这篇文章主要介绍了Mvc提交表单的四种方法全程详解,编程之家小编觉得挺不错的 ...

最新文章

  1. 求二叉树第K层的节点个数+求二叉树叶子节点的个数
  2. 推荐.NET CF控件(Resco MobileForms Toolkit)
  3. PyTorch 实现 GAN 生成式对抗网络 含代码
  4. Andorid之BINDSERVICE的使用方法总结
  5. 小米某员工向供应商索要大额好处费 已被公安拘捕
  6. 从一个微型例子看“C/C++的内存分配机制”和“数组变量名与指针变量名”
  7. VMware View4.5相关组件的日志存放路径
  8. 2018-4-18 Linux学习笔记
  9. 文强+光裕+唐骏,告诉我们什么?
  10. 计算机病毒影响打印机,病毒捣乱影响网络打印机共享打印
  11. 网卡TSO、UFO、GSO、LRO、GRO和RSS介绍
  12. python等高线绘制_用matplotlib画等高线图详解
  13. 怎么用matlab画误差椭圆,基于MATLAB的导线网平差软件设计及误差椭圆的绘制.docx...
  14. Prometheus监控报警系统
  15. zookeeper羊群效应
  16. 将DXP设置为中文版
  17. android官方夜间模式,Android实现夜间模式的方法(一)
  18. 脉冲星测时软件TEMPO2安装
  19. 前端最有成就感一—-封装
  20. Linux问题:Cannot prepare internal mirrorlist: No URLs in mirrorlist

热门文章

  1. Ol3中Map事件全解析
  2. TensorFlow学习(11)——卷积神经网络
  3. pdf加密文件怎么加密
  4. 「TCG 规范解读」初识嵌入式和工业工作组
  5. 排序算法整理(冒泡、选择、快排、堆排序、希尔、归并)
  6. 为什么说微博、微信、贴吧、头条们都在做同一件事?
  7. 对token(令牌)的理解
  8. 计算机磁盘怎么更改,如何对电脑中的磁盘盘符号进行修改?
  9. c语言atol是什么缩写,C语言atol函数的可移植版本疑问
  10. chrome extension 拓展插件添加google analytics统计