MyBatis-Plus中使用Wrapper自定义SQL的详细步骤

 更新时间:2025年07月11日 10:55:32   作者:野犬寒鸦  
在 MyBatis-Plus 中使用 Wrapper 自定义 SQL 可以灵活组合条件并复用条件逻辑,通过 ${ew.customSqlSegment} 占位符注入 Wrapper 生成的 SQL 片段,本文给大家介绍了详细步骤和示例,需要的朋友可以参考下

核心步骤

  • Mapper 接口定义方法 使用 @Param("ew") 注解声明 Wrapper 参数,在 SQL 中通过 ${ew.customSqlSegment} 引用条件。
  • XML 或注解编写 SQL 在 SQL 中嵌入 ${ew.customSqlSegment},MyBatis-Plus 会自动替换为 Wrapper 生成的 WHERE 语句(包含 WHERE 关键字)。
  • 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 u
    LEFT 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)
)

注意事项

  • 防止 SQL 注入 ${ew.customSqlSegment} 内部使用预编译安全处理,但避免在 SQL 中直接拼接 ${xxx}(除 MyBatis-Plus 官方占位符外)。
  • 表别名问题 若 SQL 中使用别名(如 u.name),Wrapper 条件需同步声明别名:
wrapper.like("u.name", "张"); // XML 中表别名为 u
  • 空 Wrapper 处理 若 Wrapper 无条件,${ew.customSqlSegment} 生成空字符串,SQL 仍合法。
  • 复杂 SQL 场景 如需分组、聚合函数等,直接在 SQL 中编写,Wrapper 仅负责 WHERE 条件部分。

总结

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

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

以上就是MyBatis-Plus中使用Wrapper自定义SQL的详细步骤的详细内容,更多关于MyBatis-Plus Wrapper自定义SQL的资料请关注脚本之家其它相关文章!

相关文章

  • Java中程序的运行全过程

    Java中程序的运行全过程

    这篇文章主要介绍了Java中程序的运行全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • java compare compareTo方法区别详解

    java compare compareTo方法区别详解

    本文主要介绍了java compare compareTo方法区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-09-09
  • Java并发编程必备之Future机制

    Java并发编程必备之Future机制

    今天给大家带来的是关于Java并发编程的相关知识,文章围绕着Java Future机制展开,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • 如何通过Java实现加密、解密Word文档

    如何通过Java实现加密、解密Word文档

    这篇文章主要介绍了如何通过Java实现加密、解密Word文档,对一些重要文档,常需要对文件进行加密,查看文件时,需要正确输入密码才能打开文件。下面介绍了一种比较简单的方法给Word文件加密以及如何给已加密的Word文件解除密码保护,需要的朋友可以参考下
    2019-07-07
  • Java中的泛型方法详解及简单实例

    Java中的泛型方法详解及简单实例

    这篇文章主要介绍了Java中的泛型方法详细介绍的相关资料,需要的朋友可以参考下
    2016-12-12
  • 基于Java编写一个PDF与Word文件转换工具

    基于Java编写一个PDF与Word文件转换工具

    前段时间一直使用到word文档转pdf或者pdf转word,寻思着用Java应该是可以实现的,于是花了点时间写了个文件转换工具,感兴趣的可以了解一下
    2023-01-01
  • IDEA连接postgressql数据库操作

    IDEA连接postgressql数据库操作

    这篇文章主要介绍了IDEA连接postgressql数据库操作,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-08-08
  • Java中文件读写操作与常用技巧分享

    Java中文件读写操作与常用技巧分享

    在 Java I/O 体系中,File 类是唯一代表磁盘文件本身的对象,而File 类定义了一些与平台无关的方法来操作文件,所以下面我们一起来看看 File 类有哪些操作方法吧
    2023-06-06
  • 基于java实现简单的图片类别识别

    基于java实现简单的图片类别识别

    这篇文章主要为大家详细介绍了如何基于java实现简单的图片类别识别功能,文中的示例代码讲解详细,具有一定的借鉴价值,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-12-12
  • Spring框架整合Java Web Token问题

    Spring框架整合Java Web Token问题

    这篇文章主要介绍了Spring框架整合Java Web Token问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-09-09

最新评论