mybatis逻辑分页与物理分页

  最近在搭建springboot框架的时候,构建ORM的时候,选择mybatis的时候,我们一般时候用:

      1.mybatis自带的分页RowBounds;

       2.mybatis插件或者直接书写sql进行分页;

          (1).通过自己的封装SQL根据beginNum(开始条数)和endNum(需要的条数)来进行分页

           (2).PageHelper分页插件


     --> mybatis自带分页RowBounds:   //逻辑分页

      Java:   

        RowBounds rb=new RowBounds(offset, limit);  //offset(从多少条开始);limit(获取多少条)

       SqlSession sqlSession=sqlSessionFactory.openSession();//sqlSessionFactory通过读取mybatis配置文件的输入流然后通过new SqlSeesionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));最终得到SqlSessionFactory;

         List<Student> studentlist=sqlSession.selectList("xx.xx.Mapper.findStudent",null,rb);//第一个参数为具体Mapper文件的下的findStudent的ID,第二个参数为提供的条件参数,第三个参数为我们要进行对获取学生进行分页

         sqlSession.close();

         return studentlist;

      Mapper:   

        <select id="findStudent" resultType="Student">

            select * from Student

         </select>

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



      --> mybatis自写sql或者通过分页插件PageHelper:   //物理分页

        (1).mybatis PageHelper分页插件 

        Mapper:

            <select id="findStudent" resultType="Student">

                select * from Student

           </select>

        Dao层-StudentDao:

            List<Student> findStudent();

        Service层:

             PageHelper.startPage(pageNum,pageSize);//pageNum 页数  pageSize 数量

           List<Student> stu=studentDao.findStudent();  //studentDao @Autowried注解获取; 在执行查询数据时,就会自动执行2个sql;执行上述Mapper下的ID为findStudent的sql 自动执行分页,通过PageHelper进行识别是何数据库拼接分页语句,若是mysql,自动通过limit分页,若是oracle自动通过rownum进行分页,另一个会自动拼接Mapper下不存在的ID为findStudent_COUNT,查询的总数;可以通过打印的日志进行跟踪;

           PageInfo<Student> page = new PageInfo<Student>(stu); //自动封装总数count以及分页,数据返回页面

           return page;//返回分页之后的数据


      (2).mybatis 自行使用SQL进行分页

            例:     

           SQL代码(mysql数据库):

               A:select * from Student  LIMIT #{beginNum,jdbcType=INTEGER},#{endNum,jdbcType=INTEGER}    //beginNum开始条数;endNum需要的条数

            

                B:select count(0) from Student

           JAVA:

                Map<String,Object> map=new HashMap<String,Object>();

                 map.put("beginNum",beginNum); 

                map.put("endNum",endNum);  //从第beginNum条开始,读取后面endNum条

                List<Student> studentlist=studentDao.findStudent(Map<String,Object> map);  //studentDao学生dao层

                 Integer count=studentDao.count();//获取总数返回页面

                 //需要手动进行封装总数以及分页信息,数据返回页面;       

        备注:查看如上例子代码,我们就发现了是直接通过SQL进行在数据库中直接分页,得到的数据就是我们想要分页之后的数据,就是物理分页;

 

    总结:

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

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

   



  • 9
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值