导航:首页 > 物理学科 > mybatis怎么物理分页

mybatis怎么物理分页

发布时间:2022-11-12 10:10:29

A. MyBatis怎样实现MySQL动态分页

回记录行的偏移量,第二个参数指定返回记录行的最大数量。在mybatis 中,只需要在相 应的查询语句后,加上limit 子句,即可实现物理分页。如下,以 一个只有字段id,name,age 的表为例。该配置会根据传入的 hashmap,如果含有键start 和键end,...

B. mybatis分页-RowBounds - 草稿

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取结果),在大数据量的情况下这样的分页效率会很低,一般情况下我们会使用myts的分页辅助工具来完成分页

总结:

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

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

C. MyBatis解析

从命名上可以看出,这个是一个 Builder 模式的,用于创建 SqlSessionFactory 的类。SqlSessionFactoryBuilder 根据配置来构造 SqlSessionFactory。其中配置方式有两种:

mybatis-config.xml 就是我们的配置文件:

Java Config 相比较 XML 文件的方式而言,会有一些限制。比如修改了配置文件需要重新编译,注解方式没有 XML 配置项多等。所以,业界大多数情况下是选择 XML 文件的方式。但到底选择哪种方式,这个要取决与自己团队的需要。比如,项目的 SQL 语句不复杂,也不需要一些高级的 SQL 特性,那么 Java Config 则会更加简洁一点;反之,则可以选择 XML 文件的方式。

创建配置文件解析器XMLConfigBuilder

解析mybatis-config.xml里的配置为Configuration对象,Mybatis的全局配置对象。

XMLConfigBuilder#parseConfiguration解析mapper下的xml
XMLMapperBuilder#bindMapperForNamespace,根据xml里的 namespace 反射出 mapper接口 的 class,如果有mapper接口,则把该mapper接口的class添加到Configuration的mapperRegistry里。

如果该接口已经注册,则抛出已经绑定的异常。
为该接口注册MapperProxyFactory,但这里只是注册其创建MapperProxy的工厂,并不是创建MapperProxy。
如果Mapper对应的xml资源未加载,触发xml的绑定操作,将xml中的sql语句与Mapper建立关系。
addMapper方法,只是为**Mapper创建对应对应的MapperProxyFactory。

根据Mapper接口与SqlSession创建MapperProxy对象。
根据接口类获取MapperProxyFactory。
调用MapperProxyFactory的newInstance创建MapperProxy对象。

SqlSessionFactory 顾名思义,是用于生产 SqlSession 的工厂。 通过如下的方式来获取 SqlSession 实例:

SqlSession 包含了执行 SQL 的所有的方法。以下是示例:

当然,下面的方式可以做到类型安全:

MapperProxy是MapperProxyFactory使用SqlSession创建出来的。所以MapperProxy中包含SqlSession。

可以看到MapperProxy调用invoke方法,进而调用MapperMethod的execute(),这些MapperMethod就是和你要执行的命令相关,比如执行select语句,则会通过SqlSession的select()方法,最终调用到Executor的query方法。Executor会再协调另外三个核心组件。

MapperProxy:

MapperMethod:

插件的构建:
谈原理首先要知道StatementHandler,ParameterHandler,Result Handler都是代理,他们是Configuration创建,在创建过程中会调用interceptorChain.pluginAll()方法,为四大组件组装插件(再底层是通过Plugin.wrap(target,XX, new Plugin( interceptor))来来创建的)。

插件链是何时构建的:
在执行SqlSession的query或者update方法时,SqlSession会通过Configuration创建Executor代理,在创建过程中就调用interceptor的pluginAll方法组装插件。然后executor在调用doQuery()方法的时候,也会调用Configuration的newStatementHandler方法创建StatemenHandler(和上面描述的一样,这个handler就是个代理,也是通过interceptorChain的pluginAll方法构建插件)

插件如何执行:
以statementhandler的prepare方法的插件为例,正如前面所说,statementhandler是一个proxy,执行他的prepare方法,将调用invokeHandler的invoke方法,而invokeHandler就是Plugin.wrap(target, xxx, new Plugin(interceptor))中的第三个参数,所以很自然invokeHanlder的invoke的方法最终就会调用interceptor对象的intercept方法。

Mybatis的插件配置在configuration内部,初始化时,会读取这些插件,保存于Configuration对象的InterceptorChain中。

org.apache.ibatis.plugin.InterceptorChain.java源码。

上面的for循环代表了只要是插件,都会以责任链的方式逐一执行,所谓插件,其实就类似于拦截器。

插件的编写
插件必须实现org.apache.ibatis.plugin.Interceptor接口。

-intercept()方法:执行拦截内容的地方,拦截目标对象的目标方法的执行
-plugin()方法:决定是否触发intercept()方法。 作用:包装目标对象,包装就是为目标对象创建一个代理对象
-setProperties()方法:给自定义的拦截器传递xml配置的属性参数。将插件注册时的property属性设置进来

下面自定义一个拦截器:

为什么要写Annotation注解?注解都是什么含义?
Mybatis规定插件必须编写Annotation注解,是必须,而不是可选。@Intercepts注解:装载一个@Signature列表,一个@Signature其实就是一个需要拦截的方法封装。那么,一个拦截器要拦截多个方法,自然就是一个@Signature列表。

type = Executor.class, method = "query", args = { MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class }
解释:要拦截Executor接口内的query()方法,参数类型为args列表。

Plugin.wrap(target, this)是干什么的?
使用JDK的动态代理,给target对象创建一个delegate代理对象,以此来实现方法拦截和增强功能,它会回调intercept()方法。

Mybatis可以拦截哪些接口对象?
Mybatis只能拦截ParameterHandler、ResultSetHandler、StatementHandler、Executor共4个接口对象内的方法。

重新审视interceptorChain.pluginAll()方法:该方法在创建上述4个接口对象时调用,其含义为给这些接口对象注册拦截器功能,注意是注册,而不是执行拦截。

拦截器执行时机:plugin()方法注册拦截器后,那么,在执行上述4个接口对象内的具体方法时,就会自动触发拦截器的执行,也就是插件的执行。

Invocation

可以通过invocation来获取拦截的目标方法,以及执行目标方法。

分页插件原理
由于Mybatis采用的是逻辑分页,而非物理分页,那么,市场上就出现了可以实现物理分页的Mybatis的分页插件。 要实现物理分页,就需要对String sql进行拦截并增强,Mybatis通过BoundSql对象存储String sql,而BoundSql则由StatementHandler对象获取。

因此,就需要编写一个针对StatementHandler的query方法拦截器,然后获取到sql,对sql进行重写增强。

D. 关于mybatis物理分页的问题,求大神帮忙看看

原因在这句异常:
org.apache.ibatis.exceptions.TooManyResultsException: Expected one result (or null) to be returned by selectOne(), but found: 10
你使用了selectOne方法,这个方法返回一条数据,但是你的find中查询出了10条数据,这块改一下就好了

E. MyBatis怎样实现MySQL动态分页

回记录行的偏移量,第二个参数指定返回记录行的最大数量。在mybatis 中,只需要在相 应的查询语句后,加上limit 子句,即可实现物理分页。如下,以 一个只有字段id,name,age 的表为例。该配置会根据传入的 hashmap,如果含有键start 和键end,那么即通过mybatis 强大的 动态sql,生成含有mysql 分页的sql语句。 select * from users limit #{start},#{end}

二、myts 简介
mybatis,前称ibatis,后改名为mybatis,截止本文成文,最新 版本是3.0.6。它和hibernate 是java世界使用最多的两种orm 框 架。hibernate 理念最为先进,完全实现面向对象的数据库编程,不需要掌握sql 语句,即可实现数据库操作,能够节省开发人员编 写大量sql语句的时间。但是,hibernate 在处理多表关联时,可 能会出现n+1 问题,性能会有较大影响,要解决性能问题,需要较 深的hibernate 知识和项目经验。mybatis 需要自己写sql 语句, 开发效率不如hibernate,很难做到底层多数据库的通用。但对程 序员来说有更高的可控性,可以更容易的对sql 语句进行优化,提 高效率。
在开发中直接使用jdbc 一个非常普遍的问题就是动态sql。如果 参数值、参数本身和数据列都是动态sql,通常的解决方法就是写很多if-else 条件语句和字符串连接。而mybatis 通过ognl 提供 了一套非常清晰的方法来解决动态sql 的问题。

F. mybatis分页查询怎么做

一、内存分页,使用RowBounds类,但这种方式不推荐,基本不用,所以此方式集成省略。

二、自定义实现,代码量比较少,简单,比较灵活。以下为具体的集成步骤:

1、在User.xml中加入select节点,并组装分页SQ

G. 如何使用 mybatis 实现分页

1、亲Mybatis是自己写Sql语句啊,和Hibernate不一样。
2、如何知道上面的,你还要知道MySql有一个分页语句叫limit,如:limit(1,10);前面一个参数是起始未知,后面一个是查询多少个。
3、Oracle的分页方法是嵌套子查询,需要用到rownum这个属性
Sql
Server是Top。
分页例子:
Oracle
select
*
from
(select
emp.*,rownum
rn
from
emp
where
rownum<9)
where
rn>3;
MySql
select
*
from
emp
limit
startIndex,maxNum

H. mybatis怎么实现物理分页查询语句

物理分页:


  1. 直接用jdbc完成:使用滚动结果集 ?

优点:跨数据库 ? ? 缺点:性能低


2.使用数据库本身提供的分页操作:使用每一个数据库特定的分页函数


优点:性能高 ? ? ? 缺点:不能跨数据库

I. Mybatis分页对比MybatisPlus分页

Mybatis使用内存分页

Mybatis使用RowBounds对象进行分页,它是针对ResultSet结果集执行的内存分页,而非物理分页。可以在sql内直接书写带有物理分页的参数来完成物理分页功能,也可以使用分页插件来完成物理分页。

       分页插件的基本原理是使用Mybatis提供的插件接口,实现自定义插件,在插件的拦截方法内拦截待执行的sql,然后重写sql,根据dialect方言,添加对应的物理分页语句和物理分页参数。

————————————————

MybatisPlus是物理分页

基本步骤是:

1 原生SQL解析

2 判断有无page分页对象。没有对象就直接进行SQL操作,有对象就继续分页解析

3 count语句优化。根据SQL条件进行count优化,这点不同于传统的 select count(1) from (你的 业务 SQL) 做下简单的封装,详细源码可以自己看,或者打印出执行的SQL可以清楚的看到

4 通过count数量和之前前端传递来的分页pageNum和pageSize对SQL进行拼接

5最终执行拼接完整的SQL实现分页处理

总结:mybatis的是内存分页,全查出来丢在内存中,这样子很不好! 现在大面积使用的插件MybatisPlus是物理分页,先查询总数(不像网上很多人说的只是简单外包一层计算count),再根据分页参数瓶装SQL然后执行分页查询

J. oracle下mybatis一对多的映射关系怎么分页

mybatis的物理分页:mybatis-paginator
github上有一个专门针对mybatis的物理分页开源项目:mybatis-paginator,兼容目前绝大多数主流数据库,十分好用,下面是使用步骤:
环境:struts2 + spring + mybatis
一、pom.xml中添加依赖项
View Code

二、mybatis映射文件中按常规写sql语句
View Code
如果使用mybatis-spring来整合mybatis,sqlSessionFactory参考下面修改(主要是加载分页插件)
View Code

三、服务层基类
View Code

四、具体的服务层子类调用
View Code
服务层就处理完了,接下来看Action层

五、Action基类
View Code
注:约定分页时,url类似 /xxx.action?pageIndex=N

六、具体的Action子类调用
View Code

七、前端页面
View Code
解释:jquery的分页插件,网上一搜索一大堆,我用的是jquery.simplePagination,pageIndex、pageIndex、{pageSize}...包括list,这些属性都是后台Action中的model属性

后记:
github上还有另一款mybatis的分页插件:Mybatis-PageHelper 也十分好用,使用说明参考:http://git.oschina.net/free/Mybatis_PageHelper/blob/master/wikis/HowToUse.markdown
使用示例:
View Code
mybatis-config.xml中的配置:
View Code

阅读全文

与mybatis怎么物理分页相关的资料

热点内容
word中化学式的数字怎么打出来 浏览:740
乙酸乙酯化学式怎么算 浏览:1406
沈阳初中的数学是什么版本的 浏览:1353
华为手机家人共享如何查看地理位置 浏览:1045
一氧化碳还原氧化铝化学方程式怎么配平 浏览:886
数学c什么意思是什么意思是什么 浏览:1411
中考初中地理如何补 浏览:1300
360浏览器历史在哪里下载迅雷下载 浏览:703
数学奥数卡怎么办 浏览:1388
如何回答地理是什么 浏览:1025
win7如何删除电脑文件浏览历史 浏览:1058
大学物理实验干什么用的到 浏览:1487
二年级上册数学框框怎么填 浏览:1701
西安瑞禧生物科技有限公司怎么样 浏览:974
武大的分析化学怎么样 浏览:1250
ige电化学发光偏高怎么办 浏览:1339
学而思初中英语和语文怎么样 浏览:1651
下列哪个水飞蓟素化学结构 浏览:1425
化学理学哪些专业好 浏览:1488
数学中的棱的意思是什么 浏览:1059