详解Mybatis-Plus中分页插件PaginationInterceptor, MybatisPlusInterceptor在SpringBoot中的使用

news2024/11/17 0:46:59

文章目录

  • 1. 描述
    • 1.1 MybatisPlusInterceptor
    • 1.2 InnerInterceptor
  • 2. 实现
    • 2.1 不带条件的分页查询
    • 2.2 带条件的分页查询
    • 2.3 简述Page类
  • 3. 注意事项

1. 描述

1.1 MybatisPlusInterceptor

我们在开发的过程中,经常会遇到分页操作,其分为逻辑分页和物理分页,具体可参考我的博文:逻辑分页和物理分页

如果你用的是Mybatis-Plus框架,可用MybatisPlusInterceptor按如下配置分页代码:

/**
 * @author 念兮为美
 * @datetime 2022/11/28 14:10
 * @desc mybatis plus 配置类
 */
@Configuration
public class MybatisPlusConfig {

  @Bean
  public MybatisPlusInterceptor mybatisPlusInterceptor() {
    MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
    // 设置为使用 MYSQL 方言
    interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
    return interceptor;
  }
}

如果你用的是低版本spring boot,可用PaginationInterceptor按如下配置:

/**
 * @author 念兮为美
 * @datetime 2022/11/27 15:22
 * @desc mybatis plus 配置类
 */
@Configuration
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

MybatisPlusInterceptor插件是核心插件,目前代理了Executor#query、Executor#update、StatementHandler#prepare方法,其属性:

private List<InnerInterceptor> interceptors = new ArrayList<>();

1.2 InnerInterceptor

注意List<InnerInterceptor>泛型中的InnerInterceptormybatis-plus提供的插件都将基于此接口来实现功能,目前已有的功能如下:

  1. 自动分页: PaginationInnerInterceptor

  2. 多租户:TenantLineInnerInterceptor

  3. 动态表名:DynamicTableNameInnerInterceptor

  4. 乐观锁:OptimisticLockerInnerInterceptor

  5. sql性能规范: IllegalSQLInnerInterceptor

  6. 防止全表更新与删除: BlockAttackInnerInterceptor

【注意】使用多个功能需要注意顺序关系,建议使用如下顺序:

  1. 多租户

  2. 动态表名

  3. 分页,乐观锁

  4. sql性能规范,防止全表更新与删除

总结:对sql进行单次改造的优先放入,不对sql进行改造的最后放入。

2. 实现

2.1 不带条件的分页查询

  1. 编写查询展示类
/**
 * @author 念兮为美
 * @datetime 2023/2/2 09:58
 * @desc 用户查询结果
 */
@NoArgsConstructor
@Data
@ApiModel(description = "用户返回结果")
public class UserPageVo {

  @ApiModelProperty(name = "username", value = "用户名")
  private String username;

  @ApiModelProperty(name = "nickname", value = "昵称")
  private String nickname;

  @ApiModelProperty(name = "userType", value = "用户类型")
  private String userType;
}
  1. 编写mapper
@Mapper
public interface UserMapper extends BaseMapper<User> {

   @Select("select " +
            "username,nickname,user_type as userType " +
          "from " +
            "user " +
          "order by " +
            "create_time desc"
  )
  List<UserPageVo> findPageUsers(Page<UserPageVo> page);
}
  1. 编写service
@Service
public class UserService extends ServiceImpl<UserMapper, User> {

  @Resource private UserMapper userMapper;
  
  public Page<UserPageVo> findPageUsers() {
    Long currentPage = 4L;
    Long pageSize = 3L;
    Page<UserPageVo> page = new Page<>(currentPage, pageSize);
    List<UserPageVo> pageUsers = userMapper.findPageUsers(page);
    page.setRecords(pageUsers);
    return page;
  }
}
  1. 编写controller
@Api(tags = "用户模块")
@RestController
@RequestMapping("/user")
@Slf4j
@Validated
public class UserController {

  @Autowired private UserService userService;

  @ApiOperationSupport(author = "念兮为美")
  @ApiOperation(value = "用户查询接口")
  @GetMapping("/findPageUsers")
  public Page<UserPageVo> findPageUsers() {
    return userService.findPageUsers();
  }
}
  1. 测试运行结果

在这里插入图片描述

JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@2ce7d43] will not be managed by Spring
==>  Preparing: SELECT COUNT(*) AS total FROM user
==> Parameters: 
<==    Columns: total
<==        Row: 24
<==      Total: 1
==>  Preparing: select username,nickname,user_type as userType from user order by create_time desc LIMIT ?,?
==> Parameters: 9(Long), 3(Long)
<==    Columns: username, nickname, userType
<==        Row: cs, null, admin
<==        Row: lin, null, admin
<==        Row: test3, null, TEST4
<==      Total: 3

2.2 带条件的分页查询

public class UserService extends ServiceImpl<UserMapper, User> {

  @Resource private UserMapper userMapper;

  public Page<User> findPageUsers() {
    Long currentPage = 1L;
    Long pageSize = 3L;
    Page<User> page = new Page<>(currentPage, pageSize);
    QueryWrapper<User> queryWrapper = new QueryWrapper<>();
    queryWrapper.eq("username", "test5");
    Page<User> userPage = userMapper.selectPage(page, queryWrapper);
    return userPage;
  }

运行结果:

在这里插入图片描述

JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@475454ae] will not be managed by Spring
==>  Preparing: SELECT COUNT(*) AS total FROM user WHERE deleted = false AND (username = ?)
==> Parameters: test2(String)
<==    Columns: total
<==        Row: 1
<==      Total: 1
==>  Preparing: SELECT username,nickname,user_type FROM user WHERE deleted=false AND (username = ?) LIMIT ?
==> Parameters: test2(String), 3(Long)
<==    Columns: username, nickname, user_type
<==        Row:  test2, null,TEST6
<==      Total: 1

2.3 简述Page类

简单分页模型, 有如下几个主要属性

/**
 * 查询数据列表
 */
protected List<T> records = Collections.emptyList();

/**
 * 总数
 */
protected long total = 0;

/**
 * 每页显示条数,默认 10
 */
protected long size = 10;

/**
 * 当前页
 */
protected long current = 1;

3. 注意事项

在编写mapper.xml中的SQL语句时,或者使用@select注解编写SQL语句时,语句末尾不能使用 ; 结尾,原因是在做分页的时候会在编写的SQL语句后面拼接上limit语句, 导致出现SQL语法错误(SQLSyntaxErrorException),如下所示:

@Select("select " +
            "username,nickname,user_type as userType " +
          "from " +
            "user " +
          "order by " +
            "create_time desc;"
  )
  List<UserPageVo> findPageUsers(Page<UserPageVo> page);

运行结果:

JDBC Connection [com.alibaba.druid.proxy.jdbc.ConnectionProxyImpl@498d7c57] will not be managed by Spring
==>  Preparing: SELECT COUNT(*) AS total FROM user
==> Parameters: 
<==    Columns: total
<==        Row: 24
<==      Total: 1
==>  Preparing: select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,?
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@6f5c4fa1]
org.springframework.jdbc.UncategorizedSQLException: 
### Error querying database.  Cause: java.sql.SQLException: sql injection violation, dbType mysql, , druid-version 1.2.11, syntax error: not supported.pos 89, line 1, column 85, token LIMIT : select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,?
### The error may exist in com/cloud/lowcode/mapper/UserMapper.java (best guess)
### The error may involve com.cloud.lowcode.mapper.UserMapper.findPageUsers
### The error occurred while executing a query
### SQL: select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,?
### Cause: java.sql.SQLException: sql injection violation, dbType mysql, , druid-version 1.2.11, syntax error: not supported.pos 89, line 1, column 85, token LIMIT : select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,?
; uncategorized SQLException; SQL state [null]; error code [0]; sql injection violation, dbType mysql, , druid-version 1.2.11, syntax error: not supported.pos 89, line 1, column 85, token LIMIT : select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,?; nested exception is java.sql.SQLException: sql injection violation, dbType mysql, , druid-version 1.2.11, syntax error: not supported.pos 89, line 1, column 85, token LIMIT : select username,nickname,user_type as userType from user order by create_time desc; LIMIT ?,?
	at org.mybatis.spring.MyBatisExceptionTranslator.translateExceptionIfPossible(MyBatisExceptionTranslator.java:92)

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

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

相关文章

Gif动态图片如何用静图制作?教你静图合成动图的方法

gif动图如何制作&#xff1f;相信对于gif动图大家都不陌生&#xff0c;在平时的聊天软件中、公众号文章中都可以看到。那么&#xff0c;要如何制作gif动图呢&#xff1f;下面&#xff0c;就给教大家两个在线gif制作&#xff08;https://www.gif.cn/&#xff09;的方法&#xff…

综合案例【商品管理系统-Java基础版】(附完整源码)

Java语言的一个超级简易的商品管理系统&#xff0c;适合初学者练手 源码包无法上传至资源&#xff08;blog已经超级完整啦&#xff09;如果还是需要完整源码src包可私分享 目录1 项目分析1.1 用户模块&#xff08;普通用户、管理员用户&#xff09;1.1.1前端系统&#xff08;普…

FluentReader为什么称之为高颜值的rss阅读器

Fluent Reader 这是一款 RSS 阅读器。对于很多年轻的网友来说&#xff0c;RSS 这个名词可能有点陌生。简单来说只要某个网站支持 RSS&#xff0c;你订阅了 RSS 后&#xff0c;一旦网站更新了内容&#xff0c;就会推送到你面前。这时候&#xff0c;我们就需要一款像 Fluent Rea…

全屋智能三国志

刚刚过去的春节假期&#xff0c;对我来说&#xff0c;是一个收集现实素材、感应社会变化的好机会。也确实发现了不少新趋势&#xff0c;一个结论是&#xff1a;智能家居正在酝酿新一轮的市场浪潮。以央视春晚作为切口&#xff0c;每年央视春晚的广告投放&#xff0c;都一定程度…

vscode 配置 plantuml

1、首先安装 plantuml 插件 2、安装 java 开发环境 如果是 mac 系统&#xff0c;直接执行 brew install java &#xff0c;然后按照下图执行下提示中的命令即可 如果是 windows 系统&#xff0c;需要去官网下载 java jdk&#xff0c;安装好之后添加运行路径到 path 中 https://…

基于 ShardingSphere 的分布式数据库负载均衡架构搭建实战

本文主要分为 3 部分&#xff0c;将依次介绍&#xff1a; 基于 ShardingSphere 的分布式数据库「负载均衡架构搭建」要点结合实际的「用户问题案例」&#xff0c;介绍引入「负载均衡」的影响介绍并展示 ShardingSphere 分布式数据库在云上的「一站式解决方案」 文章目录Shardi…

LED背光车载驱动IC 可支持48通道

特性电源电压范围-VDD:3.3V~5.5V-VLED:27V(max)48 个恒流输出通道- 通道恒流输出范围 0~50mA一 通道间电流输出偏差小于3%- 芯片间电流输出偏差小于 3%Low Knee Voltage:0.55V小于20mA0.6V 大于20mA最大支持4扫&#xff0c;内嵌行控制信号通道灰度实现-支持 PWM/PAMPWM驱动 -灰…

云帆文档管理系统版本更新说明:v4.6.0

一、新增及优化功能资料管理新增打包下载管理端增加资料查阅菜单&#xff0c;管理端和用户端用户有同样的查阅权限&#xff0c;方便其快速的查阅企业的资料信息前端下载文档格式添加下载水印&#xff0c;水印显示的是下载的用户和日期采购合同增加智能识别功能资料管理添加关键…

KPI考核系统实战之二:swagger框架

KPI考核系统实战之二&#xff1a;swagger框架一、asp.net core 3.1二、融合swagger1.Nuget安装Swashbuckle.AspNetCore2.Startup.cs 注册Swagger服务&#xff0c;使用swagger中间件一、asp.net core 3.1 使用Visual Studio 2022&#xff0c;搭建asp.net core weiapi开发平台&a…

煤矿皮带运行状态监测预警系统 yolov7

煤矿皮带运行状态监测预警系统通过yolov7网络模型深度学习技术&#xff0c;自动对传输皮带运行状态进行实时监测。当监测到皮带撕裂、跑偏、异物、堆煤等异常情况时&#xff0c;立即抓拍预警及时停止皮带同步回传违规信息到后台。介绍Yolo算法之前&#xff0c;首先先介绍一下滑…

PushKit/Callkit使用经验

前言&#xff1a;如果要求使用这两种库&#xff0c;请在查询资料并自己尝试后&#xff0c;多参考苹果官方的API文档&#xff1a;PushKit&#xff1a;https://developer.apple.com/documentation/pushkit?languageobjcCallKit&#xff1a;https://developer.apple.com/document…

人工智能与模式识别的意义(模式识别与图像处理课程作业)

人工智能与模式识别的意义(模式识别与图像处理课程作业一、 人工智能的意义二、 模式识别的意义2.1、文字识别2.2、语音识别2.3、指纹识别2.4、遥感2.5、医学诊断1、语音识别技术2、生物认证技术3、数字水印技术一、 人工智能的意义 人工智能的发送对于我们社会的各个方面都具有…

Word页面中四个直角

文章目录1、四个直角1&#xff09;代表页边距2&#xff09;页边距的设置3&#xff09;打开或关闭“裁剪标记”2、“裁剪标记”与图片1&#xff09;插入图片超过这个角能打印显示出来吗&#xff1f;3、“裁剪标记”与表格1、四个直角 1&#xff09;代表页边距 页面中的四个角代…

【LoRa网关以及LoRa自组网】以“有人物联网”为例

【LoRa网关以及LoRa自组网】以“有人物联网”为例0.参考资料1. LoRa 自组网协议的理解1.1【LoRa模块WH-L101-L-P-H10 】1.2【LoRa网关设置】1.3【节点、网关、服务器通讯】1.4【一些注意事项】1.5【专业名词】2.【LoRa点对点通讯 】LoRa网关可以实现多个LoRa节点的数据采集&…

咖啡商城|基于Springboot+Vue前后端分离咖啡商城系统

作者主页&#xff1a;编程指南针 作者简介&#xff1a;Java领域优质创作者、CSDN博客专家 、掘金特邀作者、多年架构师设计经验、腾讯课堂常驻讲师 主要内容&#xff1a;Java项目、毕业设计、简历模板、学习资料、面试题库、技术互助 收藏点赞不迷路 关注作者有好处 文末获取源…

微软开源的 5 个 yyds 课程!

微软在 GitHub 开源了五大课程&#xff0c;面向计算机专业或者入门编程的同学。分别是 Web 开发课程、机器学习课程、物联网课程、数据分析课程、Bash 课程。01为初学者准备的 Web开发课程这个 65k Star 的 Web 开发课程由 Microsoft 的 Azure Cloud Advocates 出品&#xff0…

prometheus登录认证

目标 登录Prometheus的9090端口页面的时候&#xff0c;需要输入用户名和密码&#xff0c;才能进入Prometheus页面。 设置密码 Prometheus配置密码不能是明文&#xff0c;必须经过bcrypt程序对密码进行Hash处理。 vim gen-pass.py 内容如下&#xff1a; import getpass import…

Node,docker 中安装node.js

1.启动docker服务 首先启动docker服务:systemctl start docker 2.获取node最新镜像 启动完成之后拉取node最新镜像&#xff1a;docker pull node 然后开始等待&#xff0c;最后拉取完成会有相应的输出信息。 我们再通过命令确认下node是否拉取成功&#xff1a;docker image…

大文件上传和下载解决方案

前言 前端处理 “大” 一直是一个痛点和难点&#xff0c;比如大文件、大数据量。虽然浏览器硬件有限&#xff0c;但是聪明的工程师总是能够最大化利用浏览器的能力和特性&#xff0c;优雅的解决一个个极端问题&#xff0c;满足用户的多样化需求。 断点上传 对于大文件&#…

Linux中的磁盘管理与打包命令

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…