当前位置: 首页 > news >正文

MyBatis-Plus 中使用 Wrapper 自定义 SQL

在 MyBatis-Plus 中使用 Wrapper 自定义 SQL 可以灵活组合条件并复用条件逻辑,通过 ${ew.customSqlSegment} 占位符注入 Wrapper 生成的 SQL 片段。以下是详细步骤和示例:

核心步骤

  1. Mapper 接口定义方法 使用 @Param("ew") 注解声明 Wrapper 参数,在 SQL 中通过 ${ew.customSqlSegment} 引用条件。

  2. XML 或注解编写 SQL 在 SQL 中嵌入 ${ew.customSqlSegment},MyBatis-Plus 会自动替换为 Wrapper 生成的 WHERE 语句(包含 WHERE 关键字)。

  3. Wrapper 构建条件 使用 QueryWrapper/LambdaQueryWrapper 组装条件,注意字段名与 SQL 中的别名一致。

示例一:XML 方式实现自定义 SQL

1. Mapper 接口声明
public interface UserMapper extends BaseMapper<User> {// 使用 @Param("ew") 定义 Wrapper 参数List<User> selectUserList(@Param("ew") Wrapper<User> wrapper);
}

2. XML 映射文件(如 UserMapper.xml
<select id="selectUserList" resultType="User">SELECT id, name, age, email FROM user ${ew.customSqlSegment} <!-- 自动注入 WHERE 及条件 -->
</select>

3. 使用 Wrapper 构建查询
QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.like("name", "张")       // 模糊查询 name 包含"张".gt("age", 20)            // age > 20.orderByDesc("create_time"); // 按创建时间倒序List<User> users = userMapper.selectUserList(wrapper);

生成的 SQL:

SELECT id, name, age, email 
FROM user 
WHERE name LIKE '%张%' AND age > 20 
ORDER BY create_time DESC

示例二:注解方式实现自定义 SQL

Mapper 接口直接写 SQL
@Select("SELECT * FROM user ${ew.customSqlSegment}")
List<User> selectByWrapper(@Param("ew") Wrapper<User> wrapper);

示例三:联表查询 + Wrapper

1. Mapper 接口
List<UserVO> selectUserWithRole(@Param("ew") Wrapper<User> wrapper);

2. XML 映射文件
<select id="selectUserWithRole" resultType="UserVO">SELECT u.*, r.role_name FROM user uLEFT JOIN role r ON u.role_id = r.id${ew.customSqlSegment} <!-- 注入条件 -->
</select>

3. 使用 LambdaWrapper(避免硬编码字段名)
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.like(User::getName, "王")     // 使用实体类方法引用.eq(User::getStatus, 1)        // status = 1.nested(i -> i.gt(User::getAge, 18).or().isNotNull(User::getEmail)); // 嵌套条件List<UserVO> list = userMapper.selectUserWithRole(wrapper);

生成的 SQL:

SELECT u.*, r.role_name 
FROM user u 
LEFT JOIN role r ON u.role_id = r.id 
WHERE (name LIKE '%王%' AND status = 1 AND (age > 18 OR email IS NOT NULL)
)

注意事项

  1. 防止 SQL 注入 ${ew.customSqlSegment} 内部使用预编译安全处理,但避免在 SQL 中直接拼接 ${xxx}(除 MyBatis-Plus 官方占位符外)。

  2. 表别名问题 若 SQL 中使用别名(如 u.name),Wrapper 条件需同步声明别名:

   wrapper.like("u.name", "张"); // XML 中表别名为 u

  1. 空 Wrapper 处理 若 Wrapper 无条件,${ew.customSqlSegment} 生成空字符串,SQL 仍合法。

  2. 复杂 SQL 场景 如需分组、聚合函数等,直接在 SQL 中编写,Wrapper 仅负责 WHERE 条件部分。

总结

  • 核心占位符${ew.customSqlSegment} 注入动态条件。
  • 条件构造:通过 QueryWrapper 或 LambdaWrapper 构建树状条件(支持 and/or 嵌套)。
  • 安全机制:MyBatis-Plus 自动处理参数预编译,防止注入风险。

此方案完美契合 MyBatis-Plus 设计哲学,在保留原生 MyBatis 灵活性的同时,极大简化动态 SQL 编写。

http://www.dtcms.com/a/272124.html

相关文章:

  • 专题:2025供应链数智化与效率提升报告|附100+份报告PDF、原数据表汇总下载
  • 【2025/07/10】GitHub 今日热门项目
  • JavaEE——线程池
  • 嵌入式开发:云端仿真赋能WS2812创意灯光教学
  • PyTorch随机擦除:提升模型抗遮挡能力
  • 【会员专享数据】2013-2024年我国省市县三级逐日SO₂数值数据(Shp/Excel格式)
  • Houdini 分布式解算效率瓶颈突破:渲染 101 云集群实战指南
  • Transformer江湖录 第一章:江湖前传 - 神经网络门派纷争
  • 微服务架构下某汽车APP电商模块订单服务自动化测试方案(Python蹭个场)
  • YOLO11 目标检测从安装到实战
  • [论文阅读]LLMZip: Lossless Text Compression using Large Language Models
  • qemu vcpu的创建过程
  • 智慧气象新范式:人工智能如何重构城市级气象服务生态?
  • AI技术通过智能缺陷检测正在深度重构多个行业的生产模式、质量管理体系和人才结构,其影响已超越单纯的技术升级,正在引发系统性变革。
  • Windows 11 安装过程中跳过微软账户创建本地账户
  • 大模型 Agent(智能体)技术简介
  • 静默的田野革命—人工智能重构农业生态的技术风暴与文明悖论
  • 蛋白质序列-omega参数计算算法解读
  • 「按键精灵安卓/ios辅助工具」动态验证码该怎么得到完整的图片
  • 20250710解决KickPi的K7的SDK编译异常:rk3576-android14.0-25250704.tar.gz【降低BUILD_JOBS】
  • 微软365 PDF导出功能存在本地文件包含漏洞,可泄露敏感服务器数据
  • 【办公类-107-01】20250710视频慢速与视频截图
  • 用 ngrok + SSH 实现公网远程控制电脑
  • Linux Vim 编辑器详解:从入门到进阶(含图示+插件推荐)
  • FPGA设计思想与验证方法系列学习笔记001
  • XCZU47DR-2FFVG1517I Xilinx FPGA AMD ZynqUltraScale+ RFSoC
  • 原生微信小程序研发,如何对图片进行统一管理?
  • 从代码生成到智能运维的革命性变革
  • 基于elementUI的el-autocomplete组件的自动补全下拉框实践
  • LFU 缓存