使用 MyBatis-Plus Wrapper 构建自定义 SQL 查询

前言

MyBatis-Plus (MP) 是一款基于 MyBatis 的增强工具,它简化了数据库操作,提供了诸如自动分页、条件构造器等功能,极大地提高了开发效率。其中,Wrapper 条件构造器是 MP 的核心功能之一,它允许开发者以链式调用的方式构造复杂的查询条件,而无需编写繁琐的SQL语句。本文简单讲讲如何使用 MyBatis-Plus 的 Wrapper 来构建复杂的查询条件,并结合自定义 SQL 片段,实现更加灵活的数据访问。

1. 环境准备

确保你的项目中已正确引入 mybatis-plus 相关依赖,并且版本至少为 3.0.7,以支持自定义 SQL 功能。

xml 复制代码
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.4.3</version> <!-- 或更高 -->
</dependency>
2. 使用 Wrapper 自定义 SQL

MyBatis-Plus 提供了强大的条件构造器(Wrapper),用于构建复杂的查询和更新条件。通过 Wrapper,开发者可以避免编写繁琐的 SQL 语句,提高代码的安全性和可维护性。下面介绍如何利用 Wrapper 结合自定义 SQL 片段来实现复杂查询。

2.1 参数命名与引用

在自定义 SQL 中传递 Wrapper 对象作为参数时,参数名必须为 ew,或者使用注解 @Param(Constants.WRAPPER) 明确指定参数为 Wrapper 对象。然后,在 SQL 语句中,可以通过 ${ew.customSqlSegment} 引用 Wrapper 对象生成的 SQL 片段。

2.2 编写 Mapper 接口方法

定义一个接口方法,使用自定义的 SQL 语句,并通过 ${ew.customSqlSegment} 引入 Wrapper 对象生成的 SQL 片段。

java 复制代码
import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.toolkit.Constants;
import org.apache.ibatis.annotations.Param;
import java.util.List;

public interface UserMapper extends BaseMapper<User> {
    @Select("SELECT * FROM user ${ew.customSqlSegment}")
    List<User> selectByCustomSql(@Param(Constants.WRAPPER) Wrapper<User> wrapper);
}
2.3 调用示例

调用上述方法并传入一个 Wrapper 对象:

java 复制代码
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "张三");

List<User> userList = userMapper.selectByCustomSql(queryWrapper);

这段代码会执行一个带有 WHERE name = '张三' 条件的查询,返回所有符合条件的用户记录。

3. 注意事项
  • 线程安全性 :Wrapper 实例不是线程安全的,因此建议每次使用时创建新的 Wrapper 实例。
  • SQL 注入防护:务必对任何前端传入的 SQL 片段进行严格过滤,防止 SQL 注入攻击。
  • 不支持基于 entity 的 where 语句 :当使用自定义 SQL 时,Wrapper 对象不会基于实体类自动生成 WHERE 子句,你需要手动编写完整的 SQL 语句。
4. 高级功能

除了基本的条件构造外,MyBatis-Plus 还提供了 Lambda 表达式风格的 Wrapper,如 LambdaQueryWrapper 和 LambdaUpdateWrapper,这使得代码更加清晰和易于维护,特别是在字段名可能变化的情况下。

java 复制代码
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
lambdaQueryWrapper.like(User::getName, "王");

此外,Wrapper 支持多种条件组合,如 eq, ne, gt, lt, between, like, in, isNull, groupBy, orderBy, having 等,满足不同的查询需求。

5. 总结

通过 MyBatis-Plus 的 Wrapper 功能,开发者能够以链式调用的方式快速构建复杂的查询条件,同时结合自定义 SQL 片段,实现了更灵活的数据访问方式。


参考资料

相关推荐
派小心.22 分钟前
网站统计多域名数据隔离配置
大数据·数据库·人工智能·小程序·数据分析
DongQiShanRen35 分钟前
六根硬件映射(中):双站校验、生克闭环与驱动接口
数据库·人工智能·算法·rust·哈希算法·集成学习
wespaul43 分钟前
VeapAI 自然语言操作实战|第 09 篇:收尾——六条原则与三条演进线
大数据·数据库·人工智能
tryxr1 小时前
事务的特性
数据库·事务
广州灵眸科技有限公司1 小时前
瑞芯微(EASY EAI)RV1126B DeepSeek R1部署教程
linux·数据库·yolo
枫叶丹41 小时前
异构数据库结构如何同步:理解 KFS 的 DDL 转换机制
网络·数据库
这个DBA有点耶1 小时前
MySQL B-tree索引并发控制优化:写密集场景的锁瓶颈与内核级解法
java·数据库·程序人生·算法·database·dba
福大大架构师每日一题1 小时前
agno v3.1.3发布:外部智能体全面进入“可持久化、可恢复、可取消、可回放”时代
服务器·数据库·php
数据库小学妹2 小时前
工业物联网时序数据库怎么选?存-查-算一体化选型指南
数据库·物联网·时序数据库·工业物联网·融合数据库·时序选型
wespaul2 小时前
VeapAI 自然语言操作实战|第 08 篇:治理层——审计、指标、评估与权限
运维·网络·数据库