云计算百科
云计算领域专业知识百科平台

二、Mybatis—Plus 核心功能之条件构造器

摘要:

        主要介绍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>

赞(0)
未经允许不得转载:网硕互联帮助中心 » 二、Mybatis—Plus 核心功能之条件构造器
分享到: 更多 (0)

评论 抢沙发

评论前必须登录!