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

发布于:2024-12-19 ⋅ 阅读:(12) ⋅ 点赞:(0)
前言

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

1. 环境准备

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

<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 片段。

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 对象:

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,这使得代码更加清晰和易于维护,特别是在字段名可能变化的情况下。

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


参考资料


网站公告

今日签到

点亮在社区的每一天
去签到