Web网页的分页(二)
插件分页
对应上次的分页(一) 其他东西都差不多,这里只是方便开发。
实现效果
需要的依赖
<!-- mybatis物理分页插件 -->
<dependency>
<groupId>com.github.miemiedev</groupId>
<artifactId>mybatis-paginator</artifactId>
<version>1.2.15</version>
</dependency>
mybatis文件中需要的配置
不配置不生效
<plugins>
<!-- com.github.pagehelper为PageHelper类所在包名 -->
<plugin interceptor="com.github.pagehelper.PageHelper">
<!-- 4.0.0以后版本可以不设置该参数 -->
<property name="dialect" value="mysql"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,会将RowBounds第一个参数offset当成pageNum页码使用 -->
<!-- 和startPage中的pageNum效果一样-->
<property name="offsetAsPageNum" value="true"/>
<!-- 该参数默认为false -->
<!-- 设置为true时,使用RowBounds分页会进行count查询 -->
<property name="rowBoundsWithCount" value="true"/>
<!-- 设置为true时,如果pageSize=0或者RowBounds.limit = 0就会查询出全部的结果 -->
<!-- (相当于没有执行分页查询,但是返回结果仍然是Page类型)-->
<property name="pageSizeZero" value="true"/>
<!-- 3.3.0版本可用 - 分页参数合理化,默认false禁用 -->
<!-- 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页 -->
<!-- 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据 -->
<property name="reasonable" value="true"/>
<!-- 3.5.0版本可用 - 为了支持startPage(Object params)方法 -->
<!-- 增加了一个`params`参数来配置参数映射,用于从Map或ServletRequest中取值 -->
<!-- 可以配置pageNum,pageSize,count,pageSizeZero,reasonable,orderBy,不配置映射的用默认值 -->
<!-- 不理解该含义的前提下,不要随便复制该配置 -->
<property name="params" value="pageNum=start;pageSize=limit;"/>
<!-- 支持通过Mapper接口参数来传递分页参数 -->
<property name="supportMethodsArguments" value="true"/>
<!-- always总是返回PageInfo类型,check检查返回类型是否为PageInfo,none返回Page -->
<property name="returnPageInfo" value="check"/>
</plugin>
</plugins>
Mybatis分页插件PageHelper说明
如果你也在用Mybatis,建议尝试该分页插件,这个一定是很方便使用的分页插件。
该插件目前支持Oracle,Mysql,MariaDB,SQLite,Hsqldb,PostgreSQL六种数据库分页。
表现层代码
@RequestMapping("/findBySql")
public String findBySql(Model model,Table table){
String sql = "select * from table where isDelete = 0 and pid is null order by id";
Pager<table> pagers = tableService.findBySqlRerturnEntity(sql);
model.addAttribute("pagers",pagers);
model.addAttribute("obj",table);
return "xxx";
}
前段网页代码
</div>
<table class="table table-hover text-center">
<tr>
<th>ID</th>
<th>类别名称</th>
<th>操作</th>
</tr>
<c:forEach items="${pagers.datas}" var="data" varStatus="l">
<tr>
<td>${data.id}</td>
<td>${data.name}</td>
<td>
<div class="button-group">
<a class="button border-main" ><span class="icon-edit">查看分类</span> </a>
<a class="button border-main" ><span class="icon-edit">修改</span> </a>
<a class="button border-red"><span class="icon-trash-o">删除</span> </a>
</div>
</td>
</tr>
</c:forEach>
<tr>
<td colspan="8">
<div class="pagelist">
<!--分页开始-->
<pg:pager url="${pageContext.request.contextPath}/xxx/findBySql" maxIndexPages="5" items="${pagers.total}" maxPageItems="15" export="curPage=pageNumber">
<pg:last>
共${pagers.total}记录,共${pageNumber}页,
</pg:last>
当前第${curPage}页
<pg:first>
<a href="${pageUrl}">首页</a>
</pg:first>
<pg:prev>
<a href="${pageUrl}">上一页</a>
</pg:prev>
<pg:pages>
<c:choose>
<c:when test="${curPage eq pageNumber}">
<font color="red">[${pageNumber}]</font>
</c:when>
<c:otherwise>
<a href="${pageUrl}">${pageNumber}</a>
</c:otherwise>
</c:choose>
</pg:pages>
<pg:next>
<a href="${pageUrl}">下一页</a>
</pg:next>
<pg:last>
<c:choose>
<c:when test="${curPage eq pageNumber}">
<font color="red">尾页</font>
</c:when>
<c:otherwise>
<a href="${pageUrl}">尾页</a>
</c:otherwise>
</c:choose>
</pg:last>
</pg:pager>
</div>
</td>
</tr>
</table>
</div>
持久层代码,映射文件里面
<!-- 查询分页-->
<select id="findBySqlRerturnEntity" resultMap="ResultMap">
${sql}
</select>
分页原理
逻辑分页:Mybatis是如何通过我们设置的RowBounds来返回分页结果的
原理:首先是将所有结果查询出来,然后通过计算offset和limit,只返回部分结果,操作在内存中进行,所以也叫内存分页。
弊端:当数据量大的时候,肯定是不行的
物理分页:直接为sql添加limit
拦截器PageHelper,调用了startPage后,他会通过PageInterceptor对其后的第一个执行sql进行拦截拼接上limit语句
相比较之前的网页代码以及sql操作起来较为简单多了,但是在此基础上,建议还是先会手动写的分页代码,再使用插件去操作。