【SpringBoot】MyBatis与MyBatis-Plus分页查询问题

news2024/11/18 20:00:32

        笔者写这篇博客是因为近期遇到的关于两者之间的分页代码差距,其实之前也遇见过但是没有去整理这篇博客,但由于还是被困扰了小一会儿时间,所以还是需要加深记忆。其实会看前后端传参解决这个问题很快、不麻烦。关于这两个框架的分页代码问题主要就是在业务层和MyBatis的SQL问题。注意:这里我不展示前端接口,需要知道的是前端会传给后端当前页(page)以及每页条数(size)。后端根据两个参数去实现分页(limit)

MyBatis

        那么关于MyBatis这个半ORM框架来说,SQL还是需要自己去写在xml中的或者是在注解上实现。这里我就采用xml种实现的方式去实现啦。为了减少代码量(真实开发不能这样的哈),我就将所有业务代码都放到控制层中。

引入依赖

<!--MyBatis框架-->
<dependency>
	<groupId>org.mybatis.spring.boot</groupId>
	<artifactId>mybatis-spring-boot-starter</artifactId>
	<version>2.2.2</version>
</dependency>
<!--JDBC驱动-->
<dependency>
	<groupId>mysql</groupId>
	<artifactId>mysql-connector-java</artifactId>
	<version>8.0.31</version>
</dependency>
<!--MyBatis的分页插件PageHelper -->
<dependency>
    <groupId>com.github.pagehelper</groupId>
    <artifactId>pagehelper-spring-boot-starter</artifactId>
    <version>1.2.12</version>
</dependency>

修改yml

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/table?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456

mybatis:
  mapper-locations: classpath:mapper/*.xml  # 对应xml的位置
  type-aliases-package: com.chf.entity  # 对应namespace的实体类包名
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 日志类型
    map-underscore-to-camel-case: true  # 字段与属性的驼峰规则

# MyBatis的分页插件 这是最重要的
pagehelper:
  helper-dialect: mysql
  reasonable: true
  support-methods-arguments: true
  params: count=countsql

业务代码

@RestController
@RequestMapping("/emp")
public class EmpController{
   
    //@Autowired
    //private EmpService empService; 
    // 为了博客简化代码量 所以直接调用Dao层接口
    @Autowired
    private EmpMapper empMapper;

    /**
     * 分页查询
     * @param currentPage 当前页数
     * @param pageSize 每页条数
     * @return
     */
    @GetMapping("/findAll/{page}/{size}")
    public R findAll(@PathVariable("page") Integer currentPage, @PathVariable("size") Integer pageSize){
        List<Emp> empList = empMapper.selectByPage(currentPage, pageSize);
        PageInfo<Emp> pageInfo = new PageInfo<>(empList);
        pageInfo.setTotal(empMapper.selectCountAll());
        return R.ok(pageInfo);
    }
}

SQL

<!--返回前端的分页信息 这里的数据表字段名有点不规范-->
<select id="selectByPage" resultType="Emp">
    select
        id,name,sex,idcard,phonenum,depart
    from
        emp
    limit
        #{page},#{size}
</select>

<!--返回前端的总记录条数-->
<select id="selectCountAll" resultType="java.lang.Integer">
    select
        count(*)
    from
        emp
</select>

测试返回数据

        返回的分页信息是在data中的list

MyBatis-Plus

引入依赖

<!--整合MyBatis
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>1.3.3</version>
</dependency>
-->
<!--
	这里需要注意哈:如果使用了MyBatis-Plus的话就不能引入MyBatis依赖 否则会报错
    可能也不是因为两个不能互存 只是版本之间产生了依赖 报错原因如下图所示
-->
<!--数据源配置-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.22</version>
</dependency>
<!--MyBatis-Plus-->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version>
</dependency>
<!--JDBC-->
<dependency>
    <groupId>mysql</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <version>8.0.17</version>
</dependency>

修改yml

server:
  port: 8080

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/table?characterEncoding=utf8&useSSL=false&allowPublicKeyRetrieval=true
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: 123456

mybatis-plus:
  mapper-locations: classpath:mapper/*.xml  # 对应xml的位置
  type-aliases-package: com.chf.entity  # 对应namespace的实体类包名
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 日志类型
    map-underscore-to-camel-case: true  # 字段与属性的驼峰规则

业务代码

@RestController
@RequestMapping("/emp")
public class EmpController{
   
    @Autowired
    private EmpService empService; 

    /**
     * 分页查询
     * @param currentPage 当前页数
     * @param pageSize 每页条数
     * @return
     */
    @GetMapping("/findAll/{page}/{size}")
    public R findAll(@PathVariable("page") Integer currentPage, @PathVariable("size") Integer pageSize){
        Page<Emp> page = new Page<>(currentPage,pageSize);
        // 此方法还可以传入第二个参数:QueryWrapper条件构造器
        // 用于增添一些查询条件用的 这里就不做展示了
        empService.page(page);
        return R.ok(page);
    }
}
public interface EmpService extends IService<Emp> {
}
@Service
public class EmpServiceImpl extends ServiceImpl<EmpMapper,Emp> implements EmpService {
}
@Mapper
public interface EmpMapper extends BaseMapper<Emp> {
}

测试返回数据

        可以看到在MyBatis-Plus返回前端的参数中使用records封装分页信息。看到这里以为结束了吗?仔细看total(总条数)会发现怎么会是0?还有pages(总页数)也是0,学过MyBatis-Plus应该都知道为了完成分页所以还需要配置分页插件才可以实现真正的分页。所以需要再添加一个配置类,代码如下:

@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor(){
        MybatisPlusInterceptor mybatisPlusInterceptor = new MybatisPlusInterceptor();
        mybatisPlusInterceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return mybatisPlusInterceptor;
    }
}

         添加好分页插件再次查询接口就会看到总条数和总页数都是真实的数值了。

 

 

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

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

相关文章

物联网|整体介绍|蓝牙4.0BLE信道分析与拓扑分析|物联网之蓝牙4.0 BLE基础-学习笔记(1)

文章目录 课程整体介绍1、蓝牙4.0自身的优点2、开设这门课的重要性3课程的总体规划4.课程目的5.培训对象 蓝牙4.0BLE信道分析与拓扑分析蓝牙4.OBLE信道分析柘扑分析星型拓扑结构:扮演角色广播结构;星型结构的建立过程: 课程整体介绍 为什么我们要开设这么课程呢? 1、蓝牙4.0…

JDK17新特性之--JDK9到JDK17 String 新增的新方法

JDK9之后对String底层存储数据结构进行了重大的修改1&#xff0c;同步也增加了许多新的方法&#xff0c;主要有Text Blocks、chars()、codePoints()、describeConstable()、formatted()、indent()、isBlank()、isEmpty()、lines()、repeat()、strip()、stripLeading()、stripIn…

判断大小端的错误做法

这里不详细讲解大小端的区别&#xff0c;只讲解判断大小端的方法。 1.大端&#xff0c;小端的区别 0x123456 在内存中的存储方式 大端是高字节存放到内存的低地址 小端是高字节存放到内存的高地址 2.大小端的判断 1.错误的做法 int main() {int a0x1234;char c(char)a;if(…

CSS-Flex布局

01-标准流 标准流也叫文档流&#xff0c;指的是标签在页面中默认的排布规则&#xff0c;例如&#xff1a;块元素独占一行&#xff0c;行内元素可以一行显示多个。 02-浮动 基本使用 作用&#xff1a;让块元素水平排列。 属性名&#xff1a;float 属性值 left&#xff1a;…

全志H3-nanopi-duo2开发板GPIO驱动开发

1:获取对应开发板duo2的内核源码 从官网获取 [friendlyarm的nanopi-duo2](https://wiki.friendlyelec.com/wiki/index.php/NanoPi_Duo2/zh#.E5.AE.9A.E5.88.B6.E5.91.BD.E4.BB.A4.E8.A1.8C.E7.9A.84.E6.AC.A2.E8.BF.8E.E4.BF.A1.E6.81.AF.EF.BC.88.E6.96.87.E5.AD.97LOGO.EF.B…

使用开源项目管理系统 Redmine 的优缺点

redmine是什么软件&#xff1f;Redmine是一款基于Ruby on Rails框架开发的开源项目管理软件&#xff0c;具有丰富的功能和高度可定制性。主要功能包括项目管理、问题跟踪、文档管理、时间跟踪以及多种报表。要安装使用Redmine&#xff0c;首先需要搭建Ruby on Rails运行环境&am…

网页和原生程序的交互方案

1 ActiveX和BHO是微软开发且闭源的&#xff0c;仅适用于IE 这里就不讨论了&#xff0c;这种方式会给用户带来很大的安全风险。而且也不符合html5标准&#xff0c;现在已经被市场抛弃。 2 搜索挂接&#xff08;URL SEARCHHOOK) 在window系统中&#xff0c;通过在注册表中&…

3.1 Linux启动Shell

系列文章目录 第1章 Linux Shell简介 第2章 Shell基础 第3章 Bash Shell基础命令 <本章所在位置> 第4章 Bash Shell命令进阶 第5章 Linux Shell深度理解 第6章 Linux环境变量 第7章 Linux文件权限 第8章 Linux文件系统的管理 第9章 Linux软件安装 第10章 Linux文本编辑器…

框架不是框框—应用框架的基本思想

软件构件化是21世纪软件工业发展的大势趋。工业化的软件复用已经从通用类库进化到了面向领域的应用框架。Gartner Group认为&#xff1a;“至少70%的新应用将主要建立在如软件构件和应用框架这类‘构造块’之上&#xff1b;应用开发的未来就在于提供一开放体系结构&#xff0c;…

http状态码301、302及304

http状态码分类&#xff1a; 1**&#xff1a;服务器收到请求&#xff0c;需要请求者继续执行操作 2**&#xff1a;成功&#xff0c;操作被成功接收并处理 3**&#xff1a;重定向&#xff0c;需要进一步的操作以完成请求 4**&#xff1a;客户端错误&#xff0c;请求包含语法错误…

Meta内容总监:Quest最初并非侧重游戏,VR用户画像每年都在变

2019年&#xff0c;随着Oculus Quest的发布&#xff0c;Quest应用商店应运而生。仅仅4年时间&#xff0c;就成为了发展速度最快的VR平台&#xff0c;吸引越来越多的开发者进入到Quest中去&#xff0c;并关注到VR生态。截至去年10月&#xff0c;Quest商店交易规模达15亿美元&…

云计算运维工程师好学吗?

云计算运维工程师作为2023年的热门IT职业之一&#xff0c;不仅在专业本身的技术内容和职业前景&#xff0c;还是整个互联网行业&#xff0c;乃至全行业对于云计算运维人才的需求等方面都有突出的表现&#xff0c;备受追捧的新IT职业。 所以从职业前景还是就业需求&#xff0c;…

2023年第一季度企业邮箱安全性观察

近日&#xff0c;Coremail邮件安全联合中睿天下发布《2023年第一季度企业邮箱安全研究报告》&#xff0c;对2023年第一季度的企业邮箱的安全风险进行了分析。 01、垃圾邮件环比增长21.19% 2023年Q1全国企业邮箱用户共收到各类垃圾邮件7.13亿封&#xff0c;相比2022年Q4季度环比…

SeaweedFS学习笔记:Filer服务,目录与文件

文章目录 1. 介绍2. 用法2.1 生成配置文件2.2 启动 filer 3. 读写流程3.1 读取流程3.2 写入流程 4. Filer Store4.1 复杂度4.2 Filer的使用场景 5. 数据加密5.1 对Volume server的数据进行加密 1. 介绍 文件系统&#xff0c;一般都离不开目录和文件&#xff0c;当我们把Seawee…

MySQL基础(十四)视图

1. 常见的数据库对象 对象描述表(TABLE)表是存储数据的逻辑单元&#xff0c;以行和列的形式存在&#xff0c;列就是字段&#xff0c;行就是记录数据字典就是系统表&#xff0c;存放数据库相关信息的表。系统表的数据通常由数据库系统维护&#xff0c;程序员通常不应该修改&…

K_A36_002 基于STM32等单片机驱动继电器点灯 串口与OLED0.96双显示

K_A36_002 基于STM32等单片机驱动继电器点灯 串口与OLED0.96双显示 所有资源导航一、资源说明二、基本参数参数引脚说明 三、驱动说明模块工作原理:对应程序: 四、部分代码说明1、接线引脚定义1.1、STC89C52RC继电器模块1.2、STM32F103C8T6继电器模块 五、基础知识学习与相关资…

在学习c51单片机实验七(双机通信及pcb设计)操作Keil uVision4和protus的时候遇到的两个坑

第一个问题&#xff0c;这个问题用keil编程经常遇到 特别是懒的时候&#xff0c;对于新手&#xff0c;每次用一个工程文件&#xff0c;因为创建不熟练&#xff0c;就容易出现这个问题 Build target Target 1 linking... *** ERROR L104: MULTIPLE PUBLIC DEFINITIONS SYM…

FPGA通过数码管实现电子时钟

文章目录 前言一、原理1、共阴极数码管or共阳极数码管2、共阴极与共阳极的真值表 二、系统设计1、总体框图&#xff1a;2、模块调用3、模块原理图 三、源码1、计数模块2、数码管驱动模块3、顶层模块 四、运行效果五、总结六、参考资料 前言 环境&#xff1a; 1、Quartus18.1 2、…

cloud在gateway支持https和http请求

在项目中遇到既要支持http协议请求和https协议请求的场景&#xff0c;结合场景有两种解决方案&#xff1a; 第一种&#xff1a;编程实现&#xff0c;第二种&#xff1a;反向代理。 首先我们要清楚http和https的区别&#xff0c;百度过来一点 HTTP&#xff08;HTTP&#xff0…

目标检测之Neck选择

文章来自于&#xff1a;曲終人不散丶知乎&#xff0c; 连接&#xff1a;https://www.zhihu.com/people/qu-zhong-ren-bu-san-zhu-45/posts&#xff0c; 本文仅用于学术分享&#xff0c;如有侵权&#xff0c;前联系后台做删文处理。 Neck是目标检测框架中承上启下的关键环节。它…