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

Mybatis最入门---分页查询(分页原理及实现)

发布时间:2019-07-25 08:37 来源:未知 编辑:admin

  前文,我们演示了物理分页的Sql实现方式,这种方式使得我们每次在编写查询服务时,不断的重复造轮子。这样的代码实现方式就显得十分的笨拙了。本文是Mybatis分页查询的最后一片内容,我们将介绍基于的,精巧的实现方式。在阅读这篇文章之前,强烈建议各位看官能够先阅读上文。这样就能对下文我们提及的各种对象及他们之间的关系有一个清晰的关系。好了,废话不多讲,开始我们的正文部分吧。

  【本文只作为原理分析及简单分页功能实现。实际生产环节,建议各位读者选择已经广泛应用的第三方jar包或平台性支持的实现】

  1.创建本文我们将使用的工程Mybatis12,工程结构图如下:【重点文件我们给出,其他配置文件请读者参考前文工程】

  2.管理分页的对象PagePOJO的具体内容如下:【这里我们给出基本分页的示例,更多需求请读者自行完成】

  上面与分页有关的,比较简单的内容我们先提供给大家。下面我们来详细的解释,实现分页的原理,各位看官睁大眼睛啊!

  2.回顾一下,Mybatis允许我们能够进行切入的点,如下:【上文的运行细节图中也有描述,具体内容请参考前文。】

  【老外其实从命名上已经给我们了充足的信息,我们结合时序图已经能够猜到其大概的含义及执行时间,鉴于篇幅的关系,具体的功能及作用,请参考前文详细内容。】

  【结论】从上面的1.2两步,我们知道分页拦截的合理时机是在StatementHandler中。

  这里请读者回顾上文中讲述的查询执行流,即这里将会执行prepare(Connection)方法,如下:

  4.于是,我们可以得到的对应注解内容如下:【继承自Mybatis的Interceptor,必须实现3个方法,如下:】

  由此看到:annotation注解等其他相关内容都放在Map中返回。最后,判断出是否生成代理对象。

  7.现在,我们已经成功的拦截到了目标对象,然后,就开始要改变查询过程了。在这里,出现了两个基本的问题

  其中的mappedStatement中就包含着我们需要找的sql信息。如下:【如果读者已经看过前面的配置详解部分的内容,已经不会感到陌生】

  现在,我们已经找到了我们想要的内容的具体位置,那我们应该怎样取出来呢?此时应该有看官大喊一声:这还不简单!可是我们来看看这部分的源码内容,如下:

  其在BaseStatementHandler中是protected的,我们在没有继承等关系的条件下,是无法直接取出来的。

  因此,我们就需要引入一个Mybatis已经实现了的对象:MetaObject。关于这个对象,可以先暂时的理解为帮助我们获取或设置该对象的原本不可访问的属性。

  现在对象已经获取了,就要获取其中的值了,在具体操作之前,我们再来梳理一下这里的类间关系,如下:【这里需要阅读过前文程序执行流程,或者之前已有了解】

  现在,我们终于可以去获取其属性值了,获取的方法为参数名,OGNL表达式。具体内容如下:

  8.获得目标对象之后,现在要做进一步判断,即,当前被代理的对象是普通查询,还是分页查询。这里具体方式有很多,我们给出一种简单实现,更多实现及用法就行读者自行尝试吧。

  如,我们在这里定义,id中(即mapper文件中sql语句的唯一id)以ByPage字符串结尾的,我们就认为该sql语句按照分页插叙来执行。具体的代码试下如下:

  9.通过上面一系列的步骤,我们已经成功的捕获了目标对象。接下来,我们就要开始加入我们“神不知鬼不觉‘”的代码了。

  这里仍然需要前面执行流程的知识,默认情况下,执行的是PreparedStatementHandler。因此,我们可以从PreparedStatementHandler中寻找需要的sql语句。具体见上文第3步。这里仅给出省略内容,如下:

  由此,我们发现Sql语句隐藏在boundSql中。回头看看,已经获得了的StatementHandler,其具体内容我们也在上文截图给大家。

  10.查询总数对应的Mysql语句。【其他数据库原理一致,读者自行完成即可】

  【注意:这里我们已经获得了传入参数与完整的sql语句,因此,select count还有更加高效的写法,请读者自行完成。】

  11.接下来就是执行查询总数的语句。其总数的值用于完成分页页面数量控制。执行方法如下:

  12.查询总数,分页查询的语句已经准备完成,如何替换原来的查询语句呢?再回头看看MetaObject对象,刚才,我们说它提供给我们获取或设置该对象的原本不可访问的属性。因此,就来利用它实现替换sql语句的功能。如下:【备注:这句话具体解释与上文getValue一致,请参考上文即可】

  到此,我们成功的把原有的简单查询语句替换为分页查询语句了,现在是时候将程序的控制权交还给Mybatis了,具体代码如下:

  13.最后一步,自定义的需要交给Mybatis管理,这样才能使得Mybatis的执行与的执行结合在一起,即,需要注册到mybatis-config配置文件中。具体内容如下:

  传入参数为Map,供多参,条件查询的等场景使用。【最好这么使用,因为只有1个】

  1.本文仅作为原理解释,实际应用时,建议各位看官最好使用更加严谨的第三方jar包,或者平台性的支持。

  最近两天项目需求研究了一下mybatis。对于Mybatis发现其功能强大,虽很灵活但是其内部对象转换太麻烦很多接口没有完全暴露出来。甚至不得不通过反射的方式去取其内部关联对象。可能Myb...博文来自:wyuxiao729的专栏

  背景我们在使用Mybatis分页查询数据列表时,在用户的一个请求中常常需要同时返回当前页的列表数据以及满足条件的数据总条数。以下介绍了三种常见方案。具体使用哪种,具体场景具体分析。实现方案1)执行两次...博文来自:Saintyyu的博客

  本文的内容将作为前面我们叙述的内容的内部原理篇的解释,希望各位读者能够仔细理解本篇的内容,下一篇,我们将详细的介绍如何实现一个生产环境下的分页查询,好了,马上开始我们的正文部分吧。【在此,先对开源世...博文来自:程序员俱乐部

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

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

  Mybatis分页查询其实我们都知道Mybatis是对JDBC进行了轻量级的封装框架,在我们使用Mybatis对数据库进行CRUD等操作的时候,最重要的还是通过SQL语句来进行相应的操作,那么对Myb...博文来自:田坎上

  原文地址:MyBatis实现分页的作用就是拦截某些方法的调用,我们可以在方法执行前后为方法加上某些逻辑,也可以只执行拦截的逻辑代码而不执行被拦截的方法。Mybatis设计的一个初衷就...博文来自:wqh8522的博客

  Mybatis3.0出来已有段时间了,其实自己挺喜欢这样的一个持久化框架的,因为它简单实用,学习成本低。Mybatis3.0在整体结构上和ibatis2.X差不多,改进特性如下:1.解析xml引进了X...博文来自:Ltw518的专栏

  由于业务关系 巴拉巴拉巴拉 好吧 简单来说就是 原来的业务是 需要再实现类里写 selectCount 和selectPage两个方法才能实现分页功能 现在想要达到效果是 只通过一个方法就可以实现 也论坛

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

  转载自 moshenglv 点击打开链接Mybatis 介绍 的一个作用就是我们可以拦截某些方法的调用,我们可以选择在这些被拦截的方法执行前后加上某些逻辑,也可以在执行这些被拦截的方法时执...博文来自:ssuperlg的博客

  基本的步骤就是(1)查询总共有多少条(2)分页查询,当前页,一页查多少,一共多少页(3)外围需要循环调用,获取所有页的数据,或者分页展示首先写一个分页的基础类publicclassPagination...博文来自:红豆和绿豆的博客

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

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

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

  关于分页查询,大家并不陌生,easyui中封装的datagrid将表格的一系列操作运用的淋漓尽致,分页查询便是其中之一。然而,我们却疏于了解分页查询的基本实现原理,它究竟是如何实现的,今天就带大家一起...博文来自:littlecolor

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

  症状:使用自定义MyBatis分页插件,只有分页参数不同的方法在短时间内使用不同分页参数查询出来的结果相同。病因:自定义MyBatis插件拦截目标为StatementHandler,而在同一个SqlS...博文来自:weixin_34021089的博客

  近两天一直再研究MyBatis的分页问题,看了别人的处理方式,自己总结优化了一下,写了两个拦截类,给有需要的人使用和参考,源码请下载附件。主要有3个类:Page,MybatisPageIntercep...博文来自:b_l_east的博客

  今天让我们来学习一下MyBatisPlus的分页查询。让我们来接着上一篇博客继续往下写。线.配置分页类fig;importc...博文来自:lp840312696的博客

  Mybatis实现真正分页查询MyBatis本身是有分页查询的但是并不是真正的分页查询。它是先把数据查出来放在内存里面你要什么给你什么。和真正的分页查询还是不一样的。如果数据太多的话。内存肯定会溢出的...博文来自:DemoWM

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

  写在前面:这套数据结构在spring+hibernate的框架上已经成熟运行多时,可直接将web前端的table查询插件生成的查询条件通过组件自动转换为CommonReqInqBean实例,然后...博文来自:rocklee的专栏

  转自这篇博客:内容就不copy了,折腾了半天,刚开始是由于更改了其中的包结构,...博文来自:忘却世俗的人

  问题:  在使用mybatis过程中通过mybatis-generator逆向生成实体(包含example)和mapper(包含xml文件)。  对于example的理解,可以认为是一个高级查询的过程...博文来自:月想容的博客

  Lost_life_:[reply]m0_37684676[/reply] 说实话,你这样的文件上传,建议,仅仅是个人建议,建议不要上传超过200M的文件,如果真的有更大文件上传需求,建议你仔细的查一大文件上传的相关博文,或者了解一些相关技术,比如ftp或者现在大数据上传先关技术,都是个人建议,可能我还是有点孤陋寡闻,有更好的解决方案的话希望分享

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