Mybatis (3)-----分页的运用

目录

一、分页查询

二,特殊的字符处理

三、总结


前言:在我们上篇已经学的动态sql的基础上,今天继续讲解关于maybatis的分页,特殊的字符处理。希望这篇博客可以帮助到大家哦!

一、分页查询

为什么要重写mybatis的分页?

重写MyBatis的分页功能有几个原因。

首先,MyBatis默认的分页功能只能实现简单的分页,无法满足复杂的分页需求。通过重写MyBatis的分页,可以实现更灵活、更高级的分页功能。 其次,重写分页可以提高系统的性能。

其次,MyBatis的默认分页实现是通过在数据库查询时先查询出所有的结果,然后再根据分页参数进行结果的筛选。当数据量较大时,这种方式会导致查询的性能下降,甚至出现内存溢出的问题。通过重写分页,可以在数据库查询时直接生成带有分页语句的SQL,避免不必要的数据加载和内存消耗,从而提高系统的性能。 此外,重写分页还可以兼容不同的数据库方言。不同的数据库在分页语法上有一些差异,MyBatis默认的分页实现只适用于某些数据库,无法兼容所有的数据库。通过重写分页,可以根据不同的数据库方言生成相应的分页语句,从而实现跨数据库的分页功能。 因此,重写MyBatis的分页功能可以满足更复杂的分页需求,提高系统的性能,并兼容不同的数据库方言。

自定义使用分页插件步奏:
1、导入pom依赖

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

要找对文件夹目录,不然问题大大。
2、Mybatis.cfg.xml配置拦截器

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

3、使用PageHelper进行分页

package com.lya.util;
 
 
 
import javax.servlet.http.HttpServletRequest;
import java.io.Serializable;
import java.util.Map;
/**
 * @authorlya
 * @site www.lya.com
 * @create  2023-08-24 11:44
 */
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
                + "]";
    }
}

4、处理分页结果

①BookBiz

List<Map> listPager(Map map, PageBean pageBean);


②BookMapper.java

//    利用第三方插件进行分页
    List<Map> listPager(Map map);


③BookMapper.xml

<select id="listPager" resultType="java.util.Map" parameterType="java.util.Map">
  select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%')
</select>


④BookBizImpl

@Override
    public List<Map> listPager(Map map, PageBean pageBean) {
//        pageHelper分页插件相关的代码
        if(pageBean!=null&&pageBean.isPagination()){
            PageHelper.startPage(pageBean.getPage(),pageBean.getRows());
        }
        List<Map> maps = bookMapper.listPager(map);
        if(pageBean!=null&&pageBean.isPagination()){
//            处理查询结果的前提是需要分页,是需要分页的
            PageInfo info = new PageInfo(maps);
            pageBean.setTotal(info.getTotal()+"");
        }
        return maps;
    }


⑤BookBizImplTest 

@Test
    public void listPager() {
        Map map=new HashMap();
        map.put("bname","圣墟");
//        bookBiz.listPager(map).forEach(System.out::println);
 
//        查询出第二页的20条数据
        PageBean pageBean = new PageBean();
        pageBean.setPage(2);
        pageBean.setRows(20);
 
        bookBiz.listPager(map,pageBean).forEach(System.out::println);

   

}

二,特殊的字符处理

二、模糊查询
 我们在写模糊查询的时候一般是这样写的:

select * from t_mvc_book where bname like '%?%'

然后我们便使用占位符在后台进行传值进行查询

那么使用Mybatis只后会有所不同,他有三种方式改变这个模糊查询的方式:

  <select id="selectBooksLike1" resultType="com.zq.model.Book" parameterType="java.lang.String">
  select * from t_mvc_book where bname like #{bname}
</select>
  <select id="selectBooksLike2" resultType="com.zq.model.Book" parameterType="java.lang.String">
  select * from t_mvc_book where bname like '${bname}'
</select>
  <select id="selectBooksLike3" resultType="com.zq.model.Book" parameterType="java.lang.String">
  select * from t_mvc_book where bname like concat('%',#{bname},'%')
</select>


 写完这些xml文件的配置后我们将其他的biz层也加入进来

BookMapper.xml:
 


<select id="listPagerS" resultType="com.csdn.xw.model.Book" parameterType="java.util.Map">
  select * from t_mvc_book where bname like concat(concat('%',#{bname}),'%') and price < #{max}
</select>

BookBizImplTest 

 @Test
    public void listPagerS() {
        System.out.println("没有处理特殊字符之前");
        Map map=new HashMap();
        map.put("dname","圣墟");
        map.put("max",20);
        bookBiz.listPagerS(map).forEach(System.out::println);

 @Test
    public void listPagerS() {
        System.out.println("没有处理特殊字符之前");
        Map map=new HashMap();
        map.put("dname","圣墟");
        map.put("max",20);
        bookBiz.listPagerS(map).forEach(System.out::println);


 

三、总结

   我们在使用myBatis的时候,在做sql的配置文件的时候会发现一个问题,就是会出现特殊字符和标签括号冲突问题

比如:<  和<

什么意思?就是第一个是判断符号小于,第二个是标签的左括号,那么怎么区别呢?有两种方式:

①: <![CDATA[ <= ]]> 

②:    <(&lt;)  、    >(&gt;)       &(&amp;) 

举例说明:

  ①BookBiz

 
 
  1. List<Book> list6(BookVo bookVo);

  2. List<Book> list7(BookVo bookVo);

②BookMapper.java

/**
     * 处理特殊字符
     * @param bookVo
     * @return
     */
    List<Book> list6(BookVo bookVo);
 
 
    /**
     * 处理特殊字符
     * @param bookVo
     * @return
     */
    List<Book> list7(BookVo bookVo);


③BookMapper.xml

<select id="list6" resultType="com.zq.model.Book" parameterType="com.zq.model.BookVo">
  select * from t_mvc_book
  <where>
    <if test="null != min and min != ''">
      <![CDATA[  and #{min} < price ]]>
    </if>
    <if test="null != max and max != ''">
      <![CDATA[ and #{max} >
  </where>
</select>
 
<select id="list7" resultType="com.javaxl.model.Book" parameterType="com.zq.model.BookVo"> price ]]>
    </if>
    select * from t_mvc_book
    <where>
      <if test="null != min and min != ''">
         and #{min} &lt; price
      </if>
      <if test="null != max and max != ''">
         and #{max} &gt; price
      </if>
    </where>
  </select>

④BookBizImpl

@Override
    public List<Book> list6(BookVo bookVo) {
        return bookMapper.list6(bookVo);
    }
 
    @Override
    public List<Book> list7(BookVo bookVo) {
        return bookMapper.list7(bookVo);
    }

⑤BookBizImplTest

 @Test
    public void list6() {
        BookVo vo=new BookVo();
        vo.setMax(45);
        vo.setMin(35);
        bookBiz.list6(vo).forEach(System.out::println);
    }
 
    @Test
    public void list7() {
        BookVo vo=new BookVo();
        vo.setMax(45);
        vo.setMin(35);
        bookBiz.list7(vo).forEach(System.out::println);
    }

测试结果:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

星际争霸之小霸王之小蜜蜂(六)--让子弹飞

目录 前言 一、添加子弹设置 二、创建子弹 三、创建绘制和移动子弹函数 四、让子弹飞 五、效果 总结 前言 小蜜蜂的基本操作已经完成了&#xff0c;现在开始编写子弹的代码了。 一、添加子弹设置 在我的预想里&#xff0c;我们的小蜜蜂既然是一只猫&#xff0c;那么放出的子弹…

【MD5加密】

MD5加密 什么是MD5密码MD5用途MD5特点MD5加密MD5解密总结那我们上面也已经提到啦&#xff0c;说MD5是可以进行解密或者说他是可以泄露密码等&#xff0c;所以我们还可以使用以下方法进行再次加密 第一种&#xff1a;MD5固定盐值第二种&#xff1a;MD5随机盐值 什么是MD5密码 官…

基于鸽群算法优化的BP神经网络(预测应用) - 附代码

基于鸽群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码 文章目录 基于鸽群算法优化的BP神经网络&#xff08;预测应用&#xff09; - 附代码1.数据介绍2.鸽群优化BP神经网络2.1 BP神经网络参数设置2.2 鸽群算法应用 4.测试结果&#xff1a;5.Matlab代码 摘要…

25-非父子通信 - event bus 事件总线

作用:非父子组件之间&#xff0c;进行简易消息传递。(复杂场景 -> Vuex) 1.创建一个都能访问到的事件总线(空 Vue 实例) -> utils/EventBus.js import Vue from vue const Bus new Vue() export default Bus 2. A组件(接收方),监听 Bus实例 的事件(支持多个组件同时监…

机器人制作开源方案 | 滑板助力器

我们可以用一块废滑板做些什么呢&#xff1f; 如今&#xff0c;越来越多的人选择电动滑板作为代步工具或娱乐方式&#xff0c;市场上也涌现出越来越多的电动滑板产品。 &#xff08;图片来源&#xff1a;Backfire Zealot X Belt Drive Electric Skateboard– Backfire Board…

在Linux系统上安装和配置Redis数据库,无需公网IP即可实现远程连接的详细解析

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 Redis作为一款高速缓存的key value键值对的数据库,在…

学会Mybatis框架:一文掌握MyBatis与GitHub插件分页的完美结合【三.分页】

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于Mybatis的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.Mybatis分页 1. Mybatis自带分页 2…

springboot小知识:配置feign服务超时时间

背景&#xff1a;当前项目通过feign服务调用了其他两个项目的接口&#xff0c;但是由于特殊需求&#xff0c;需要调整某一个项目的feign服务的默认超时时间&#xff1a; 默认连接超时10秒&#xff0c;默认读取超时时间 60秒 1.找到定义的FeignClient 2.根据FeignClient定义的名…

Node基础--Node简介以及安装教程

1.Node简介 Node.js发布于2009年5月&#xff0c;由Ryan Dahl开发&#xff0c;是一个基于Chrome V8引擎的JavaScript运行环境&#xff0c;使用了一个事件驱动、非阻塞式I/O模型&#xff0c;让JavaScript 运行在服务端的开发平台&#xff0c;它让JavaScript成为与PHP、Python、Pe…

对CSV格式的数据文件进行插值处理

使用Python程序&#xff0c;实现对一个较短的csv文件&#xff0c;进行差值处理&#xff0c;并绘制GUI界面&#xff1b; 这个程序是一个使用Python的Tkinter库构建的GUI应用程序&#xff0c;用于对CSV格式的数据文件进行插值处理。下面我会逐步解释程序的各个部分和功能&#x…

消息队列前世今生 字节跳动 Kafka #创作活动

消息队列前世今生 1.1 案例一&#xff1a; 系统崩溃 首先大家跟着我想象一下下面的这个的场景&#xff0c; 看到新出的游戏机&#xff0c;太贵了买不起&#xff0c;这个时候你突然想到&#xff0c;今天抖音直播搞活动&#xff0c;打开抖音搜索&#xff0c;找到直播间以后&am…

边缘计算节点BEC典型实践:如何快速上手PC-Farm服务器?

百度智能云边缘计算节点BEC&#xff08;Baidu Edge Computing&#xff09;基于运营商边缘节点和网络构建&#xff0c;一站式提供靠近终端用户的弹性计算资源。边缘计算节点在海外覆盖五大洲&#xff0c;在国内覆盖全国七大区、三大运营商。BEC通过就近计算和处理&#xff0c;大…

并发编程系列-分而治之思想Forkjoin

我们介绍过一些有关并发编程的工具和概念&#xff0c;包括线程池、Future、CompletableFuture和CompletionService。如果仔细观察&#xff0c;你会发现这些工具实际上是帮助我们从任务的角度来解决并发问题的&#xff0c;而不是让我们陷入线程之间如何协作的繁琐细节&#xff0…

一网打尽java注解-克隆-面向对象设计原则-设计模式

文章目录 注解内置注解元注解 对象克隆为什么要克隆&#xff1f;如何克隆浅克隆深克隆 Java设计模式什么是设计模式&#xff1f;为什么要学习设计模式&#xff1f; 建模语言类接口类之间的关系依赖关系关联关系聚合关系组合关系继承关系实现关系 面向对象设计原则单一职责开闭原…

仓库使用综合练习

目录 1、使用mysql:5.6和 owncloud 镜像&#xff0c;构建一个个人网盘。 2、安装搭建私有仓库 Harbor 3、编写Dockerfile制作Web应用系统nginx镜像&#xff0c;生成镜像nginx:v1.1&#xff0c;并推送其到私有仓库。 4、Dockerfile快速搭建自己专属的LAMP环境&#xff0c;生…

跨平台图表:ChartDirector for .NET 7.1 Crack

什么是新的 ChartDirector for .NET 7.0 支持跨平台使用&#xff0c;但仅限于 .NET 6。这是因为在 .NET 7 中&#xff0c;Microsoft 停止了用于非 Windows 使用的 .NET 图形库 System.Drawing.Common。由于 ChartDirector for .NET 7.0 依赖于该库&#xff0c;因此它不再支持 .…

小白到运维工程师自学之路 第七十九集 (基于Jenkins自动打包并部署Tomcat环境)1

一、传统的流程 1、传统网站部署的流程 在运维过程中&#xff0c;网站部署是运维的工作之一。传统的网站部署的流程大致分为:需求分 析-->原型设计-->开发代码-->提交代码-->内网部署-->内网测试-->确认上线-->备份数据-->外网更新-->外网测试--&g…

【ES6】—数组的扩展

一、类数组/ 伪数组 1. 类/伪数组: 并不是真正意义的数组&#xff0c;有长度的属性&#xff0c;但无法使用Array原型上的方法 let divs document.getElementsByTagName(div) console.log(divs) // HTMLCollection []let divs2 document.getElementsByClassName("xxx&q…

《操作系统真象还原》学习笔记:第七章 中断

由于 CPU 获知了计算机中发生的某些事&#xff0c;CPU 暂停正在执行的程序&#xff0c;转而去执行处理该事件的程序&#xff0c;当这段程序执行完毕后&#xff0c;CPU 继续执行刚才的程序。整个过程称为中断处理&#xff0c;也称为中断。 把中断按事件来源分类&#xff0c;来自…

食品制造行业云MES系统解决方案

食品饮料行业大致可以分为初级产品加工、二次加工、食品制造、食品分装、调味品和饲料加工等几大类。由于处于产业链不同的位置&#xff0c;其管理存在一定的差异&#xff0c;那么食品行业的MES应该怎么建设呢&#xff1f; 食品饮料行业生产管理特点&#xff1a; 食品饮料行业…