使用 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 片段,实现了更灵活的数据访问方式。


参考资料

相关推荐
豆芽脚脚6 小时前
MongoDB 导出和导入完整指南
数据库·mongodb
烧饼Fighting6 小时前
Mysql替换为瀚高数据库部分函数转换V4.5版本
数据库·mysql
冰冰菜的扣jio6 小时前
Redis缓存问题——一致性问题、事务、持久化
java·spring·mybatis
上善若水_厚德载物7 小时前
Centos7 Mysql 5.7 读写分离
数据库·mysql
Mr__Miss7 小时前
Redis的持久化
数据库·redis·缓存
CCPC不拿奖不改名8 小时前
SQL基础(SQL小白教程):MySQL语句+环境一键搭建+面试习题
数据库·sql·计算机网络·mysql·oracle·面试·职场和发展
陈文锦丫8 小时前
JAVA面试
数据库·mysql
sunfove8 小时前
将 Python 仿真工具部署并嵌入个人博客
开发语言·数据库·python
冰清-小魔鱼9 小时前
各类数据存储结构总结
开发语言·数据结构·数据库
深藏bIue10 小时前
MongoDB 4.4.30安装、数据迁移
数据库·mongodb