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
相关推荐
敲个大西瓜7 天前
mybatis拦截器插件实现数据库字段加解密
mybatis
武子康7 天前
Java-28 深入浅出 Spring 实现简易Ioc-04 在上节的业务下手动实现AOP
java·后端·mybatis
一条泥憨鱼7 天前
苍穹外卖【day6|微信登录与商品浏览功能】
后端·mybatis·苍穹外卖
vx-Biye_Design7 天前
springboot安阳地区研学旅游服务小程序-计算机毕业设计源码12785
java·vue.js·windows·spring boot·tomcat·maven·mybatis
摇滚侠7 天前
MyBatis+Spring+SpringMVC SSM 整合 179-185
java·spring·mybatis
摇滚侠7 天前
MyBatis+Spring+SpringMVC SSM ContextLoaderListener 177-178
java·spring·mybatis
Spring小子8 天前
【Spring Boot + Vue + DeepSeek】从零打造一个AI驱动的智能健康分析系统
java·spring boot·mybatis
武子康8 天前
Java-27 深入浅出 Spring - 实现简易Ioc-03 在上节的业务下手动实现IoC 从 XML 配置到 BeanFactory 反射注入
java·后端·mybatis
柏舟飞流8 天前
Spring Boot 进阶实战:整合 MyBatis、Redis、JWT,搭一个更像真实项目的后端服务
spring boot·redis·mybatis