MyBatis-Plus 分页查询@Param 注解

前言

在 SpringBoot + MyBatis-Plus 的后端开发中,分页查询是最常用的功能之一。很多新手在编写 Mapper 接口时,都会遇到和你一样的困惑:

复制代码
Page<PaymentOrderVO> selectRevenuePaymentOrderPage(
    Page<PaymentOrderVO> page,
    @Param("query") PaymentOrderPageQueryDTO query
);
  • 这个方法到底是1 个参数还是 2 个参数
  • 为什么query必须加@Parampage却不用加?
  • 不写@Param到底行不行?

MyBatis 核心规则:多参数必须加 @Param

1. 基础规则

  • 单参数 :可以不加@Param
  • 多参数(2 个及以上)业务参数必须加@Param("别名")

2. 为什么必须加?

MyBatis 底层无法直接识别参数名,多参数时会自动把参数重命名为:

arg0、arg1、param1、param2

如果不加@Param("query"),你的 XML 文件就无法识别query这个名称:

复制代码
<!-- 不加@Param,这里会报错,MyBatis不认识query -->
WHERE status = #{query.status}

加了@Param("query"),相当于给参数起别名,XML 就能正常取值。


特殊疑问:Page 参数为什么不用加 @Param?

这是 MyBatis-Plus 的专属特性,也是最容易疑惑的点!

参数 身份 处理方 是否需要在 XML 手写 是否需要 @Param
Page<T> page MP内置分页对象 MyBatis-Plus 自动处理 ❌ 不需要 ❌ 不需要
QueryDTO query 自定义业务查询对象 开发者手动在 XML 使用 ✅ 必须写 ✅ 必须加

直白解释

  1. Page是 MyBatis-Plus 的亲儿子 ,框架会自动识别它,自动拼接LIMIT分页 SQL,你完全不需要在 XML 里调用page的属性
  2. 既然 XML 里用不到它,就没必要给它起别名,自然不用加@Param
  3. 强行给page@Param也不会报错,但完全多余

实战验证:加与不加的区别

1. 正确写法

复制代码
// 分页参数:MP自动处理,不加@Param
// 查询参数:XML要用,必须加@Param
Page<PaymentOrderVO> selectRevenuePaymentOrderPage(
    Page<PaymentOrderVO> page,
    @Param("query") PaymentOrderPageQueryDTO query
);

WHERE create_time BETWEEN #{query.beginTime} AND #{query.endTime}

2. 错误写法(报错)

复制代码
// 多参数不加@Param,XML无法识别query
Page<PaymentOrderVO> selectRevenuePaymentOrderPage(
    Page<PaymentOrderVO> page,
    PaymentOrderPageQueryDTO query
);

报错原因:MyBatis 不认识query别名。

总结

  1. MyBatis 多参数场景 :自定义业务参数必须加@Param
  2. MyBatis-Plus 的Page分页参数 :框架自动处理,永远不用加@Param
相关推荐
敲代码的嘎仔18 小时前
互动问答系统实战:两级评论模型、ES 搜索集成、Caffeine 多级缓存全记录
java·开发语言·数据库·elasticsearch·缓存·mybatis·高并发
无风听海2 天前
深入解析 Elasticsearch 的 match_phrase_prefix与 match_bool_prefix
大数据·elasticsearch·mybatis
摆烂z2 天前
定时任务同步数据--续跑&重试
java·mybatis·ai编程
Wang's Blog3 天前
Java框架快速入门: Spring Security+OAuth2之实现UserDetails与GrantedAuthority深度定制
java·spring·mybatis
阿维的博客日记4 天前
Example 类全场景实战指南
java·mybatis
阿维的博客日记5 天前
Example API指南2
java·mybatis
霸道流氓气质6 天前
MyBatis 与 SQL 层面关键技术详解
windows·sql·mybatis
₍˄·͈༝·͈˄*₎◞ ̑̑码6 天前
MyBatis操作数据库
数据库·mybatis
干到60岁退休的码农7 天前
13.构建登录接口响应数据
java·spring boot·mybatis
SQL-First布道者8 天前
我为什么把 MyBatis 从项目中删了?
java·spring·tomcat·mybatis·mybatis plus·spring jdbc