实习心得体会---分页操作20190716

操作系统 ucore lab3实验报告 ucore lab3(虚拟内存管理) 一、实验目的 1.1了解虚拟内存的Page Fault异常处理实现 1.2了解页替算法在操作系统中的实现 二、实验内容 本次实验是在实验二的基础上,借助于页表机制和实验一中涉及的中断异常处理机制,完成Page Fault异常处理和FIFO页替换算法的实现,结合磁盘提供的缓存空间,从而能够支持虚存管理,提供一个比实际物理内存空间“更大”的虚拟内存空间给系统使用。这个实验与实际操作系统中的实现比较起来要简单,不过需要了解实验一和实验二的具体实现。实际操作系统系统中的虚拟内 阅读详情

Mybatis的一个插件,PageHelper,非常方便mybatis分页查询。国内牛人的一个开源项目,有兴趣的可以去看源码,都有中文注释(ps:某些源码一大堆英文,痛哭流涕!)

在github上仓库地址为:Mybatis-PageHelper

它支持基本主流与常用的数据库,这可以在它的文档上看到。这里记录一下使用的基本方法

0.查看文档与使用准备
开发文档有中文文档也有英文文档

PageHelper官方文档


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

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

1.配置拦截器插件

这个是配置在mybatis-config.xml文件中

文档中的示例:

<!-- 
    plugins在配置文件中的位置必须符合要求,否则会报错,顺序如下:
    properties?, settings?, 
    typeAliases?, typeHandlers?, 
    objectFactory?,objectWrapperFactory?, 
    plugins?, 
    environments?, databaseIdProvider?, mappers?
-->
<plugins>
    <!-- com.github.pagehelper为PageHelper类所在包名 -->
    <plugin interceptor="com.github.pagehelper.PageInterceptor">
        <!-- 使用下面的方式配置参数,后面会有所有的参数介绍 -->
        <property name="param1" value="value1"/>
    </plugin>
</plugins>


我的配置:

   

 <plugins>
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
            <!-- config params as the following -->
            <!--<!–分页参数合理化  –>-->
            <property name="reasonable" value="true"/>
        </plugin>
    </plugins>


一些配置参数的说明可以参考文档: 【分页插件参数介绍】

这里就说明一下reasonable的配置:

reasonable:分页合理化参数,默认值为false。当该参数设置为 true 时,pageNum<=0 时会查询第一页,pageNum>pages(超过总数时),会查询最后一页。默认false 时,直接根据参数进行查询。

那么如何选择这些配置参数,文档中也给出了详细说明:【如何选择配置这些参数】

2.在代码中使用
官方文档也有这部分说明和案例,那么我就以自己的使用案例

 

  @RequestMapping("/emps")
    public String list(@RequestParam(required = false,defaultValue = "1",value = "pn")Integer pn,
                       Map<String,Object> map){
 
        //引入分页查询,使用PageHelper分页功能
        //在查询之前传入当前页,然后多少记录
        PageHelper.startPage(pn,5);
        //startPage后紧跟的这个查询就是分页查询
        List<Employee> emps = employeeService.getAll();
        //使用PageInfo包装查询结果,只需要将pageInfo交给页面就可以
        PageInfo pageInfo = new PageInfo<>(emps,5);
        //pageINfo封装了分页的详细信息,也可以指定连续显示的页数
 
        map.put("pageInfo",pageInfo);
        return "list";
    }

以上使用说明:
·在查询调用方法前声明分页信息(当前页,每页记录数)

·在查询调用方法对查询结果进行包装成PageInfo对象,也可以是定连续显示的页数,这也是常用功能。

注意:都是与查询方法紧挨着的,不要中间夹杂其它无关语句

之后把信息放在ModelAndView中就可以在前台访问了。

下面说一下为什么要把查询结果包装成PageInfo对象

3.PageInfo类说明

类源码(更多源码去github上查看即可):

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;
 
    public PageInfo() {
    }
 
    /**
     * 包装Page对象
     *
     * @param list
     */
    public PageInfo(List<T> list) {
        this(list, 8);
    }
 
    /**
     * 包装Page对象
     *
     * @param list          page结果
     * @param navigatePages 页码数量
     */
    public PageInfo(List<T> list, int navigatePages) {
        if (list instanceof Page) {
            Page page = (Page) list;
            this.pageNum = page.getPageNum();
            this.pageSize = page.getPageSize();
 
            this.pages = page.getPages();
            this.list = page;
            this.size = page.size();
            this.total = page.getTotal();
            //由于结果是>startRow的,所以实际的需要+1
            if (this.size == 0) {
                this.startRow = 0;
                this.endRow = 0;
            } else {
                this.startRow = page.getStartRow() + 1;
                //计算实际的endRow(最后一页的时候特殊)
                this.endRow = this.startRow - 1 + this.size;
            }
        } else if (list instanceof Collection) {
            this.pageNum = 1;
            this.pageSize = list.size();
 
            this.pages = this.pageSize > 0 ? 1 : 0;
            this.list = list;
            this.size = list.size();
            this.total = list.size();
            this.startRow = 0;
            this.endRow = list.size() > 0 ? list.size() - 1 : 0;
        }
        if (list instanceof Collection) {
            this.navigatePages = navigatePages;
            //计算导航页
            calcNavigatepageNums();
            //计算前后页,第一页,最后一页
            calcPage();
            //判断页面边界
            judgePageBoudary();
        }
    }
 
 
.......
}


这里只列出所有属性和构造方法,那么可以清晰的看到一些属性的含义,一些属性是如何初始化,并且初始化值是怎样的,更多详细情况可以自己去查看源码,都有中文注释

那么可以很方便在页面进行值的获取输出

4.在页面获取值(实现分页)

<!--通过bootstrap的栅格系统布局-->
<div class="container">
 
    <!--标题-->
    <div class="row">
        <div class="col-md-12">
            <h1>SSM-CRUD</h1>
        </div>
 
    </div>
 
    <!--按钮-->
    <div class="row">
        <div class="col-md-4 col-md-offset-8">
            <button class="btn btn-primary">新增</button>
            <button class="btn btn-danger">删除</button>
        </div>
    </div>
 
    <!--显示表格数据-->
    <div class="row">
        <div class="col-md-12">
            <table class="table table-hover">
                <tr>
                    <th>#</th>
                    <th>empName</th>
                    <th>gender</th>
                    <th>email</th>
                    <th>deptName</th>
                    <th>操作</th>
                </tr>
 
 
                <c:forEach items="${pageInfo.list}" var="emp">
                    <tr>
                        <th>${emp.empId}</th>
                        <th>${emp.empName}</th>
                        <th>${emp.gender=="M"?"男":"女" }</th>
                        <th>${emp.email}</th>
                        <th>${emp.department.deptName}</th>
                        <th>
                            <button class="btn btn-primary">
                                <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
                                编辑
                            </button>
 
                            <button class="btn btn-danger">
                                <span class="glyphicon glyphicon-trash" aria-hidden="true"></span>
                                删除
                            </button>
 
                        </th>
                    </tr>
                </c:forEach>
 
            </table>
        </div>
 
    </div>
 
    <!--显示分页信息-->
    <div class="row">
        <!--文字信息-->
        <div class="col-md-6">
            当前第 ${pageInfo.pageNum} 页.总共 ${pageInfo.pages} 页.一共 ${pageInfo.total} 条记录
        </div>
 
        <!--点击分页-->
        <div class="col-md-6">
            <nav aria-label="Page navigation">
                <ul class="pagination">
                    
                    <li><a href="${pageContext.request.contextPath}/emps?pn=1">首页</a></li>
                    
                    <!--上一页-->
                    <li>
                        <c:if test="${pageInfo.hasPreviousPage}">
                            <a href="${pageContext.request.contextPath}/emps?pn=${pageInfo.pageNum-1}" aria-label="Previous">
                                <span aria-hidden="true">«</span>
                            </a>
                        </c:if>
                    </li>
 
                    <!--循环遍历连续显示的页面,若是当前页就高亮显示,并且没有链接-->
                    <c:forEach items="${pageInfo.navigatepageNums}" var="page_num">
                        <c:if test="${page_num == pageInfo.pageNum}">
                            <li class="active"><a href="#">${page_num}</a></li>
                        </c:if>
                        <c:if test="${page_num != pageInfo.pageNum}">
                            <li><a href="${pageContext.request.contextPath}/emps?pn=${page_num}">${page_num}</a></li>
                        </c:if>
                    </c:forEach>
 
                    <!--下一页-->
                    <li>
                        <c:if test="${pageInfo.hasNextPage}">
                            <a href="${pageContext.request.contextPath}/emps?pn=${pageInfo.pageNum+1}"
                               aria-label="Next">
                                <span aria-hidden="true">»</span>
                            </a>
                        </c:if>
                    </li>
                    
                    <li><a href="${pageContext.request.contextPath}/emps?pn=${pageInfo.pages}">尾页</a></li>
                </ul>
            </nav>
        </div>
 
    </div>
 
 
</div>

最后显示:

以上很常见的分页需求,可以非常方便的使用。
并且支持各种数据库,可以有多种方式进行引入插件,对于springBoot也有非常好的整合使用。


PageHelpe开源地址

github项目地址:https://github.com/pagehelper/Mybatis-PageHelper
码云 项目地址:http://git.oschina.net/free/Mybatis_PageHelper

 

实训笔记20190716 目录Python基础Python类型转换字符串的切片:Python输出 Python基础 注释 Python注释分为单行注释和多行注释 1. 单行注释 #后面是注释 2. 多行注释 “”" 里面是注释""" 变量 python是一门强类型语言,不需要声明,直接变量赋值即可,且必须赋值 a=10 #Python中会自动识别数据类型 print(b,type(b)) #python... 阅读详情

相关推荐

python 抖音采集_python爬取抖音视频的实例详解

import requestsimport jsonimport reimport osfrom pprint import pprint as ppimport queueclass DouYin:header = {'accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*...

weixin_35795675的博客 1864

EL表达式中的requestScope标签的使用${XXXX}

throw new LoginException("用户名或者密码错误"); throw new LoginException("登录失败"); catch{ request.setAttribute("register_message",e.getMessage()); request.getRequestDispatcher("/client/login.jsp").forward(request,response); } <td> <font color="#ff0000"

weixin_44769957的博客 1261

实现自己的AI视频监控系统-第一章-视频拉流与解码4(重点)

使用本章节代码请引用此优快云链接,尊重知识、尊重他人劳动。这一小节将正式进入代码实现部分。我们会结合实际业务需要和拉流解码流程实现一个灵活、轻便、易用的视频拉流解码模块,支持多路视频拉流解码且可以动态更新更新内部参数。在开始设计之初,我们首先考虑的是使用大家所熟知的 **OpenCV(cv2.VideoCapture)**来实现拉流和解码功能。它的 API 简单直接,几行代码就能实现从网络流中读取帧,对于快速原型验证来说非常方便。然而,在经过深入的调研和测试后,我们发现 OpenCV 在处理多路视频流、追

soulproficiency的博客 2268

${requestScope.}与request.getParameter区别?

requestScope通常是将某个变量或者对象在servlet或者acion中通过request.setAttribute()方法放入到request对象中,然后在页面中使用requestScope来进行数据的显示的 而request.getparameter则是则是更多的用在servlet或者action中,它的作用是接受表单提交来的数据,比如你的jsp页面中的表单提交的数据。 所以两者的

小草房童鞋 1250

Simulink与C/C++的无缝对接:自定义结构体变量导入实战指南

本文详细介绍了如何将C/C++自定义结构体导入Simulink环境,实现无缝数据对接。通过编写标准C头文件、配置MEX编译环境(如MinGW),并利用`Simulink.importExternalCTypes`函数,可将结构体转换为Simulink Bus对象,从而提升复杂系统模型的可读性、可维护性及仿真与代码生成效率。

weixin_29093017的博客 481

IAR许可证Generation 18代际不匹配问题解析与解决

IAR Embedded Workbench 的许可证机制采用‘代际(Generation)’模型,而非简单版本号匹配——这是一种基于数字签名算法、加密协议和硬件绑定策略演进的授权安全体系。Generation 18 是 v9.30 及以上版本强制要求的许可代际标准,对应 ECDSA 签名与增强型硬件指纹校验,旨在提升防破解能力与平台适配性。当旧版许可证(如 Generation 16/17)被用于新 IDE 时,启动器会在本地完成代际校验并直接拦截,导致‘The generation feature is

weixin_34203832的博客 344

Mybatis 带条件的前后端分页查询(pageHelper + pagination)

目标 以分页的形式把管理员信息显示到页面上 特殊需求:后端兼顾带关键词查询或者不带关键词查询,为了方便代码不冗余,写一个接口,后端采用PageHelper插件,前端采用Pagation分页插件 思想 这里以Admin为例, 梳理大致流程 1.编写AdminController.getPage(pageNum,pageSize,keyWord,modelMap); 这里注意,如何灵活的携带关键词或者不携带关键词进行分页查询 ,需要给keyWord设置一个默认值,默认为空 2. 在Controller中调用

w1020471486的博客 1546

Android 10.0 SystemUI 屏蔽状态栏消息推送弹出的悬浮通知

在状态栏中,有一些通知类似 消息推送 弹出的 悬浮通知,弹出30秒之后会消失掉 要想屏蔽掉这些通知,首选知道这些通知是怎么产生的 通知类型 NotificationContentInflater.java 详细的介绍各种通知的类型 frameworks/base/packages/SystemUI/src/com/android/systemui/statusbar/notification/row/NotificationContentInflater.java /** * The defau

安卓兼职framework和app工程师的博客 1542

C标签,Jstl的c:if 的使用(将数据表中的数字展示到jsp页面显示为文字)

&lt;c:forEach items="${list}" var="emp"&gt; &lt;tr bgcolor="white" align="center"&gt; &lt;td&gt;${emp.id}&lt;/td&gt; &lt;td&gt;${emp.ename}&

zhang1409399037的博客 1594

YOLOv11的多任务学习:检测+分割+姿态估计-(扩展模型头部分支,实现多任务联合训练)

YOLOv11作为Ultralytics团队于2024年9月发布的最新YOLO系列模型,在前代版本基础上进行了多项架构创新,使其成为支持多任务学习的理想框架。其核心改进包括引入C2PSA(跨阶段局部自注意)模块,将跨阶段局部网络和自注意机制优势结合,使模型能够更有效地跨多层捕获上下文信息。C3k2模块取代了之前的C2f模块,作为CSP Bottleneck的自定义实现,使用两个较小卷积核而非一个大卷积核,在保持准确性的同时提高了效率。 多任务学习(Multi-Task Learning, MTL)在YOL

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 655

31.华为路由器:PPPOE配置模拟实验及NAT配置

实验环境 pppoe-client上面的接口信息 [AR1]dis ip interface brief *down: administratively down ^down: standby (l): loopback (s): spoofing The number of interface that is UP in Physical is 2 The number of interface that is DOWN in Physical is 1 The number of interface

迷逝 8116

实习心得体会---SSM学习笔记之注解20190716

1、使用@ModelAttribute和@SessionAttributes传递和保存数据 SpringMVC支持使用@ModelAttribute和@SessionAttributes在不同的模型(model)和控制器之间共享数据。@ModelAttribute主要有两种使用方式,一种是标注在方法上,一种是标注在Controller方法参数上。 当@ModelAt...

letgoDream的博客 1460

Claude Code 学习笔记之一:理解 Agentic Loop 与内置工具

本文介绍了Claude Code这一终端智能助手的工作原理与使用方式。作者从ABAP开发经验出发,指出学习Claude Code的高级用法具有长期价值。文章详细解析了Claude Code的Agentic Loop机制:通过大语言模型进行推理,借助各类工具执行任务,并循环收集上下文、执行操作、验证结果三个步骤。系统阐述了Claude Code支持的五大类工具及其扩展方式,说明了其访问本地资源的范围和自治处理能力,同时介绍了权限模式等安全机制。最后提供了从小任务开始、充分探索、及时引导、使用CLAUDE.md

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 546

20190716——numpy的优势

numpy介绍 numerical (数值化的)+ python numpy是一个开源的python科学计算库,用于快速处理任意维度的数组 n d array n-任意 d-dimension 维度 array-数组 先将数据存储与ndarray一种数据类型 numpy使用ndarray对象来处理多维数组,该对象是一个快速而灵活的大数据容器 jupyter notebook 使用python的列表...

寄蜉蝣于天地,渺沧海之一粟。 2504

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

段错误问题——20190716

段错误问题——20190716 昨天在写代码的时候,碰到了编译成功,但是运行时显示段错误的问题。 添加打印定位到了1006行: pstpdu_InitialUEMessage->protocolIEs->next->next->value.value.decoded.pdu_UserLocationInformation->choice = 2; 发现此处的pdu_...

weixin_44961081的博客 256

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

20190716

1. Computer Abstractions and Technology 1.1 Introduction 1.2 Eight Great Ideas in computer 1.3 Below Your Program 1.4 Under the Covers 1.5 Technologies for Building Processors and memory 1...

401

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

20190716-jQuery实例

20190716-jQuery实例 ——Javee 案例六: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title></title&g...

Javee的博客 267

字符串赋值——20190716

字符串赋值——20190716 昨天在代码编译时遇到了下面的错误: 检查后发现全是字符串赋值问题,以下是之前的赋值方式: 之后我尝试调用strcpy函数进行赋值,报错就消失了: 需要注意的是,调用此函数需要添加一个头文件: #include <string.h> ...

weixin_44961081的博客 163

20190716-T1-礼物

呵呵,我暴力WA了 这个题充分考验了大家对数学的理解(麦蒙大多在胡诌) 但是确实如此啊。 看数据范围想状压。(我额嗯嗯想到暴力?) 然后设出一个可爱的$dp$式(主语当然不是我,是出题人大佬) $f_s$表示二进制组昂态(状态)为$s$时的期望。 那么我们可以从$s'$转移过来,其中$s' or\ s = s$或$s' and\ s =s$($and$和...

165

模拟测试20190716

T1:礼物 水题一道,谁爆零谁傻逼,谁考完后5minA谁智障 (天皇:我15min就A了,期望dp不倒着就是傻;DeepinC:你说啥?) T2:通讯 tarjan模板,先缩点,贪心稍微需要思考,只要对不是0所在强联通分量的点取一条最小入边就好了 (cbx曰:谁爆零谁cbx) T3:奇袭 神题标记 考试的时候刚开始没思路,就想着打个n^5暴力,然后打着打着发现了一些性质,删了层循...

weixin_30791095的博客 188

​[20190716]十进制转换其他进制脚本.txt

[20190716]十进制转换其他进制脚本.txt $ cat 10x.sql column base10 format 99999999999999999999 column base&&...

202

20190716-被水题淹没

上午7点到8点和午后一小时,是烹制OIer的最好时刻。因为这时OIer放松而疲惫,肉质松软,适合烤制。用上等香料腌制,果木炭烤,佐以孜然、辣椒,色泽金黄,外酥里嫩的蒟蒻,成为当地招待来宾,欢庆佳节的首选。 ——摘自《舌尖上的OI》(作者:买梦湖州) 完戏,考试炸了,话说这考试频繁的要命。 后来(考完)我才发现,这不是模拟题,而是[NOIP2016]的模拟题,唔。 题也许不...

209

20190716 DP 练习赛

T1 祖玛 问题描述:温温是一只懒惰的小萌猪。他虽然身负重任,但还是每天上班都偷偷玩游戏。今天,他决定玩一个叫做《祖玛》的老游戏。不过,温温打开游戏 之后,发现这个游戏和印象里不太一样。游戏开始时,温温会得到一串宝石,第i个宝石的颜色是ci。游戏的目标是摧毁所有宝石。在游戏的每一秒钟,温温可以选择宝石序列的任意一个回文子串(即连续的若干个宝石,从前往后和从后往前看颜色是一样的),把这些宝石摧毁。...

J_lxj 的博客 291

mysql ignore 1 lines_20190716MySQL基础操作(一)

一、基础知识1、注释方法 :--+空格 或 #2、闪电I执行光标所处命令最近的;截止的语句或所选区域第一条命令语句3、从外部文件导入数据,csv 用 ',',制表符隔开的txt文件 用'\t';文件路径是用 ’/‘,不能单用'\',可以用'\\';文件路径名称不能是中文,必须是英文;如果导入外部数据,报错无权限,可以运行这条代码试试‘SET GLOBAL local_infile=1;’4、...

weixin_35723352的博客 847

[C++]课题笔记20190716

static の使い方 書く場所 グローバル変数の位置 {}に囲まれていないところ static int anpan;//そのファイル内でのみ有効 extern int anpan;//extern別のファイルで参照する場合extern同じ変数宣言(そとにあるよ) [extern](https://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/...

卡酷酷的博客 257
上一篇: javaWeb项目之web.xml配置
下一篇: 实习心得体会---SSM框架下过滤器和拦截器20190717
iamlinuxasd
博客等级 码龄10年 4粉丝 35原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值