使用Mybatis分页查询,数据库数据随时插入或更新,这时传统分页查询可能就会查询到重复数据,怎么办?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用Mybatis分页查询,数据库数据随时插入或更新,这时传统分页查询可能就会查询到重复数据,怎么办?相关的知识,希望对你有一定的参考价值。

参考技术A 通过主键id分页,而不是直接limit分页。

mybatis分页-RowBounds - 草稿

参考技术A MyBatis中使用RowBounds对查询结果集进行分页,具体操作过程:MyBatis可以使用RowBounds逐页加载表数据。RowBounds对象可以使用offset和limit参数来构建。参数offset表示开始位置,而limit表示要取的记录的数目

映射文件:

  <select id="findAllUsers" resultType="User">

            select id,name,gender from t_user

    </select>

映射接口中:

public List<User> findAllUsers(RowBounds rowBounds);

测试方法:

@Test

public void test_findAllUsers2()

            SqlSession sqlSession = null;

            try

                sqlSession = MyBatisSqlSessionFactory.openSession();   

                SpecialMapper mapper = sqlSession.getMapper(SpecialMapper.class);   

                //表示从第几条数据开始

                int offset = 0;

                //连续取出几条数据

                int limit = 5;

                RowBounds rowBounds = new RowBounds(offset, limit);

                List<User> list = mapper.findAllUsers(rowBounds); 

                list.forEach(System.out::println);   

            catch (Exception e)

                e.printStackTrace();

           



注意,若规定每页5条数据,要展示第二页,使用offset=5,limit=5

备注:通过以上例子,很明显的看出,在分页的时候,我们是把所有的数据都查询出来,然后通过RowBounds进行在内存分页.通过源码查看,也是通过ResuleSet结果集进行分页;

但是其实Mybatis的分页是基于内存的分页(查出所有记录再按偏移量和limit取结果),在大数据量的情况下这样的分页效率会很低,一般情况下我们会使用mybaits的分页辅助工具来完成分页

总结:

    1:逻辑分页 内存开销比较大,在数据量比较小的情况下效率比物理分页高;在数据量很大的情况下,内存开销过大,容易内存溢出,不建议使用

    2:物理分页 内存开销比较小,在数据量比较小的情况下效率比逻辑分页还是低,在数据量很大的情况下,建议使用物理分页

以上是关于使用Mybatis分页查询,数据库数据随时插入或更新,这时传统分页查询可能就会查询到重复数据,怎么办?的主要内容,如果未能解决你的问题,请参考以下文章

Mybatis同时传递实体和分页数据

Mybatis同时传递实体和分页数据

Mybatis 分页插件PageHelper 遇坑

Mybatis 分页插件PageHelper 遇坑

Mybatis实现分页查询

MyBatis Plus