RowBounds实现分页[通俗易懂]

2022-11-08 20:45:57 浏览数 (1)

大家好,又见面了,我是你们的朋友全栈君。

文章目录
  • RowBounds原理
  • RowBounds使用
    • 1、接口
    • 2、mapper.xml
    • 3、测试
  • RowBounds大坑

RowBounds原理

  • Mybatis可以通过传递RowBounds对象,来进行数据库数据的分页操作,然而遗憾的是,该分页操作是对ResultSet结果集进行分页,也就是人们常说的逻辑分页,而非物理分页(物理分页当然就是我们在sql语句中指定limit和offset值)。
  • 不再使用SQL实现分页

RowBounds使用

1、接口

代码语言:javascript复制
List<Map> getUserByRowBounds(Map<String,Integer> map);

2、mapper.xml

代码语言:javascript复制
 <!--分页-->
    <select id="getUserByRowBounds" parameterType="map" resultType="map" >
        select *
        from mybatis01.user ;
    </select>

3、测试

代码语言:javascript复制
 @Test
public void getUserByRowBounds(){ 

SqlSession sqlSession = MybatisUtil.getSqlSession();
UserMapper mapper = sqlSession.getMapper(UserMapper.class);
//RowBounds实现
RowBounds rowBounds = new RowBounds(1,2);
//通过java代码层面实现分页
List<Map> userList = sqlSession.selectList("com.jin.mapper.UserMapper.getUserByRowBounds", null, rowBounds);
for (Map map1 : userList) { 

System.out.println(map1);
}
sqlSession.close();
}

RowBounds大坑

RowBounds是将所有符合条件的数据全都查询到内存中,然后在内存中对数据进行分页 如我们查询user表中id>0的数据,然后分页查询sql如下:

代码语言:javascript复制
select * from user where id >0 limit 3,10

但使用RowBounds后,会将id>0的所有数据都加载到内存中,然后跳过offset=3条数据,截取10条数据出来,若id>0的数据有100万,则100w数据都会被加载到内存中,从而造成内存OOM

所以当数据量非常大时,一定要慎用RowBounds类。切记!切记

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/190728.html原文链接:https://javaforall.cn

0 人点赞