您好、欢迎来到现金彩票网!
当前位置:打鱼棋牌游戏平台 > 物理分页 >

MyBatis - 分页之四大方式(数组、SQL、RowBounds)

发布时间:2019-07-31 06:59 来源:未知 编辑:admin

  前言:学习hibernate & mybatis等持久层框架的时候,不外乎对数据库的增删改查操作。而使用最多的当是数据库的查找操作, 而当数据库数据过多时,符合查找条件的数据可能也会是很庞大的数据。往往在这个时候,我们都不会希望一次性的将所有的数据一起性读取出来,并且显示在UI界面上。常用的操作,就是对查找到的数据进行分页,每次处理小部分数据。这样每次处理的数据量就会在可控的范围,UI的展示也会很协调。

  问题:面对上面的问题,今天我们就来进行基于mybatis和MySql进行分页功能的实现。常见的数据分页有哪几种实现??基于数组的分页实现?基于sql语句的分页实现?还是通过进行数据分页功能?还是通过RowBounds参数进行物理分页?几种都是常用的分页实现原理,接下来就按照数组、sql语句,和RowBounds的方式介绍分页功能。

  原理:进行数据库查询操作时,获取到数据库中所有满足条件的记录,保存在应用的临时数组中,再通过List的subList方法,获取到满足条件的所有记录。

  首先在dao层,创建StudentMapper接口,用于对数据库的操作。在接口中定义通过数组分页的查询方法,如下所示:

  可以看出再编写sql语句的时候,我们并没有作任何分页的相关操作。这里是查询到所有的学生信息。

  通过接收currPage参数表示显示第几页的数据,pageSize表示每页显示的数据条数。

  接下来在浏览器输入测试实现了分页后的数据。获取第一页的数据,每页显示两条数据。

  输出的是指定的从第0-2条数据,可见我们通过数组分页的功能是成功的。(这里因为用到了关联查询,所以看起来数据可能比较多)

  数据库查询并返回所有的数据,而我们需要的只是极少数符合要求的数据。当数据量少时,还可以接受。当数据库数据量过大时,每次查询对数据库和程序的性能都会产生极大的影响。

  在了解到通过数组分页的缺陷后,我们发现不能每次都对数据库中的所有数据都检索。然后在程序中对获取到的大量数据进行二次操作,这样对空间和性能都是极大的损耗。所以我们希望能直接在数据库语言中只检索符合条件的记录,不需要在通过程序对其作处理。这时,Sql语句分页技术横空出世。

  通过sql语句实现分页也是非常简单的,只是需要改变我们查询的语句就能实现了,即在sql语句后面添加limit分页语句。

  首先还是在StudentMapper接口中添加sql语句查询的方法,如下:

  所以在service中计算出currIndex:要开始查询的第一条记录的索引。

  从输出结果可以看出和数组分页的结果是一致的,因此sql语句的分页也是没问题的。

  虽然这里实现了按需查找,每次检索得到的是指定的数据。但是每次在分页的时候都需要去编写limit语句,很冗余。而且不方便统一管理,维护性较差。所以我们希望能够有一种更方便的分页实现。

  上面提到的数组分页和sql语句分页都不是我们今天讲解的重点,今天需要实现的是利用达到分页的效果。自定义实现了拦截所有以ByPage结尾的查询语句,并且利用获取到的分页相关参数统一在sql语句后面加上limit分页的相关语句,一劳永逸。不再需要在每个语句中单独去配置分页相关的参数了。

  首先我们看一下的具体实现,在这里我们需要拦截所有以ByPage结尾的所有查询语句,因此要使用该实现分页功能,那么再定义名称的时候需要满足它拦截的规则(以ByPage结尾),如下所示:

  上面即是功能的实现,在intercept方法中获取到select标签和sql语句的相关信息,拦截所有以ByPage结尾的select查询,并且统一在查询语句后面添加limit分页的相关语句,统一实现分页功能。

  MetaObject:mybatis的一个工具类,方便我们有效的读取或修改一些重要对象的属性。四大对象(ResultSetHandler,ParameterHandler,Executor和statementHandler)提供的公共方法很少,要想直接获取里面属性的值很困难,但是可以通过MetaObject利用一些技术(内部反射实现)很轻松的读取或修改里面的数据。

  MappedStatement是保存了xxMapper.xml中一个sql语句节点的所有信息的包装类,可以通过它获取到节点中的所有信息。在示例中我们拿到了id值,也就是方法的名称,通过名称区拦截所有需要分页的请求。

  Executor:执行Sql的全过程,包括组装参数、组装结果和执行Sql的过程。

  编写好后,需要注册到项目中,才能发挥它的作用。在mybatis的配置文件中,添加如下代码:

  如上所示,还能在里面配置一些属性,在的setProperties方法中可以获取配置好的属性值。如项目分页的pageSize参数的值固定,我们就可以配置在这里了,以后就不需要每次传入pageSize了,读取方式如下:

  到这里,有关的相关知识就讲解的差不多了,接下来就需要测试,是否我们这样写真的有效?

  首先还是添加dao层的方法和xml文件的sql语句配置,注意项目中拦截的是以ByPage结尾的请求,所以在这里,我们的方法名称也以此结尾:

  这里我们虽然传入了currPage和pageSize两个参数,但是在sql的xml文件中并没有使用,直接在中获取到统一使用。

  原理:通过RowBounds实现分页和通过数组方式分页原理差不多,都是一次获取所有符合条件的数据,然后在内存中对大数据进行操作,实现分页效果。只是数组分页需要我们自己去实现分页逻辑,这里更加简化而已。

  存在问题:一次性从数据库获取的数据可能会很多,对内存的消耗很大,可能导师性能变差,甚至引发内存溢出。

  适用场景:在数据量很大的情况下,建议还是适用实现分页效果。RowBounds建议在数据量相对较小的情况下使用。

  简单介绍:这是代码实现上最简单的一种分页方式,只需要在dao层接口中要实现分页的方法中加入RowBounds参数,然后在service层通过offset(从第几行开始读取数据,默认值为0)和limit(要显示的记录条数,默认为java允许的最大整数:2147483647)两个参数构建出RowBounds对象,在调用dao层方法的时,将构造好的RowBounds传进去就能轻松实现分页效果了。

  只需要这两步操作,就能轻松实现分页效果了,是不是很神奇。但却不简单,内部是怎么实现的?给大家提供一个简单的思路:RowBounds分页简单原理

  结论:从上面四种sql分页的实现方式可以看出,通过RowBounds实现是最简便的,但是通过的实现方式是最优的方案。只需一次编写,所有的分页方法共同使用,还可以避免多次配置时的出错机率,需要修改时也只需要修改这一个文件,一劳永逸。而且是我们自己实现的,便于我们去控制和增加一些逻辑处理,使我们在外层更简单的使用。同时也不会出现数组分页和RowBounds分页导致的性能问题。当然,具体情况可以采取不同的解决方案。数据量小时,RowBounds不失为一种好办法。但是数据量大时,实现就很有必要了。

  到这里,mybatis的分页原理和全部实现过程都完成了,还有不清楚的可以自己去看一下mybatis的源码,按照这个思路去阅读还是比较清晰的。这里只是对插件()实现分页做了个简单的介绍,只是简单的分页功能,还很简陋。在下一遍博客我们将会实现一个封装好的、功能齐全的实用性插件。传送门:MyBatis - 分页(原理机制 + 功能进阶)

  今天我们就来进行基于mybatis和MySql进行分页功能的实现。常见的数据分页有哪几种实现??基于数组的分页实现?基于sql语句的分页实现?还是通过进行数据分页功能?还是通过RowBounds...博文来自:为谁伫立在风中

  本文提供了一种自动生成sql语句的方法,它针对的对象是有主键或唯一索引的单表,提供的操作有增、删、改、查4种。理解本文和本文的提供的代码需要有java注解的知识,因为本文是基于注解生成sql的。本文适...博文来自:追求极致的人

  本文已经过时,大家可以阅读,不要再使用了。github有个开源的jar工程:比较适用于在分页时候进行拦截...博文来自:Y-CAT的专栏

  9月份参加软件架构师大会,京东老师提到了他们解决数据库水平切分用的mybatis来实现,目前所做的项目用的是mybatis,而恰好也需要这个功能,研究了下基本实现了根据配置自动切分数据表来...博文

  Mybatis的自带分页方法只是逻辑分页,如果数据量很大,内存会溢出,不知道为什么开源组织不在里面实现类似Hibernate的物理分页处理方法。在不改动Mybatis源代码的情况下,怎么使Mybati...博文来自:我的IT博客

  mybatis的rowboundsds查询中,如果查询参数中带有数组需要在mapper中遍历,可能会出现遍历取值为null的情况,一般情况下,遍历数组取值是通过item取的,如:lt;for...博文来自:u010995831的博客

  这两两天由于工作需要,对mybatis分页进行研究,现进行记录,主要从一下两个方面阐述。博主用的数据库是oracle,所以以下分页都是针对oracle的,mybatis版本是3.3.0 一.myba...博文来自:mzl1989325的博客

  前言:在上一篇博客中,我们讲到了mybatis的四种简单分页方式。分别是基于数组、Sql语句、分页插件和RowBounds的简单分页实现。不清楚的可以移步mybatis四种简单分页方式,这里详细讲解了...博文来自:白哥哥的博客

  一.应用场景平时在建对象表的时候都会有最后修改时间,最后修改人这两个字段,对于这些大部分表都有的字段,每次在新增和修改的时候都要考虑到这几个字段有没有传进去,很麻烦。mybatisPlus有一个很好的...博文来自:的博客

  场景:MyBatis物理分页,查询条件中需要用到foreach,参数失效,查不到结果 分析:把java.sql的debug打开,sql语句正常,参数也正常。debug物理分页代码,setParamet...博文来自:iteye_14759的博客

  前言日常开发中,我们经常会碰上需要列表查询的场景,如果查询结果列表过长,则需要对其进行分页。MyBatis其实自带分页功能,通过一个RowBounds的类实现,但是存在一个非常严重的问题,那就是它会一...博文来自:懋懋之为

  九、公共字段填充这里涉及到一个元数据处理接口MetaObjectHandler,元对象是Mybatis提供的一个用于更加方便,更加优雅的访问对象的属性,给对象的属性赋值的一个对象,本质上metaObj...博文来自:疾风知劲草,智者必怀仁

  在MyBatis主流程分析之(二)-打开会话和数据库操作中我们只讲了一个主流程,没有深入了解mybatis是如何准备sql语句,如何替换参数,最后查询,新增和删除数据的。这里再补充一下,深入了解。一、...博文来自:火柴盒

  使用MybatisPlus的自动填充功能时,出现异常博文来自:qin09872006的专栏

  [一步是咫尺,一步即天涯]前文,我们演示了物理分页的Sql实现方式,这种方式使得我们每次在编写查询服务时,不断的重复造轮子。这样的代码实现方式就显得十分的笨拙了。本文是Mybatis分页查询的最后一片...博文来自:y-yg的博客

  mybatis是一个优秀的ORM产品,但是在我们的实际代码中需要对数据分页查询的时候,mybatis就比较弱了,只提供了逻辑内存分页,这种鸡肋的分页功能可能不能用,所以我们就自己来写个分页。自己实现分...博文来自:dyy_gusi的博客

  简介Mybatis-Plus(简称MP)是一个Mybatis的增强工具,在Mybatis的基础上只做增强不做改变,为简化开发、提高效率而生。我们的愿景是成为Mybatis最好的搭档,就像ContraG...博文来自:学习笔记

  前言:学习hibernate&mybatis等持久层框架的时候,不外乎对数据库的增删改查操作。而使用最多的当是数据库的查找操作,而当数据库数据过多时,符合查找条件的数据可能也会是很庞大的数据。往往在这...博文来自:白哥哥的博客

  实现方式优点缺点适用场景subList简单、易用效率低无法按需批量获取数据SQL语句简单、直接、效率高数据库兼容性差不要求数据库兼容Hibernate框架面向对象,兼容性强复杂查询性能低兼容不同数据库...博文来自:liuyinfei_java的博客

  使用eureka服务注册中心,搭建一个简单的服务端注册服务,客户端去调用服务使用的案例。数据库:SQLServer2014持久层框架:采用Mybatisplus。Mybatis-Plus(简称MP)是...博文来自:freedom

  一、实现1.原理在mybatis运行过程中拦截执行对象,获得sql信息,将分页信息添加到sql语句中,然后放行mybatis的执行过程2.了解一点mybatis源码首先我们需要明白要拦截的对象是...博文来自:oraly的博客

  在对象声明后面的第一条的查询的sql语句进行拦截,拦截后实现对应方言的查询的分页语句。如果还要返回记录总数。(这里可以理解执行了两条sql语句。)还要执行一条的sql语句。总数sql结果封装pageI...博文来自:白兔白又白

  注:本笔记是根据尚硅谷的MyBatis视频记录的一、为什么要制作Mybatis插件根据自己的意图动态修改mybatis运行流程二、插件原理当有多个插件同时拦截同一个方法时:在四大对象创建的时候:1、每...博文来自:林海静的博客

  转载出处:点击前往简介MyBatis的-PLUS(简称MP)是一个 MyBatis的 的增强工具,在MyBatis的的基础上只做增强不做改变,为简化开发,提高效率而生。我们的愿景是成为Mybatis最...博文来自:苏启豪的博客

  以前为Mybatis分页查询发愁过,而且在网上搜过很多相关的文章,最后一个都没采用。在分页的地方完全都是手写分页SQL和count的sql,总之很麻烦。后来有一段时间想从Mybatis内部写一个分页的...博文来自:偶尔记一下

  为什么会分享mybatis的方法,由于以往可能都是通过自己写分页sql查寻方法进行分页,这样在支持多个不同的数据库上花费的时间会比较多,如果能在基于sql查寻进行拦截,然后进行拼装分页sql,这...博文来自:ahongge的专栏

  闲来无事,特地整理了一下MyBatis实现分页的原理。地球人应该都知道要利用JDBC对数据库进行操作,就需要一个statement对象,MyBatis也是如此。MyBatis在执行sql语句前会...博文来自:jant的博客

  用mybatis进行数据库物理分页查询,假如每次都手动设置分页信息,并手动编写分页sql将会很费工夫。而目前已有不少分页插件可供使用。其主要原理是拦截执行查询过程中sqlSession的查询,...博文来自:lanhezhong的博客

  Mybatis提供一个RowBounds类型,在查询指定RowBounds参数对象可以控制查询记录的起点和数量。此案例在之前代码基础上执行:博文来自:IT小生

  参考:MySql从一窍不通到入门(二)大数据量分页查询方法一、分页对JavaWeb来说,分页是十分常见的一种需求,一般来说数据的项目大于单次可显示的条目,因此当查询时需要对查询得到的结果进行分页显示。...博文来自:Invokers Tower

http://lotusyogacenter.com/wulifenye/429.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有