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

前言

MyBatis-Plus (MP) 是一款基于 MyBatis 的增强工具,它简化了数据库操作,提供了诸如自动分页、条件构造器等功能,极大地提高了开发效率。其中,Wrapper 条件构造器是 MP 的核心功能之一,它允许开发者以链式调用的方式构造复杂的查询条件,而无需编写繁琐的SQL语句。本文简单讲讲如何使用 MyBatis-PlusWrapper 来构建复杂的查询条件,并结合自定义 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,如 LambdaQueryWrapperLambdaUpdateWrapper,这使得代码更加清晰和易于维护,特别是在字段名可能变化的情况下。

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

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

5. 总结

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


参考资料

相关推荐
fredinators14 分钟前
数据库flask访问
数据库·oracle·flask
向葭奔赴♡20 分钟前
Spring Boot 分模块:从数据库到前端接口
数据库·spring boot·后端
JosieBook1 小时前
【数据库】时序数据库选型指南:在大数据与工业4.0时代,为何 Apache IoTDB 成为智慧之选?
大数据·数据库·时序数据库
程序员三明治1 小时前
详解Redis锁误删、原子性难题及Redisson加锁底层原理、WatchDog续约机制
java·数据库·redis·分布式锁·redisson·watchdog·看门狗
chenzhou__1 小时前
MYSQL学习笔记(个人)(第十五天)
linux·数据库·笔记·学习·mysql
一只自律的鸡2 小时前
【MySQL】第二章 基本的SELECT语句
数据库·mysql
liliangcsdn3 小时前
如何使用python创建和维护sqlite3数据库
数据库·sqlite
TDengine (老段)9 小时前
TDengine 数学函数 DEGRESS 用户手册
大数据·数据库·sql·物联网·时序数据库·iot·tdengine
TDengine (老段)9 小时前
TDengine 数学函数 GREATEST 用户手册
大数据·数据库·物联网·时序数据库·iot·tdengine·涛思数据
安当加密10 小时前
云原生时代的数据库字段加密:在微服务与 Kubernetes 中实现合规与敏捷的统一
数据库·微服务·云原生