Mybatis中的分页查询,以及对于特殊符号的处理

news2024/11/24 12:01:45

目录

一.分页查询

1.老版本的分页查询 (通过工具类BaseDao来实现)

2.利用Mybatis实现分页效果

2.1最低级版本(利用limit实现)

首先在xml定义分页需要的方法

然后在bookbiz实现方法

 其次在bookbizImpl继承此方法,并且重写

 最后在demo里面测试方法,并且遍历出来数据

 2.2通过PageHelper插件来进行数据遍历

在Pom.xml导入插件

在Mybatis.cfg.xml配置拦截器

导入一个工具类用于完成分页实现

在bookmapper.xml中实现分页方法

在bookbiz定义接口

实现接口的方法,并且重写

最后测试方法,打印内容

 二.特殊字符处理

1.mybatis中为什么要进行特殊字符处理

2.两种特殊字符处理方式的应用

2.1通过 -进行特殊字符处理

定义一个方法用于查询价格之间的区间查询

定义一个dto的方法用于特殊字符处理方式的应用

实现方法的接口,和在接口实现类重写方法

打印并且测试方法

 2.2同过> <;实现特殊字符的实现

在前者的基础上注释   

后面三部操作都是一样的,所以小编就直接将运行结果弄出来了


一.分页查询

关于这个,也是老生常谈的一个话题了!为什么要分页很简单,为了缓解服务器一次性查询出大量数据所带来的压力。以及更好的将数据展示出来,提高服务器的资源利用率!

1.老版本的分页查询 (通过工具类BaseDao来实现)

须要调用executeQuery(String sql, Class<T> clz, PageBean pageBean)这个方法才能够实现分页效果,在其中

         String countSQL = getCountSQL(sql);//符合条件的总记录数

         String pageSQL = getPageSQL(sql, pageBean);// 符合条件的某一页数据

最后在返回指定的查询结果

2.利用Mybatis实现分页效果

2.1最低级版本(利用limit实现)

首先在xml定义分页需要的方法

select id="selectBylikesBname"  resultType="com.lz.model.Book"  parameterType="java.util.Map">
    select
    <include refid="Base_Column_List"/>
    from   t_mvc_book
    where  bname like  #{bname}  limit  #(start),#(size)
  </select>

在其中 id就是方法名, paremeterType是用来存储 start,siza

然后在bookbiz实现方法

 List<Book> selectBylikesBname(Map map);

 其次在bookbizImpl继承此方法,并且重写

 @Override
    public List<Book> selectBylikesBname(Map map) {
        return  bookMapper.selectBylikesBname(map);
    }

 最后在demo里面测试方法,并且遍历出来数据

 @Test
    public void  selectByBname() {
        Map  map=new HashMap();
        map.put("bname","%圣墟%");
        map.put("start",10);
        map.put("size",10);
        this.bookBiz.selectBylikesBname(map).forEach(System.out::println);
    }

 

 2.2通过PageHelper插件来进行数据遍历

在Pom.xml导入插件

<dependency>     <groupId>com.github.pagehelper</groupId>     <artifactId>pagehelper</artifactId>     <version>5.1.2</version> </dependency>

在Mybatis.cfg.xml配置拦截器

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

导入一个工具类用于完成分页实现

package com.lz.utils;

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
				+ "]";
	}
}

在bookmapper.xml中实现分页方法


  <select id="like4"  resultType="com.lz.model.Book"  parameterType="java.lang.String">
  select
  <include refid="Base_Column_List" />
    from   t_mvc_book
    where  bname like concat ('%', #{bname},'%')
  </select>

在bookbiz定义接口

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

实现接口的方法,并且重写

 @Override
    public List<Book> like4(String bname,PageBean pageBean) {
        if(pageBean != null && pageBean.isPagination()){
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        }
        List<Book> list = bookMapper.like4(bname);
        if(pageBean != null && pageBean.isPagination()){
            PageInfo pageInfo = new PageInfo(list);
            System.out.println("页码:"+pageInfo.getPageNum());
            System.out.println("页大小:"+pageInfo.getPageSize());
            System.out.println("总记录:"+pageInfo.getTotal());
            pageBean.setTotal((int)pageInfo.getTotal());
        }


        return  list  ;
    }

最后测试方法,打印内容

  @Test
    public void testlike4() {
        PageBean  pageBean=new PageBean();
        pageBean.setPage(2);
        pageBean.setRows(20);
        this.bookBiz.like4("圣墟",pageBean).forEach(System.out::println);
    }

 二.特殊字符处理

任何一些技术的出现都是为了解决一个问题而出现的而 MyBatis 中进行特殊字符处理的主要目的是:确保 SQL 查询的安全性和正确性

1.mybatis中为什么要进行特殊字符处理

  1. 防止 SQL 注入:SQL 注入是一种常见的安全漏洞,攻击者可以通过在输入中插入恶意的 SQL 代码来执行未经授权的操作。使用特殊字符处理可以帮助防止这种攻击。例如,对于查询语句中的参数,MyBatis 会自动转义特殊字符,以确保它们被当作数据而不是 SQL 代码。

  2. 处理特殊字符:有时候,SQL 查询需要处理包含特殊字符的数据。例如,当查询包含引号或其他特殊字符时,需要对其进行适当的转义,以避免语法错误。通过特殊字符处理,MyBatis 可以正确处理这些情况,并生成正确的 SQL 查询语句。

  3. 保护数据库的完整性:特殊字符处理还可以保护数据库的完整性。在某些情况下,用户输入的数据可能包含特殊字符,如果没有进行处理,可能导致 SQL 查询语句出错或破坏数据库数据。通过特殊字符处理,可以确保输入的数据正确地传递给数据库,从而保护数据库的完整性。

因此,对于安全性和数据完整性的考虑,进行特殊字符处理是非常重要的。MyBatis 提供了多种方式来处理特殊字符,包括转义字符、预编译语句参数化以及内置函数或插件等。使用这些方法可以有效地确保 SQL 查询的正确性和安全性。

2.两种特殊字符处理方式的应用

在实现之前要科普几个知识点

poji entity  model :专门用来原来描述数据库的实体
vo :view object  视图 对象 :专门 用了展示 java.utils.Map
dto :接受参数的

2.1通过 <![CDATA[ ]]>-进行特殊字符处理

定义一个方法用于查询价格之间的区间查询

<select id="queryMaxMin"  resultType="com.lz.model.Book"  parameterType="com.lz.dto.BookDto">
    select
    <include refid="Base_Column_List" />
    from   t_mvc_book
where  <![CDATA[
     price <#{max} and price >#{min`}
    ]]>


  </select>

定义一个dto的方法用于特殊字符处理方式的应用

package com.lz.dto;

import com.lz.model.Book;

/**
 * @author lz
 * @create 2023-08-24 16:14
 */
public class BookDto  extends Book {
    private   float min;
    private   float  max;

    public float getMin() {
        return min;
    }

    public void setMin(float min) {
        this.min = min;
    }

    public float getMax() {
        return max;
    }

    public void setMax(float max) {
        this.max = max;
    }

    @Override
    public String toString() {
        return "BookDto{" +
                "min=" + min +
                ", max=" + max +
                '}';
    }

}

实现方法的接口,和在接口实现类重写方法

 List<Book>queryMaxMin(BookDto bookDto);
  @Override
    public List<Book> queryMaxMin(BookDto bookDto) {

        return bookMapper.queryMaxMin(bookDto);
    }

打印并且测试方法

   @Test
    public void queryMaxMin() {
        BookDto bookDto=new BookDto();
        bookDto.setMax(50);
        bookDto.setMin(40);
        this.bookBiz.queryMaxMin(bookDto).forEach(System.out::println);
    }

 2.2同过&gt; &lt;实现特殊字符的实现

在前者的基础上注释   

select id="queryMaxMin"  resultType="com.lz.model.Book"  parameterType="com.lz.dto.BookDto">
    select
    <include refid="Base_Column_List" />
    from   t_mvc_book
    WHERE  price  &gt; #{min} and  price &lt;  #{max}
   <!-- where  <![CDATA[
     price <#{max} and price >#{min}
    ]]>-->

  </select>

后面三部操作都是一样的,所以小编就直接将运行结果弄出来了

 

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

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

相关文章

2023 CCPC 华为云计算挑战赛 D-塔

首先先来看第一轮的 假如有n个,每轮那k个 他们的高度的可能性分别为 n 1/C(n,k) n1 C(n-(k-11),1)/C(n,k) n2 C(n-(k-21),2)/C(n,k) ni C(n-(k-i1,i)/C(n,k) 通过概率和高度算出第一轮增加的期望 然后乘上m轮增加的高度加上初始高度&#xff0c;就是总共增加的高度 下面是…

YOLOv7-tracker 目标追踪 输入视频帧

参考项目&#xff1a;https://github.com/JackWoo0831/Yolov7-tracker/tree/master github链接&#xff1a;https://github.com/Whiffe/Yolov7-tracker 码云链接&#xff1a;https://gitee.com/YFwinston/Yolov7-tracker 1 项目安装 1.1 环境搭建 平台&#xff1a;AutoDL 选…

学习网络编程No.4【socket编程实战】

引言 北京时间&#xff1a;2023/8/19/23:01&#xff0c;耍了好几天&#xff0c;主要归咎于《我欲封天》这本小说&#xff0c;听了几个晚上之后逐渐入门&#xff0c;在闲暇时间又看了一下&#xff0c;小高潮直接来临&#xff0c;最终在三个昼夜下追完了&#xff0c;哈哈哈&…

Android 11 Display亮灭屏

系统休眠唤醒的时候会涉及到亮灭屏&#xff0c;下面分析下系统&#xff08;高通8155平台&#xff09;Display亮灭屏流程 1. 点亮屏幕 点亮屏幕入口在framework/base/下面LightsService.java&#xff0c;然后通过调用SurfaceControl.java ,最终调用到framework/native下面的Sur…

4.5 TCP优化

TCP 三次握手的性能提升 三次握手的过程在一个 HTTP 请求的平均时间占比 10% 以上&#xff0c;所以要正确使用三次握手的中参数&#xff0c;需要先用netstat命令查看是哪个握手阶段出了问题&#xff0c;主动发起连接的客户端优化相对简单些&#xff0c;而服务端需要监听端口&a…

【算法专题突破】双指针 - 移动零(1)

目录 写在前面 1. 题目解析 2. 算法原理 3. 代码编写 写在最后&#xff1a; 写在前面 在进行了剑指Offer和LeetCode hot100的毒打之后&#xff0c; 我决心系统地学习一些经典算法&#xff0c;增强我的综合算法能力。 1. 题目解析 题目链接&#xff1a;283. 移动零 - 力…

26-非父子通信 - provide inject

provide & inject 作用: 跨层级 共享数据 1. 父组件 provide 提供数据 export default{provide () {return {// 普通类型 (非响应式)color: this.color// 复杂类型 (响应式)userInfo: this.userInfo}}} 2. 子 / 孙组件 inject 取值使用 export default {inject: ["…

docker搭建owncloud,Harbor,构建镜像

1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 拉取镜像 docker pull owncloud docker pull mysql:5.6 2、安装搭建私有仓库 Harbor 1.下载docker-compose 2.安装harbor 3.编辑 harbor.yml文件 使用./intall.sh安装 4.登录 3、编写Dockerfile制作Web应用系…

优美而高效:解决服务器通信问题

题目背景 在这个问题中&#xff0c;我们面临着一幅服务器分布图。图中的每个单元格可能有服务器&#xff08;标记为1&#xff09;或者没有&#xff08;标记为0&#xff09;。我们的任务是找出能够与至少一台其他服务器进行通信的服务器数量。 算法思路 为了解决这个问题&…

Python使用pyqt5写windows桌面应用实战教程

本篇文章主要讲解,Python使用pyqt5写windows桌面应用的详细实战教程文章,主要涵盖单个界面的布局构建说明,表单构建说明,数据交互构建说明以及可直接开发的简易多界面框架实例构建说明,能够让你很快的了解pyqt在python中的使用和构建方式,快速实现一个简单的windows桌面图…

AI 绘画Stable Diffusion 研究(十五)SD Embedding详解

大家好&#xff0c;我是风雨无阻。 本期内容&#xff1a; Embedding是什么&#xff1f;Embedding有什么作用&#xff1f;Embedding如何下载安装&#xff1f;如何使用Embedding&#xff1f; 大家还记得 AI 绘画Stable Diffusion 研究&#xff08;七&#xff09; 一文读懂 Stab…

【C语言】动态内存管理,详细!!!

文章目录 前言一、为什么存在动态内存分配二、动态内存开辟函数的介绍1.malloc2.calloc3.realloc4.free 三、动态内存开辟中的常见错误1.误对NULL进行解引用操作2.对于动态开辟的空间进行了越界访问3.对于非动态开辟的内存进行了free操作4.只free掉动态开辟内存的一部分5.多次f…

vue2 vue中的常用指令

一、为什么要学习Vue 1.前端必备技能 2.岗位多&#xff0c;绝大互联网公司都在使用Vue 3.提高开发效率 4.高薪必备技能&#xff08;Vue2Vue3&#xff09; 二、什么是Vue 概念&#xff1a;Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套 **构建用户界面 ** 的 渐进式 …

Dapper

介绍 dapper是一款轻量级的ORM Dapper 被称为 ORM 之王。 以下是 Dapper 的主要功能&#xff1a; 速度快&#xff0c;性能快。 更少的代码行。 对象映射器。 静态对象绑定。 动态对象绑定。 轻松处理 SQL 查询。 易于处理存储过程。 直接对 IDBConnection 类进行操作&#xf…

Go 语言进阶与依赖管理 | 青训营

Powered by:NEFU AB-IN 文章目录 Go 语言进阶与依赖管理 | 青训营 语言进阶依赖管理测试 Go 语言进阶与依赖管理 | 青训营 GO语言工程实践课后作业&#xff1a;实现思路、代码以及路径记录 语言进阶 Go可以充分发挥多核优势&#xff0c;高效运行 Goroutine是Go语言中的协程…

遗传算法解决TSP问题

一、求解问题概述 1.1 TSP问题 TSP问题是指旅行商问题&#xff08;Traveling Salesman Problem&#xff09;。在TSP问题中&#xff0c;假设有一名旅行商要在给定的一组城市之间进行旅行&#xff0c;每个城市只能被访问一次&#xff0c;并且旅行商必须最终返回出发城市。问题的…

Python爬虫猿人学逆向系列——第六题

题目&#xff1a;采集全部5页的彩票数据&#xff0c;计算全部中奖的总金额&#xff08;包含一、二、三等奖&#xff09; 地址&#xff1a;https://match.yuanrenxue.cn/match/6 本题比较简单&#xff0c;只是容易踩坑。话不多说请看分析。 两个参数&#xff0c;一个m一个f&…

三次握手四次挥手之全连接半连接队列

什么是全连接半连接 在 TCP 三次握手的时候&#xff0c;Linux 内核会维护两个队列&#xff0c;分别是&#xff1a; 半连接队列&#xff0c;也称 Listen 队列&#xff1b;全连接队列&#xff0c;也称 accept 队列&#xff1b; 工作原理 每一个socket执行listen时&#xff0c…

day-30 代码随想录算法训练营 回溯part06

332.重新安排行程 思路&#xff1a;使用unordered_map记录起点机场对应到达机场&#xff0c;内部使用map记录到达机场的次数&#xff08;因为map会进行排序&#xff0c;可以求出最小路径&#xff09; class Solution { public:vector<string>res;unordered_map<stri…