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