用下面一段代码解释
@Select("SELECT g.*, d.detail " +
"FROM wms_good g " +
"LEFT JOIN wms_goods_detail d ON g.goods_id = d.good_id " +
"${ew.customSqlSegment}")
Page<GoodsDTO> selectGoodsWithDetail(Page<GoodsDTO> page, @Param(Constants.WRAPPER) QueryWrapper<WmsGood> wrapper);
//这里的pagemybatis-plus,根据page的属性自动帮我们生成了limit的语句
1. @Param 注解的作用
-
核心功能:为 Mapper 接口方法的参数指定名称
-
解决的问题:在 MyBatis 中,当 Mapper 方法有多个参数时,XML 映射文件无法直接通过参数名引用参数
-
使用场景
// 没有 @Param 时,XML 中需用 param1, param2 引用 User selectUser(String name, Integer age); // 使用 @Param 后,XML 可直接用注解值引用 User selectUser(@Param("userName") String name, @Param("userAge") Integer age);
2.Constants.WRAPPER 的特殊含义
-
来源:MyBatis-Plus 的常量类 com.baomidou.mybatisplus.core.toolkit.Constants
-
实际值:"ew"(Entity Wrapper 的缩写)
-
设计目的:统一条件构造器参数的标识名称
-
将 QueryWrapper<WmsGood> 类型的参数命名为 "ew"
-
ew 对应 @Param(Constants.WRAPPER) 指定的参数名
-
customSqlSegment 是 QueryWrapper 的方法,返回生成的 SQL 条件片段
-
说白了@Param(Constants.WRAPPER)作用就是将自己的wrapper条件重命名为ew
${ew.customSqlSegment} 是 MyBatis-Plus 框架中的一个动态 SQL 片段占位符,用于在 XML 映射文件中直接插入由 QueryWrapper 或 UpdateWrapper 生成的 SQL 条件语句
如果说wrapper条件为
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("status", 1)
.like("name", "Tom")
.orderByDesc("age");
${ew.customSqlSegment} 会被替换为:
WHERE status = 1 AND name LIKE '%Tom%' ORDER BY age DESC