当前位置: 首页 > news >正文

SpringBoot中Mybaties PageHelper插件使用

首先引入pom.xml文件配置

    <!-- mybatis -->
    <dependency>
     <groupId>org.mybatis.spring.boot</groupId>
        <artifactId>mybatis-spring-boot-starter</artifactId>
        <version>1.3.1</version>
    </dependency>
        
     <!--mybatis分页插件-->
        <dependency>
             <groupId>com.github.pagehelper</groupId>
             <artifactId>pagehelper-spring-boot-starter</artifactId>
             <version>1.1.0</version>
        </dependency>

在application.properties中进行配置

#mybatis
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.CarManage.dao
 
#pagehelper
pagehelper.helperDialect=mysql
pagehelper.reasonable=true
pagehelper.support-methods-arguments=true
pagehelper.params=count=countSql

Controller中

@Controller
@RequestMapping(value="/admin")
public class MessageController {
 
    @Autowired
    private IMessages iMessages;
    
    @GetMapping(value="myMessage")
    public String messageList(@RequestParam(value = "currentPage", defaultValue = "1") int currentPage,
            @RequestParam(value = "pageSize", defaultValue = "5") int pageSize, HttpServletRequest request){
        PageInfo<CarMessage> messageList =     iMessages.findItemByPage(currentPage, pageSize);
        request.setAttribute("messageList", messageList);
        return "myMessage";
    }
}

传三个参数,currentPage 当前页码,pageSize每页显示多少数据,HttpServletRequest用来封装数据
使用@RequestParam进行参数设置,value和defaultValue意指当URL直接请求“/admin/myMessage”时,默认传值参数名称是currentPage,默认值是1;默认传值参数名称是pageSize,默认值是5。这次请求是在别的页面跳转此页面时发生。当进行分页请求时,就会真实传入这2个参数。可以发现request中封装进去了PageInfo对象。这是PageHelper中的东西。里面封装了

n多成员变量,在前台直接调用就可以。

public class PageInfo<T> implements Serializable {
    private static final long serialVersionUID = 1L;
    //当前页
    private int pageNum;
    //每页的数量
    private int pageSize;
    //当前页的数量
    private int size;
 
    //由于startRow和endRow不常用,这里说个具体的用法
    //可以在页面中"显示startRow到endRow 共size条数据"
 
    //当前页面第一个元素在数据库中的行号
    private int startRow;
    //当前页面最后一个元素在数据库中的行号
    private int endRow;
    //总记录数
    private long total;
    //总页数
    private int pages;
    //结果集
    private List<T> list;
 
    //前一页
    private int prePage;
    //下一页
    private int nextPage;
 
    //是否为第一页
    private boolean isFirstPage = false;
    //是否为最后一页
    private boolean isLastPage = false;
    //是否有前一页
    private boolean hasPreviousPage = false;
    //是否有下一页
    private boolean hasNextPage = false;
    //导航页码数
    private int navigatePages;
    //所有导航页号
    private int[] navigatepageNums;
    //导航条上的第一页
    private int navigateFirstPage;
    //导航条上的最后一页
    private int navigateLastPage;

等等东西。很方便使用。下面会介绍怎么使用。

然后再来看Service

@Service
@Transactional(rollbackFor = { RuntimeException.class, Exception.class })
public class MessagesServiceImpl implements IMessages{
 
        @Autowired
        private CarMessageMapper carMessageMapper;
 
        @Override
        public PageInfo<CarMessage> findItemByPage(int currentPage, int pageSize) {
            PageHelper.startPage(currentPage, pageSize);
            List<CarMessage> allMessages = carMessageMapper.findAll();   
            PageInfo<CarMessage> pageInfo = new PageInfo<>(allMessages);
            return pageInfo;
        }
    
}
//设置分页信息保存到threadlocal中
PageHelper.startPage(currentPage, pageSize); //一定要放在查询之前
//紧跟着的第一个select方法会被分页,contryMapper会被PageInterceptor截拦,截拦器会从threadlocal中取出分页信息,把分页信息加到sql语句中,实现了分页查旬
 List<CarMessage> allMessages = carMessageMapper.findAll();   

将list结果集进行pageInfo包裹,返回包裹对象到Controller中。

前天,我使用的是Thymeleaf模板引擎

 <table id="myMessageTable"  data-toggle="table" >
                <thead>
                            <tr>
                                <th>消息日期</th>
                                <th>消息内容</th>
                                <th>消息状态</th>
                                <th>操作</th>
                            </tr>
                         </thead>
                            <tbody>
                            <th:block th:each="messageList : ${messageList.list}">
                                <tr th:attr="id=${messageList.id}">
                                    <td  th:text="${#dates.format(messageList.createtime,'yyyy-MM-dd HH:mm:ss')}"  ></td>
                                    <td th:text="${messageList.content}"></td>
                                    <td>
                                       <th:block th:if="${messageList.status == 0}">
                                            <span>未读</span>
                                        </th:block>
                                        <th:block th:if="${messageList.status == 1}">
                                            <span>已读</span>
                                        </th:block>
                                    </td>
                                    <td>-</td>
                                </tr>
                            </th:block>
                            </tbody>
                </table>
<div th:replace="common/pagination :: pageNav(${messageList})"></div>

pageInfo中有一个成员变量list,封装了分页查询的结果集,所以在前台直接循环pageInfo中的list即可。
使用th:include或者th:replace引入th:fragment定义的分页按钮片段,一定要在循环外,因为传入的要是pageInfo整个对象,而不是list

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<body>
 
<div th:fragment="pageNav(pageInfo)">
 
<div class="fixed-table-pagination" style="display: block;" >
    <div class="pull-left pagination-detail">
    <span class="pagination-info">显示第 <span th:text="${pageInfo.startRow}"></span> 到第 <span th:text="${pageInfo.endRow}"></span> 条记录,总共 <span th:text="${pageInfo.total}"></span>条记录</span>
        <span class="page-list">每页显示 
        <span class="btn-group dropup">
            <button type="button" class="btn btn-default  dropdown-toggle" data-toggle="dropdown">
                <span class="page-size"  th:text="${pageInfo.pageSize}" ></span>
                 <span class="caret"></span>
             </button>
                <ul class="dropdown-menu" role="menu">
                <li  th:class="${pageInfo.pageSize== 5 }?'active':''"><a th:href="@{?pageSize=5}" >5</a></li>
                <li  th:class="${pageInfo.pageSize== 8 }?'active':''"><a th:href="@{?pageSize=8}" >8</a></li>
             </ul>
         </span> 
         条记录
     </span>
     </div>
</div>
 
 
<div   class="dataTables_paginate paging_bootstrap pagination" >
        <ul >
            <li th:if="${pageInfo.hasPreviousPage}">
                <a th:href="@{'?currentPage='+${pageInfo.prePage}}" >
                    ← Previous
                </a>
            </li>
 
            <th:block th:each="nav : ${pageInfo.navigatepageNums}">
                <li th:class="${nav==pageInfo.pageNum}?'active':''"><a th:href="@{'?currentPage='+${nav}}" th:text="${nav}"></a>
                </li>
            </th:block>
 
            <th:block th:if="${pageInfo.hasNextPage}">
                <li>
                    <a th:href="@{'?currentPage='+${pageInfo.nextPage}}" >
                        Next → 
                    </a>
                </li>
            </th:block>
 
        </ul>
    </div>
 
</div>
 
</body>
</html>

这个可以作为通用。在这里直接调用pageInfo所有你需要的成员变量即可。很方便。效果如图。

这是别的页面跳转进来的时候,URL访问路径,并无参数。所以以默认方式分页,默认定位在第一页,每页显示5条数据。

点击第二页的时候,观察URL有参数传入。以传入方式显示。

 

 

相关文章:

  • Pop - Facebook 开源 iOS OS X 动画库
  • 一个程序员的自白(延迟满足)
  • Apache ab 压力测试
  • 依赖注入框架 InversifyJS
  • 10.30T2 二分+前缀和(后缀和)
  • 数据流的压缩、编码及传递困扰
  • Linux基础命令---mkisofs
  • Linux iptables开放特定端口
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • 线段树模板
  • KVO的使用
  • 自动化测试
  • Unicode编码字符 转换成汉字
  • 简单用户管理系统(P-05)
  • typedef 与指针、多维数组
  • 【JavaScript】通过闭包创建具有私有属性的实例对象
  • 【编码】-360实习笔试编程题(二)-2016.03.29
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • exports和module.exports
  • Fastjson的基本使用方法大全
  • fetch 从初识到应用
  • magento2项目上线注意事项
  • Node项目之评分系统(二)- 数据库设计
  • Sass Day-01
  • 从地狱到天堂,Node 回调向 async/await 转变
  • 大数据与云计算学习:数据分析(二)
  • 开发基于以太坊智能合约的DApp
  • 使用权重正则化较少模型过拟合
  • 事件委托的小应用
  • 算法之不定期更新(一)(2018-04-12)
  • 体验javascript之美-第五课 匿名函数自执行和闭包是一回事儿吗?
  • 新版博客前端前瞻
  •  一套莫尔斯电报听写、翻译系统
  • 不要一棍子打翻所有黑盒模型,其实可以让它们发挥作用 ...
  • 整理一些计算机基础知识!
  • ​插件化DPI在商用WIFI中的价值
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • ​软考-高级-系统架构设计师教程(清华第2版)【第15章 面向服务架构设计理论与实践(P527~554)-思维导图】​
  • (3)nginx 配置(nginx.conf)
  • (done) 两个矩阵 “相似” 是什么意思?
  • (Git) gitignore基础使用
  • (Java实习生)每日10道面试题打卡——JavaWeb篇
  • (Matalb回归预测)PSO-BP粒子群算法优化BP神经网络的多维回归预测
  • (第二周)效能测试
  • (二)fiber的基本认识
  • (附程序)AD采集中的10种经典软件滤波程序优缺点分析
  • (一)appium-desktop定位元素原理
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .NET CORE 第一节 创建基本的 asp.net core
  • .net FrameWork简介,数组,枚举
  • .Net通用分页类(存储过程分页版,可以选择页码的显示样式,且有中英选择)
  • .NET性能优化(文摘)
  • @Autowired和@Resource装配
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...