摘要:
主要介绍MyBatis-Plus条件构造器,包括定义、常见构造器(QueryWrapper、UpdateWrapper、LambdaQueryWrapper、LambdaUpdateWrapper)、自定义SQL、示例,以及使用建议.
一、定义
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的 数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险.
Wrapper类下面的更多操作,详情见条件构造器.
二、常见的构造器及其功能

-
AbstractWrapper:这是一个抽象基类,提供了所有 Wrapper 类共有的方法和属性。它定义了条件构造的基本逻辑,包括字段(column)、值(value)、操作符(condition)等。所有的 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都继承自 AbstractWrapper.
-
QueryWrapper:专门用于构造查询条件,支持基本的等于(eq)、不等于(ne)、大于(gt)、小于(lt)等各种常见操作。它允许你以链式调用的方式添加多个查询条件,并且可以组合使用 and 和 or 逻辑.
-
UpdateWrapper:用于构造更新条件,可以在更新数据时指定条件。与 QueryWrapper 类似,它也支持链式调用和逻辑组合。使用 UpdateWrapper 可以在不创建实体对象的情况下,直接设置更新字段和条件.
-
LambdaQueryWrapper:这是一个基于 Lambda 表达式的查询条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。这种方式提高了代码的可读性和可维护性,尤其是在字段名可能发生变化的情况下.
-
LambdaUpdateWrapper:类似于 LambdaQueryWrapper,LambdaUpdateWrapper 是基于 Lambda 表达式的更新条件构造器。它允许你使用 Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题.
查询示例:
问题:
查询一个名字带O的,存款大于等于1000元的人的id、username、info、balance.
SQL语句:
SELECT id, username, info, balance FROM user WHERE username LIKE '%O%' AND balance >= 1000;
Wrapper:
@Test
void QueryWrapper(){
//1.构建查询条件
QueryWrapper<User> wrapper = new QueryWrapper<User>()
.select("id", "username", "info", "balance")
.like("username", "o")
.ge("balance", "1000");
//2.查询
userMapper.selectList(wrapper);
}
更新示例一:
问题:
更新用户名为jack的用户余额为200.
SQL:
UPDATE user SET balance = 200 WHERE(username = "jack")
Wrapper:
@Test
void testupdateByQueryWrapper(){
//1.要更新的数据
User user = new User();
user.setBalance(200);
//2.更新的条件
QueryWrapper<User> wrapper = new QueryWrapper<User>().eq("username", "jack");
//3.执行更新
userMapper.update(user, wrapper);
)
更新示例二:
更新id为1、2、4用户的余额,扣200余额.
上面是直接更新数据,在更新中,还有另一中是基于原来的数据进行加减乘除等运算.
SQL:
UPDATE user SET balance = balance – 200 WHERE id in (1, 2, 4)
Wrapper:
@Test
void testUpdateWrapper(){
//1、构造ids
List<long> ids = List.of(1L, 2L, 4L);
//2、更新条件
UpdateWrapper<User> wrapper = new UpdateWrapper<User>()
.setSql("balance = balance – 200")
.in("id", ids);
//3、执行更新
userMapper.update(null,wrapper);
}
目前大多会选择使用 AbstractLambdaWrapper 的子类,避免硬性编码,同时方便迁移数据库而不会使用出现问题.
使用示例(查询为例,问题依旧采用上述):
问题:
查询一个名字带O的,存款大于等于1000元的人的id、username、info、balance.
LambdaWrapper:
@Test
void LambdaQueryWrapper(){
//1.构建查询条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>()
.select(User::getId, User::getUsername, User::getInfo, User::getBalance)
.like(User::getUsername, "o")
.ge(User::getBalance, "1000");
//2.查询
userMapper.selectList(wrapper);
}
综上所述:
1、尽量使用AbstrctLambdaWrapper下面的子类,避免硬性编码.
2、关于UpdateWrapper和LambdaUpdateWrapper常常只在SET语句特殊的时候才会采用
3、大部分都是使用QueryWrapper和LambdaQueryWrapper进行select、delete、update的where条件部分.
三、自定义SQL
MyBatis-Plus 提供了强大的 Wrapper 条件构造器,允许开发者自定义 SQL 语句,以满足更复杂的数据库查询需求,简单来讲我们可以使用Wrapper来构造复杂的Where条件,然后自己在定义SQL的剩下语句.
使用原因:
既满足不在业务层进行SQL语句的编写,遵守企业规范。又将Mybatis—Plus的Wrappe类生成SQL语句的便捷性.
使用步骤:
1、基于Wrapper构建Where条件.
2、在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew(固定写法).
3、自定义SQL语句,并使用Wrapper条件.
示例:
将id在指定范围的用户(例:1、2、4)的余额扣减指定值.
SQL:
<update id="updateBalanceByIds">
UPDATE user
SET balance = balance – #{amount}
WHERE id IN
<foreach collection="ids" separator="," item="id" open="("close=")">
#{id}
</foreach>
</update>
Wrapper + 自定义SQL:
1、基于Wrapper构建Where条件
List<Long> ids = List.of(1L, 2L, 4L);
int amount = 200;
//1、构建条件
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>().in(User::getIds, ids);
//2、自定义SQL方法调用
userMapper.updateBalanceByIds(wrapper, amount);
2、在mapper方法参数中用Param注解声明wrapper变量名称,必须是ew(固定写法)
void updateBalanceByIds(@Param("ew") LambdaQueryWrapper<User> wrapper, @Param("amount") int amount);
3、自定义SQL语句,并使用Wrapper条件
<update id="updateBalanceByIds">
UPDATE user SET balance = balance – #{amount} ${ew.customSqlSegment}
</update>
网硕互联帮助中心


评论前必须登录!
注册