MyBatis实现分页功能及MyBatis的特殊符号---超详细介绍

news2024/11/25 12:43:13

一,分页的概念

分页是一种将大量数据或内容分割成多个页面以便逐页显示的方式。在分页中,数据被分割成一定数量的页,每页显示一部分数据或内容,用户可以通过翻页或跳分页是一种将大量数据或内容分割成多个页面以便逐页显示的方式。在分页中,数据被分割成一定数量的页,每页显示一部分数据或内容,用户可以通过翻页或跳转页面来浏览更多内容。转页面来浏览更多内容

1.1 分页应用场景

数据展示:

     当需要展示大量数据,并将其划分为多个页面进行逐页查看时,可以使用分页应用。例如,在电子商务网站上展示商品列表或搜索结果时,分页应用可以提供良好的用户体验

数据浏览:

     当需要在一个长列表或长文档中进行浏览时,分页应用可以将内容分割成多个页面,方便用户逐页阅读或浏览。例如,在新闻网站上浏览新闻文章或在书籍电子阅读器中阅读电子书时,分页应用可以让用户更加方便地跳转页面

搜索结果分页:

     当进行搜索操作时,检索出来的结果可能非常庞大,分页应用可以将搜索结果分页展示,以便用户逐页查看结果。这在搜索引擎、论坛或社交媒体平台等场景下非常常见

1.2 分页的优点

提高性能:

    分页应用可以将大量数据分割成多个页面,只加载当前页面所需的数据,从而减轻数据库和服务器的负载,提高查询和渲染速度。

改善用户体验:

   通过分页,用户可以更方便地浏览和导航大量数据,减少页面滚动和加载时间,提高交互效率和用户满意度。

灵活导航:

    分页应用可以为用户提供灵活的导航选项,允许用户跳转到特定页面,或者调整每页显示的数据量,以满足个性化需求。

数据安全性:

    通过限制每页数据的数量,分页应用可以限制对数据的访问,提高数据的安全性和隐私保护。

二,分页功能的实现

本文章根据上篇文章内容进行扩展实现分页功能,上一篇连接地址:简单的模糊查询

为了让分页更加提高效率我们用的是一个PageHelper插件,让插件来来帮助我们实现这个功能

pom.xml导入PageHelper插件

    <!-- **********************  分页 Pom依赖 ********************** -->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.1.2</version>
    </dependency>

mybatis.xml配置拦截器

注意:该配置受dtd约束影响,要注意配置的位置,不然根目录会报错

 <plugins>
        <!-- 配置分页插件PageHelper, 4.0.0以后的版本支持自动识别使用的数据库 -->
        <plugin interceptor="com.github.pagehelper.PageInterceptor">
        </plugin>
    </plugins>

Mapper.xml的配置:

  <select id="mhcx4" resultType="com.Bing.model.Book" parameterType="java.util.Map" >
    select
    <include refid="Base_Column_List" />
    from t_mvc_book
    where bname like concat('%',#{bname},'%')
  </select>

在uils导入PageBean工具类

package com.Bing.util;

import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Map;

public class PageBean implements Serializable {

	private static final long serialVersionUID = 2422581023658455731L;

	//页码
	private int page=1;
	//每页显示记录数
	private int rows=10;
	//总记录数
	private int total=0;
	//是否分页
	private boolean isPagination=true;
	//上一次的请求路径
	private String url;
	//获取所有的请求参数
	private Map<String,String[]> map;
	
	public PageBean() {
		super();
	}
	
	//设置请求参数
	public void setRequest(HttpServletRequest req) {
		String page=req.getParameter("page");
		String rows=req.getParameter("rows");
		String pagination=req.getParameter("pagination");
		this.setPage(page);
		this.setRows(rows);
		this.setPagination(pagination);
		this.url=req.getContextPath()+req.getServletPath();
		this.map=req.getParameterMap();
	}
	public String getUrl() {
		return url;
	}

	public void setUrl(String url) {
		this.url = url;
	}

	public Map<String, String[]> getMap() {
		return map;
	}

	public void setMap(Map<String, String[]> map) {
		this.map = map;
	}

	public int getPage() {
		return page;
	}

	public void setPage(int page) {
		this.page = page;
	}
	
	public void setPage(String page) {
		if(null!=page&&!"".equals(page.trim()))
			this.page = Integer.parseInt(page);
	}

	public int getRows() {
		return rows;
	}

	public void setRows(int rows) {
		this.rows = rows;
	}
	
	public void setRows(String rows) {
		if(null!=rows&&!"".equals(rows.trim()))
			this.rows = Integer.parseInt(rows);
	}

	public int getTotal() {
		return total;
	}

	public void setTotal(int total) {
		this.total = total;
	}
	
	public void setTotal(String total) {
		this.total = Integer.parseInt(total);
	}

	public boolean isPagination() {
		return isPagination;
	}
	
	public void setPagination(boolean isPagination) {
		this.isPagination = isPagination;
	}
	
	public void setPagination(String isPagination) {
		if(null!=isPagination&&!"".equals(isPagination.trim()))
			this.isPagination = Boolean.parseBoolean(isPagination);
	}
	
	/**
	 * 获取分页起始标记位置
	 * @return
	 */
	public int getStartIndex() {
		//(当前页码-1)*显示记录数
		return (this.getPage()-1)*this.rows;
	}
	
	/**
	 * 末页
	 * @return
	 */
	public int getMaxPage() {
		int totalpage=this.total/this.rows;
		if(this.total%this.rows!=0)
			totalpage++;
		return totalpage;
	}
	
	/**
	 * 下一页
	 * @return
	 */
	public int getNextPage() {
		int nextPage=this.page+1;
		if(this.page>=this.getMaxPage())
			nextPage=this.getMaxPage();
		return nextPage;
	}
	
	/**
	 * 上一页
	 * @return
	 */
	public int getPreivousPage() {
		int previousPage=this.page-1;
		if(previousPage<1)
			previousPage=1;
		return previousPage;
	}

	@Override
	public String toString() {
		return "PageBean [page=" + page + ", rows=" + rows + ", total=" + total + ", isPagination=" + isPagination
				+ "]";
	}
}

Mapper类方法:

    List<Book> mhcx4(@Param("bname") String bname);

在Mapper.xml配置的方法名进行定义相对应的接口和实现类

接口方法:

    List<Book> mhcx4(String bname, PageBean pageBean);

实现类:

 @Override
    public List<Book> mhcx4(String bname, PageBean pageBean) {
         if(pageBean!=null && pageBean.isPagination()){
             PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
         }
         List<Book> books=bookMapper.mhcx4("圣墟");
         if(pageBean!=null && pageBean.isPagination()){
             PageInfo<Book> info = new PageInfo<Book>(books);
             System.out.println("当前页:"+ info.getPageNum());
             System.out.println("展示记录数:"+info.getPageSize());
             System.out.println("符合查询条件的总记录:"+info.getTotal());
             pageBean.setTotal((int) info.getTotal());
         }
        return books;
    }

测试:

    @Test
    public void mhcx4() {
        PageBean pageBean=new PageBean();//实例化PageBean
        pageBean.setPage(2);//第几页
        pageBean.setRows(15);//显示的条目
        bookBiz.mhcx4("圣墟",pageBean).forEach(System.out::println);//模糊查询
    }

运行结果:

 

如果不想用分页功能单纯的想展示所有数据的话,在测试的时候调用下面方法即可

pageBean.setPagination(false);

三,Mybatis特殊字符

 MyBatis 中,有几个特殊字符需要进行转义或处理,以避免 SQL 解析错误或相关问题。以下是一些常见的特殊字符及其处理方式

< 和 >

     这两个字符在 XML 文件中有特殊含义,因此需要进行转义。可以使用 &lt; 和 &gt; 分别表示 < 和 >

&

     也需要进行转义,可以使用 &amp; 表示

'

    当在 SQL 查询语句中使用字符串参数时,需要注意单引号的处理。可以使用双引号包裹字符串,或者使用两个单引号来转义一个单引号。例如:SELECT * FROM user WHERE name = "John" 或 SELECT * FROM user WHERE name = 'O''Connor'

% 和 _

     在使用 LIKE 语句进行模糊查询时,% 表示任意数量的字符,而 _ 表示一个字符。如果需要在字符串中使用字面量 % 和 _,则需要使用 \ 进行转义。例如:SELECT * FROM user WHERE name LIKE '%\%%' ESCAPE '\'

| 和 &

    在使用动态 SQL 标签(如 <if><choose><foreach> 等)时,| 表示逻辑 OR 运算符,而 & 表示逻辑 AND 运算符。如果要显示字面量的 | 和 & ,则需要使用 \ 进行转义。例如:<![CDATA[${param1} \| ${param2}]]>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/922835.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI 浪潮下,W3AI 如何增强和激励 Web3 玩家研究和决策力?

更加个性化的 AI 服务是怎样的&#xff1f;近年来&#xff0c;不少主打 AI 服务的 Web3 初创项目开始兴起&#xff0c;凭借语音、文字、图像等全方位的用户数据跟踪和使用习惯定义&#xff0c;场景化的 AI Web3 产品开始围绕用户的工作、生活日常提供智能服务。这其中&#xff…

在router中使用pinia、在组件外使用pinia时 报错没有激活pinia

getActivePinia was called with no active Pinia. Did you forget to install pinia? 我想在路由守卫中使用store中部的数据&#xff0c;但是拿不到仓库&#xff0c;提示pinia没激活 解决方案&#xff1a;借鉴vben-admin 在每个模块中都把pinia和当前的仓库绑定一份暴漏出去…

微服务(rpc)

微服务&#xff08;rpc&#xff09; 微服务必备的模块生产者消费者管理平台流量控制集群情况下如何做到流量监控 负载均衡服务发现和治理序列化传输序列化和反序列化 微服务是一种架构风格&#xff0c;将一个应用程序拆分为一组小型、独立的服务&#xff0c;每个服务都可以独立…

Linux: 使用scp命令复制文件夹报 not a regular file 错误解决

使用scp 命令复制文件夹报 not a regular file 错误解决 解决办法&#xff1a; 加入参数 -r&#xff1a; 递归复制整个目录 scp命令参数详解

【MyBatis】:PageHelper分页插件与特殊字符处理

目录 一、PageHelper介绍 二、PageHelper使用 1. 导入pom依赖 2. Mybatis.cfg.xml 配置拦截器 3. 配置 Mapper.xml 4. 编写测试 三、特殊字符处理 1. 使用转义字符 2. 使用CDATA 区段 一、PageHelper介绍 PageHelper 是 Mybatis 的一个插件&#xff0c;这里就不扯了&a…

Unity——DOTween插件使用方法简介

缓动动画既是一种编程技术&#xff0c;也是一种动画的设计思路。从设计角度来看&#xff0c;可以有以下描述 事先设计很多基本的动画样式&#xff0c;如移动、缩放、旋转、变色和弹跳等。但这些动画都以抽象方式表示&#xff0c;一般封装为程序函数动画的参数可以在使用时指定&…

JUC初识

JUC 是什么 java.util.concurrent 在并发编程中使用的工具包 从线程start 开始 package com.jhj.Thread;public class ThreadDemo {public static void main(String[] args) {Thread t1 new Thread(() -> {}, "t1");t1.start();} }start 方法调的是native sta…

java:Tomcat

文章目录 背景服务器web 服务器服务资源的分类服务器软件的分类nginx 和 tomact总结 安装Tomcatbrew安装官网压缩包安装IDEA集成IDEA插件 说明 背景 在讲 Tomcat 是啥之前&#xff0c;我们先来了解一些概念。 服务器 可以理解为一个高性能的电脑&#xff0c;但是这个电脑现在…

Qt6和Rust结合构建桌面应用

桌面应用程序是原生的、快速的、安全的&#xff0c;并提供Web应用程序无法比拟的体验。 Rust 是一种低级静态类型多范式编程语言&#xff0c;专注于安全性和性能&#xff0c;解决了 C/C 长期以来一直在努力解决的问题&#xff0c;例如内存错误和构建并发程序。 在桌面应用程序开…

如何给开源仓库提交pull request?

Pull Request&#xff08;PR&#xff09;是一种在基于版本控制系统的协作开发中使用的功能&#xff0c;它允许开发人员将自己所做的代码更改&#xff08;commits&#xff09;提交给项目的主要代码库。具体而言&#xff0c;当在分支中做出代码更新后&#xff0c;开发人员可以发起…

射频有源器件的动态范围和交越失真

射频有源器件的动态范围和交越失真 1、增益压缩 一个输入信号Vin经过一个非线性网络后输出为Vout&#xff0c;Vout与Vin用泰勒级数的关系表示&#xff1a; Vout a0 a1*Vin a2*Vin^2 a3*Vin^3 …… a0为直流输出&#xff0c;a1为线性输出&#xff0c;a2为平方输出&…

Android 基础知识

一、Activity 1、onSaveInstanceState(),onRestoreInstanceState的调用时机 onSaveInstanceState 调用时机 从最近应用中选择运行其他程序时 但用户按下Home键时 屏幕方向切换时 按下电源案件时 从当前activity启动一个新的activity时 onRestorInstanceState调用时机 只…

windows下安装go环境 和vscode中go扩展

1. 首先安装GO Go下载地址&#xff1a;go.dev 选择相对应的版本&#xff0c;下载&#xff0c;运行安装程序&#xff0c;并打开命令提示符&#xff0c;运行 go env &#xff0c;确认已经安装go 注意关注其中GOPATH和GOROOT&#xff0c;这两个地址可以在系统环境变量中进行设置…

在其他python环境中使用jupyter notebook

1、切换到目标python环境 activate 目标python环境 2、安装notebook内核包 pip install ipykernel 3、加环境加入到notebook中 python -m ipykernel install 目标python环境 4、切换到base环境 activate base 5、打开目标项目的对应盘 如果&#xff0c;项目在c盘&…

docker-maven-plugin直接把镜像推到私有仓库

接着上篇 推送到本地docker 我们已经把服务做成镜像推到docker&#xff0c;也可以通过docker login 私有地址&#xff0c;去push。麻烦 直接上代码 1、pom改动 <properties><docker.registry>eco-registry.XXX.com</docker.repostory><docker.registry…

云从科技“AI困局”:上半年营收腰斩、亏损超3亿

“AI四小龙”云从科技难“从容”&#xff1f; 8月12日&#xff0c;云从科技集团股份有限公司(下称“云从科技”,688327.SH)公布了2023半年报。上半年云从科技推出“从容”大模型&#xff0c;但此后其迎来大规模解禁。 5月29日&#xff0c;云从科技宣布将4.55亿股股份解除限售…

如何选择合适的供应商管理系统?

供应商管理系统可以对企业的业务及其日常运营产生深远影响。该解决方案可集中管理采购、预算编制、供应商选择、交付跟踪、发票开具和报告。管理这些流程既费时又费钱&#xff0c;这也解释了为什么一半以上的企业目前都将数字化转型作为重中之重。 但是&#xff0c;如何选择合…

MediaPlayer音频与视频的播放介绍

作者&#xff1a;向阳逐梦 Android多媒体中的——MediaPlayer&#xff0c;我们可以通过这个API来播放音频和视频该类是Androd多媒体框架中的一个重要组件&#xff0c;通过该类&#xff0c;我们可以以最小的步骤来获取&#xff0c;解码和播放音视频。 它支持三种不同的媒体来源…

Binder通信的核心思想

Binder到底是什么&#xff1f;Binder通信到底是怎么实现的&#xff1f;脱离复杂的Android Framework代码&#xff0c;用最简单的方式来理解下什么是Binder通信。 关于IPC通信 在Linux系统中&#xff0c;正常运行的两个进程A和B&#xff0c;它们之间如果要进行数据的通信&#x…

iview时间控件 动态不可选日期 可选择24小时范围内 时间往后退24小时

演示 html 设定 起始时间 触发on-change 方法结束时间 options 动态设置不可选择的日期。 <!-- 起始时间 --> <FormItem :label"$t(startTime)" prop"startTime"><DatePickertransfertype"datetime":placeholder"$t(pleas…