分页插件

方式一:使用limit
默认 mysql提供
SELECT * from tb_item LIMIT 0,10

方式二:PageHelper
分页插件动态添加LIMIT 0,10
在执行器执行MapperStatement 前进行拦截。
插件PageHelper支Oracle,Mysql,MariaDB,SQLite,Hsqldb,
PostgreSQL六种数据库分页

开发流程:
第一步:导入插件依赖
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.2</version>
</dependency>

第二步:配置插件
com.github.pagehelper.PageInterceptor(5.0之后版本使用 )
方案一:在Mybatis的核心配置文件中配置[不推荐]

核心配置文件中配置分页插件

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

<!-- 配置分页插件 -->
<plugins>
    <plugin interceptor="com.github.pagehelper.PageInterceptor"></plugin>
</plugins>

</configuration>

需要通过spring的配置文件,加载核心配置文件中的插件


image.png

方案二:在Spring的配置文件中配置(推荐)
不再需要mybatis的核心配置文件,使用spring的配置文件替代所有
需配置方言属性:helperDialect

下面是Mybatis核心配置文件中的方式

Spring整合配置文件中代码:


<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">

<property name="dataSource" ref="dataSource"></property>

<property name="mapperLocations" value="classpath:com/qf/mapper/*Mapper.xml"></property>

<property name="plugins">
<array>
<bean class="com.github.pagehelper.PageInterceptor">
<property name="properties">
<props>
<prop key="helperDialect">mysql</prop>
</props>
</property>
</bean>
</array>
</property>


</bean>

第三步:使用插件
在具体执行查询之前进行拦截,简单的就是给需要查询的内容,动态加上limit 以及后面的参数。我们开发的时候不需要手动编写带limit的分页语句。
总页数:来源总记录数. count(*) 使用插件后不需要再编写。
插件用法:
执行动态SQL语句前:加PageHelper.startPage(page,rows);//这里的第一个参数传的是第几页,不是起始位置。
page参数从1开始,不是从0开始。第二页:page输入的是2,不是起始位置。

获取分页结果,执行查询后,使用PageInfo对象封装返回的list,获取分页结果、总记录数getTotal() 。

@Override
public List<ComputerDTO> findByPage(int page, int rows) {
//加入分页
PageHelper.startPage(page,rows);// 对查询的内容进行拦截,动态加入limit及查询的具体参数
//查询所有
TbComputerExample example = new TbComputerExample();
//拦截后查询的内容,不再是所有。
List<TbComputer> tbComputers = tbComputerMapper.selectByExample(example);
//得到总记录数
PageInfo pageInfo = new PageInfo(tbComputers);
long total = pageInfo.getTotal();
System.out.println(total);
List<ComputerDTO> list =new ArrayList<ComputerDTO>();
for (TbComputer tbComputer : tbComputers) {
ComputerDTO dto = new ComputerDTO();
BeanUtils.copyProperties(tbComputer,dto);
dto.setComGendate(ComDate.dateToStr(tbComputer.getComGendate()));
list.add(dto);
}

return list;
}

如何返回总记录数或者总页数给表现层,表现层给页面?
原始方式:


image.png

改进后:还可以通过输入参数(对象),返回需要的内容。

image.png

或者可以通过返回Map<String,Object>的方法存储集合和分页信息。

表现层:

@RequestMapping("/listCom.do")
public ModelAndView listCom(HttpServletRequest request){
ModelAndView modelAndView = new ModelAndView();
String page = request.getParameter("page");//
int currentPage = 1;
if(StringUtils.isEmpty(page)){//不传page参数,默认从第一页
currentPage =1;
}else {
currentPage = Integer.parseInt(page);
}
PageDTO pageDTO = new PageDTO();
pageDTO.setPage(currentPage);
pageDTO.setSize(5);
List<ComputerDTO> all = computerService.findByPage(pageDTO);
//表现层没有设置总页数,但是服务层有设置总页数,这里可否得到总页数呢?
int maxPage = pageDTO.getMaxPage();
if(currentPage<1){
currentPage=1;
}else if(currentPage>maxPage){
currentPage=maxPage;
}
modelAndView.addObject("comList",all);//传值
modelAndView.addObject("currentPage",currentPage);
modelAndView.addObject("maxPage",maxPage);
modelAndView.setViewName("comlist");//逻辑视图
return modelAndView;
}

分页插件处理了第0页,返回就是第一页的信息;没有处理最后一页+1页,返回空记录。
未来可以把前面查询返回的最大页数存储到分布式缓存中,后面点击下一页的时候先从缓存中取得最大页判断当前页是否大于最大页数。如果大于,就用最大页查询返回最后一页就可以了。

页面:


image.png

这里需要注意的部分:
原因:这是pageHelper里面自带的一个功能,叫做reasonable分页参数合理化,3.3.0以上版本可用,默认是false。 启用合理化时,如果pageNum<1会查询第一页,如果pageNum>pages会查询最后一页; 禁用合理化时,如果pageNum<1或pageNum>pages会返回空数据。

解决:一般项目里面加入<property name="reasonable" value="false" />spring Boot项目里面:pagehelper.reasonable=false

这里我们可以修改一下配置文件: 当我们点击最后一页的时候 再次点击下一页的时候,会发现,此时不会不限空数据 ,仅仅会出现最后一次的数据。


image.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容