Mybatis分页对比MybatisPlus分页

Mybatis分页对比MybatisPlus分页,第1张

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然后执行分页查询

你是在什么时候取的值那个语句是没有错的,可以取到列数的,为零说明你取值的时候,GRIDVIEW并没有绑定完成,正在绑定中,你可以在GRIDVIEW的RowDataBound事件中加上 ClientScriptRegisterClientScriptBlock(thisGetType(), "test", "<script>alert('" + thisGridView1ColumnsCountToString() + "')</script>");

测试,可以d出列的值

intRowCount -- 当前页的第一条记录在总记录数中的行数

PageSize -- 每页显示的记录数

intRowCount+PageSize-1 -- 当前页的最后一条记录在总记录数中的行数

(intRowCount+PageSize-1)/PageSize -- 当前显示的第几页

======================================================

早把代码贴出来不就解决了~~~~

if((countRows%PageSize)==0)

intPageCount=countRows/PageSize;

else

intPageCount=countRows/PageSize+1;

在这里:

countRows:记录总数

PageSize:每页显示记录数

intPageCount:页数

如果countRows取余PageSize为0,说明正好可以被整除

也就好比:一共20条记录,每页显示5条,正好可以显示4页!

如果countRows取余PageSize不为0,说明不能被整除

此时countRows除以PageSize得到的页数要少1!

好比一共18条记录,每页显示5条,不能被整除,

而18/5=3(在JAVA中)按理来说应该显示4页,只不过第四页为3条记录罢了!

所以要将countRows/PageSize的结果+1

我也用这个分页控件的,但是没有像你这样用:daFill(ds1,

AspNetPager1PageSize

(AspNetPager1CurrentPageIndex

-

1),

AspNetPager1PageSize,

"News");

我的方法如下,你可以参考一下:

前台:

<webdiyer:AspNetPager

SubmitButtonClass="buttons"

ID="AspNetPager1"

runat="server"

AlwaysShow="True"

FirstPageText="首页"

NextPageText="下一页"

PrevPageText="前一页"

LastPageText="尾页"

PageSize="15"

ShowInputBox="Always"

OnPageChanged="AspNetPager1_PageChanged">

</webdiyer:AspNetPager>

<!--

PageSize="15"定义每页显示数据条数

-->

后台:

///

<summary>

///

加载事件

///

</summary>

protected

void

Page_Load(object

sender,

EventArgs

e)

{

BoundList();

}

///

<summary>

///

全局的变量,分页用的参数数据信息总数

///

</summary>

public

static

int

sumcount;

///

<summary>

///

绑定信息数据

///

</summary>

private

void

BoundList()

{

DataTable

dt

=

GetList()Tables[0];//获取数据源

if

(dtRowsCount

>

0)

{

sumcount

=

dtRowsCount;

PagedDataSource

pds

=

new

PagedDataSource();

AspNetPager1RecordCount

=

sumcount;

pdsAllowPaging

=

true;

pdsPageSize

=

AspNetPager1PageSize;

pdsCurrentPageIndex

=

AspNetPager1CurrentPageIndex

-

1;

pdsDataSource

=

dtDefaultView;

thisgridView1DataSource

=

pds;

//可以绑定到Gridview

、datalist等数据控件上,此处为Gridview

thisgridView1DataBind();

}

else

{

AspNetPager1RecordCount

=

0;

thisgridView1DataSource

=

null;

gridView1EmptyDataText

=

"没有相关信息!";

thisgridView1DataBind();

}

}

///

<summary>

///

分页控件的翻页事件

///

</summary>

protected

void

AspNetPager1_PageChanged(object

sender,

EventArgs

e)

{

BoundList();

}

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

mybatis-configxml 就是我们的配置文件:

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

创建配置文件解析器XMLConfigBuilder

解析mybatis-configxml里的配置为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创建,在创建过程中会调用interceptorChainpluginAll()方法,为四大组件组装插件(再底层是通过Pluginwrap(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就是Pluginwrap(target, xxx, new Plugin(interceptor))中的第三个参数,所以很自然invokeHanlder的invoke的方法最终就会调用interceptor对象的intercept方法。

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

orgapacheibatispluginInterceptorChainjava源码。

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

插件的编写

插件必须实现orgapacheibatispluginInterceptor接口。

-intercept()方法:执行拦截内容的地方,拦截目标对象的目标方法的执行

-plugin()方法:决定是否触发intercept()方法。 作用:包装目标对象,包装就是为目标对象创建一个代理对象

-setProperties()方法:给自定义的拦截器传递xml配置的属性参数。将插件注册时的property属性设置进来

下面自定义一个拦截器:

为什么要写Annotation注解?注解都是什么含义?

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

type = Executorclass, method = "query", args = { MappedStatementclass, Objectclass, RowBoundsclass, ResultHandlerclass }

解释:要拦截Executor接口内的query()方法,参数类型为args列表。

Pluginwrap(target, this)是干什么的?

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

Mybatis可以拦截哪些接口对象?

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

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

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

Invocation

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

分页插件原理

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

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

有文档的

><!DOCTYPE html>

<html>

<head>

  <meta charset="utf-8">

  <title>layui</title>

  <meta name="renderer" content="webkit">

  <meta >

我们已经了解了如何进行数据查询,今天我们来学习下如何对数据进行分页以及显示。

获取分页类

ThinkPHP提供了数据分页的扩展类库Page,可以在>

以上就是关于Mybatis分页对比MybatisPlus分页全部的内容,包括:Mybatis分页对比MybatisPlus分页、asp.net(C#)获取GridView列总数、jsp分页时,总记录-->intPageCount=(intRowCount+PageSize-1)/PageSize;这句是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9819869.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-02
下一篇 2023-05-02

发表评论

登录后才能评论

评论列表(0条)

保存