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;这句是什么意思等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)