MyBatis-Plus 实现分页的几种写法

news/2024/4/26 5:17:13/文章来源:https://blog.csdn.net/weixin_40986713/article/details/129195211

简介

MyBatis-Plus (opens new window)(简称 MP)是一个 MyBatis (opens new window)的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

快速开始

添加依赖

全新的 MyBatis-Plus 3.0 版本基于 JDK8,提供了 lambda 形式的调用,所以安装集成 MP3.0 要求如下:

  • JDK 8+

  • Maven or Gradle

Spring Boot项目

maven:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>最新版本</version>
</dependency>

Spring 项目

maven:

<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus</artifactId><version>最新版本</version>
</dependency>

配置

在 application.yml 配置文件中添加 H2 数据库的相关配置:

# DataSource Config
spring:datasource:driver-class-name: org.h2.Driverschema: classpath:db/schema-h2.sqlusername: rootpassword: testsql:init:schema-locations: classpath:db/schema-h2.sqldata-locations: classpath:db/data-h2.sql

在 Spring Boot 启动类中添加 @MapperScan 注解,扫描 Mapper 文件夹:

@SpringBootApplication
@MapperScan("com.baomidou.mybatisplus.samples.quickstart.mapper")
public class Application {public static void main(String[] args) {SpringApplication.run(Application.class, args);}}

Page分页

方式一:

使用mybatis-plus 的 Service page 接口


    @GetMapping("/pageList")@ApiOperation(value = "分页列表", notes = "query和user")public R<IPage<User>> pageList(@ApiIgnore User user, Query query) {//无条件分页IPage<User> pages = userService.page(Condition.getPage(query));//有条件分页IPage<User> pages = userService.page(Condition.getPage(query), Wrappers.lambdaQuery(user));return R.data(pages);}

方式二:

自定义sql分页


controller层代码:

    @GetMapping("/pageList")@ApiOperation(value = "分页列表", notes = "query和user")public R<IPage<User>> pageList(@ApiIgnore User user, Query query) {IPage<User> pages = userService.selectUserPage(Condition.getPage(query), user);return R.data(pages);}

service 里调用自定义分页sql mapper方法

  @Overridepublic IPage<User> selectUserPage(IPage<User> page, User user) {return page.setRecords(baseMapper.selectUserPage(page, user));}

定义mapper分页接口:


import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.gis.spacedata.bladex.domain.entity.system.User;
import org.apache.ibatis.annotations.Param;import java.util.List;import java.util.List;public interface UserMapper extends BaseMapper<User> {List<User> selectUserPage(IPage<User> page, @Param("user") User user);}

mybatis xml:

    <select id="selectUserPage" resultMap="userResultMap">select * from blade_user where is_deleted = 0<if test="user.tenantId!=null and user.tenantId != ''">and tenant_id = #{user.tenantId}</if><if test="user.account!=null and user.account != ''">and account like CONCAT('%',#{user.account},'%')</if><if test="user.realName!=null and user.realName != ''">and real_name like CONCAT('%',#{user.realName},'%')</if><if test="user.roleId!=null and user.roleId != ''">and CAST(#{user.roleId} AS VARCHAR)= ANY(STRING_TO_ARRAY(role_id, ','))</if>ORDER BY id</select>

Condition 工具类:


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import org.springblade.core.launch.constant.TokenConstant;
import org.springblade.core.tool.support.Kv;
import org.springblade.core.tool.utils.BeanUtil;
import org.springblade.core.tool.utils.Func;import java.util.Map;/*** 分页工具** @author Chill*/
public class Condition {/*** 转化成mybatis plus中的Page** @param query 查询条件* @return IPage*/public static <T> IPage<T> getPage(Query query) {Page<T> page = new Page<>(Func.toInt(query.getCurrent(), 1), Func.toInt(query.getSize(), 10));page.setAsc(Func.toStrArray(SqlKeyword.filter(query.getAscs())));page.setDesc(Func.toStrArray(SqlKeyword.filter(query.getDescs())));return page;}/*** 获取mybatis plus中的QueryWrapper** @param entity 实体* @param <T>    类型* @return QueryWrapper*/public static <T> QueryWrapper<T> getQueryWrapper(T entity) {return new QueryWrapper<>(entity);}/*** 获取mybatis plus中的QueryWrapper** @param query 查询条件* @param clazz 实体类* @param <T>   类型* @return QueryWrapper*/public static <T> QueryWrapper<T> getQueryWrapper(Map<String, Object> query, Class<T> clazz) {Kv exclude = Kv.create().set(TokenConstant.HEADER, TokenConstant.HEADER).set("current", "current").set("size", "size").set("ascs", "ascs").set("descs", "descs");return getQueryWrapper(query, exclude, clazz);}/*** 获取mybatis plus中的QueryWrapper** @param query   查询条件* @param exclude 排除的查询条件* @param clazz   实体类* @param <T>     类型* @return QueryWrapper*/public static <T> QueryWrapper<T> getQueryWrapper(Map<String, Object> query, Map<String, Object> exclude, Class<T> clazz) {exclude.forEach((k, v) -> query.remove(k));QueryWrapper<T> qw = new QueryWrapper<>();qw.setEntity(BeanUtil.newInstance(clazz));SqlKeyword.buildCondition(query, qw);return qw;}}

方式三:

使用mybatis-plus的Db类

说明:

  • 使用静态调用的方式,执行CRUD方法,避免Spring环境下Service循环注入、简洁代码,提升效率

  • 需要项目中已注入对应实体的BaseMapper

  • 完整使用方式见: 测试用例(opens new window)

  • 对于参数为Wrapper的,需要在Wrapper中传入Entity或者EntityClass供寻找对应的Mapper

  • 不建议在循环中调用,如果是批量保存,建议将数据构造好后使用 Db.saveBatch(数据) 保存


@Testvoid testPage() {IPage<Entity> page = Db.page(new Page<>(1, 1), Entity.class);Assertions.assertEquals(2, page.getTotal());page = Db.page(new Page<>(1, 1), Wrappers.lambdaQuery(Entity.class));Assertions.assertEquals(1, page.getRecords().size());}

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

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

相关文章

用Python获取弹幕的两种方式(一种简单但量少,另一量大管饱)

前言 弹幕可以给观众一种“实时互动”的错觉&#xff0c;虽然不同弹幕的发送时间有所区别&#xff0c;但是其只会在视频中特定的一个时间点出现&#xff0c;因此在相同时刻发送的弹幕基本上也具有相同的主题&#xff0c;在参与评论时就会有与其他观众同时评论的错觉。 在国内…

怎么从零开始学黑客,黑客零基础怎么自学

很多朋友对成为黑客很感兴趣&#xff0c;很大原因是因为看到电影中黑客的情节觉的特别的酷&#xff0c;看到他们动动手指就能进入任何系统&#xff0c;还有很多走上黑客之路的朋友仅仅是因为自己的qq被盗了&#xff0c;或者游戏里的装备被别人偷了&#xff0c;想要自己盗回来&a…

听车企做开发朋友说,面试Framework 必问~

近期听在车企工作的朋友说&#xff0c;今年去他们公司面试的人比往年增长了30%左右&#xff0c;但实际面试达到标准的人屈指可数&#xff0c;大多都是从 Android 开发方向转过来的。 车企招聘要求有哪些&#xff1f; 每个车企因为业务部门的不同&#xff0c;他们的要求也会有…

Linux操作系统基础知识命令参数详解

Linux操作系统 RAID分组 RAID JBOD RAID JBOD的意思是Just a Bunch Of Disks&#xff0c;是将多块硬盘串联起来组成一个大的存储设备&#xff0c;从某种意义上说这种类型不被算作RAID&#xff0c;在维基百科里JBOD同时也被归入非RAID架构。RAID JBOD将所有的磁盘串联成一个单…

保持超低温环境新方法:功耗降至十分之一!

&#xff08;图片来源&#xff1a;网络&#xff09;量子比特是量子计算机的主要构建部分&#xff0c;然而热量会导致量子比特容易出错&#xff0c;因此量子系统通常保存在超低温稀释制冷机内&#xff0c;可以将温度保持在绝对零度&#xff08;−273.15℃&#xff09;以上。但是…

如何使评论具有可操作性?取悦客户的指南

永远不要低估承认的力量。 当品牌与客户互动时&#xff0c;认可会带来更好的关系和更好的沟通。与买家和客户建立更多的个人联系意味着品牌需要证明他们支持他们的产品和客户。评论是利用客户分享他们的故事的那些时刻的绝佳机会。 为什么评论在 SaaS 中至关重要 在 B2B 软件的…

【python学习笔记】:如何去除字符串中空格

在输入数据时&#xff0c;很有可能会无意中输入多余的空格&#xff0c;或者在一些场景中&#xff0c;字符串前后不允许出现空格和特殊字符&#xff0c;此时就需要去除字符串中的空格和特殊字符。 【注意&#xff1a;这里的特殊字符&#xff0c;指的是制表符&#xff08;\t&…

ASEMI高压MOS管ASE65R330参数,ASE65R330图片

编辑-Z ASEMI高压MOS管ASE65R330参数&#xff1a; 型号&#xff1a;ASE65R330 漏极-源极电压&#xff08;VDS&#xff09;&#xff1a;650V 栅源电压&#xff08;VGS&#xff09;&#xff1a;20V 漏极电流&#xff08;ID&#xff09;&#xff1a;12.5A 功耗&#xff08;P…

57 - 深入解析任务调度

---- 整理自狄泰软件唐佐林老师课程 文章目录1. 问题1.1 思考1.2 实例分析&#xff1a;问题分析及解决2. 深入讨论2.1 任务调度的定义2.2 关于调度算法的分类2.3 什么时候进行任务调度2.4 任务的分类2.5 关于优先级调度2.6 问题2.7 调度算法的终极目标2.8 课后扩展1. 问题 系统…

在windows11上安装openssh服务端并修改端口号

在windows11上安装openssh服务端并修改端口号 目录1.软件下载地址2.修改端口3.启动ssh原文链接&#xff1a;https://blog.csdn.net/qq_62129885/article/details/1268467751.软件下载地址 Release v9.2.0.0p1-Beta PowerShell/Win32-OpenSSH (github.com) https://github.co…

浅谈智能电力运维管理系统在物业小区的应用分析

安科瑞 李亚俊 0引言 由于部分住宅小区存在电力设施纸质档案破损缺失、产权分界不清、查找故障点所在箱变&#xff08;箱式变电站&#xff0c;下同&#xff09;位置困难或小区出入口路径不明等情况&#xff0c;影响了抢修效率。为此&#xff0c;国网辽宁沈阳市沈北新区供电公…

Nacos Ignore the empty nacos configuration and get it based on dataId

1.配置错误 dataId问题 启动日志&#xff1a; 使用properties格式的文件&#xff1a; Ignore the empty nacos configuration and get it based on dataId[xxx-server] & group[DEFAULT_GROUP] Ignore the empty nacos configuration and get it based on dataId[xxx-s…

python 自动化测试 pytest 的使用

pytest 是一款以python为开发语言的第三方测试&#xff0c;主要特点如下&#xff1a; 比自带的 unittest 更简洁高效&#xff0c;兼容 unittest框架 支持参数化 可以更精确的控制要测试的测试用例 丰富的插件&#xff0c;已有300多个各种各样的插件&#xff0c;也可自定义扩…

【JDK8新特性之Stream流-Stream结果收集案例实操】

一.JDK8新特性之Stream流-Stream结果收集以及案例实操 二.Stream结果收集(collect函数)-实例实操 2.1 结果收集到集合中 /*** Stream将结果收集到集合中以及具体的实现 collect*/Testpublic void test01(){// 收集到List中 接口List<Integer> list Stream.of(1, 2, 3…

代码随想录【Day23】| 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

669. 修剪二叉搜索树 题目链接 题目描述&#xff1a; 给定一个二叉搜索树&#xff0c;同时给定最小边界L 和最大边界 R。通过修剪二叉搜索树&#xff0c;使得所有节点的值在[L, R]中 (R>L) 。你可能需要改变树的根节点&#xff0c;所以结果应当返回修剪好的二叉搜索树的新…

Git ---- GitHub 操作

Git ---- GitHub 操作1. 创建远程仓库2. 远程仓库操作1. 创建爱你远程仓库别名2. 推送本地分支到远程仓库3. 克隆远程仓库到本地4. 邀请加入团队5. 拉取远程库内容3. 跨团队协作4. SSH 免密登录GitHub 网址&#xff1a;https://github.com/ Ps&#xff1a;全球最大同性交友网站…

makdown模版参考

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题&#xff0c;有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注…

RK系列(RK3568) i2s 音频输入 麦克风驱动

平台&#xff1a;Android12SOC&#xff1a;RK3568外围芯片&#xff1a;XS9922i2s简介&#xff1a;从上图看I2s主要的线有&#xff1a;SDO SCLK LRCK MCLK I2S协议只定义三根信号线&#xff1a;串行时钟信号SCLK(BCLK)、数据信号SD和左右声道选择信号WS。&#xff08;1&#xff…

Leetcode力扣秋招刷题路-0103

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 103. 二叉树的锯齿形层序遍历 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此…

注意力机制详解系列(一):注意力机制概述

&#x1f468;‍&#x1f4bb;作者简介&#xff1a; 大数据专业硕士在读&#xff0c;CSDN人工智能领域博客专家&#xff0c;阿里云专家博主&#xff0c;专注大数据与人工智能知识分享。 &#x1f389;专栏推荐&#xff1a; 目前在写CV方向专栏&#xff0c;更新不限于目标检测、…