找回密码
 立即注册
查看: 38|回复: 0

SpringCloud微服务开发与实战之条件构造器

[复制链接]

95

主题

5

精华

99

金币

技术维护QQ:515138

积分
219
发表于 7 天前 | 显示全部楼层 |阅读模式
SpringCloud微服务开发与实战之条件构造器

MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。

在 MyBatis-Plus 中,Wrapper 类是构建查询和更新条件的核心工具。以下是主要的 Wrapper 类及其功能:
  • AbstractWrapper:这是一个抽象基类,提供了所有 Wrapper 类共有的方法和属性。它定义了条件构造的基本逻辑,包括字段(column)、值(value)、操作符(condition)等。所有的 QueryWrapper、UpdateWrapper、LambdaQueryWrapper 和 LambdaUpdateWrapper 都继承自 AbstractWrapper。
  • QueryWrapper:专门用于构造查询条件,支持基本的等于、不等于、大于、小于等各种常见操作。它允许你以链式调用的方式添加多个查询条件,并且可以组合使用 and 和 or 逻辑。
  • UpdateWrapper:用于构造更新条件,可以在更新数据时指定条件。与 QueryWrapper 类似,它也支持链式调用和逻辑组合。使用 UpdateWrapper 可以在不创建实体对象的情况下,直接设置更新字段和条件。
  • LambdaQueryWrapper:这是一个基于 Lambda 表达式的查询条件构造器,它通过 Lambda 表达式来引用实体类的属性,从而避免了硬编码字段名。这种方式提高了代码的可读性和可维护性,尤其是在字段名可能发生变化的情况下。
  • LambdaUpdateWrapper:类似于 LambdaQueryWrapper,LambdaUpdateWrapper 是基于 Lambda 表达式的更新条件构造器。它允许你使用 Lambda 表达式来指定更新字段和条件,同样避免了硬编码字段名的问题。

1.jpg


案例剖析:
1.jpg
代码如下:
  1. package com.zidiu.mp;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.zidiu.mp.domain.po.User;
  4. import com.zidiu.mp.mapper.UserMapper;
  5. import lombok.extern.slf4j.Slf4j;
  6. import org.junit.jupiter.api.Test;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.boot.test.context.SpringBootTest;
  9. import java.util.List;
  10. @Slf4j
  11. @SpringBootTest
  12. public class UserMapperTests {
  13.     @Autowired
  14.     private UserMapper userMapper;
  15.     @Test
  16.     public void testQueryWrapper() {
  17.         // 1,构建查询条件
  18.         QueryWrapper<User> wrapper = new QueryWrapper<User>()
  19.                 .select("id", "username", "info","balance")
  20.                 .like("username", "o")
  21.                 .ge("balance", 500);
  22.         // 2,执行查询
  23.         List<User> users = userMapper.selectList(wrapper);
  24.         log.info("users获取的用户信息为:{}", users);
  25. //        System.out.println(users);
  26.           users.forEach(System.out::println);
  27.     }
  28.     @Test
  29.     public void testUpdateByWrapper() {
  30.         // 1,创建一个User对象
  31.         User user = new User();
  32.         user.setBalance(2000);
  33.         // 2,更新条件
  34.         QueryWrapper<User> wrapper = new QueryWrapper<User>()
  35.                 .eq("username", "Jack");
  36.         // 3,执行更新
  37.         userMapper.update(user,wrapper);
  38.     }
  39. }
复制代码
案例二剖析:
1.jpg
  1. package com.zidiu.mp;
  2. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  3. import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
  4. import com.zidiu.mp.domain.po.User;
  5. import com.zidiu.mp.mapper.UserMapper;
  6. import lombok.extern.slf4j.Slf4j;
  7. import org.junit.jupiter.api.Test;
  8. import org.springframework.beans.factory.annotation.Autowired;
  9. import org.springframework.boot.test.context.SpringBootTest;
  10. import java.util.List;
  11. @Slf4j
  12. @SpringBootTest
  13. public class UserMapperTests {
  14.     @Autowired
  15.     private UserMapper userMapper;
  16.     @Test
  17.     public void testQueryWrapper() {
  18.         // 1,构建查询条件
  19.         QueryWrapper<User> wrapper = new QueryWrapper<User>()
  20.                 .select("id", "username", "info","balance")
  21.                 .like("username", "o")
  22.                 .ge("balance", 500);
  23.         // 2,执行查询
  24.         List<User> users = userMapper.selectList(wrapper);
  25.         log.info("users获取的用户信息为:{}", users);
  26. //        System.out.println(users);
  27.           users.forEach(System.out::println);
  28.     }
  29.     @Test
  30.     public void testUpdateByWrapper() {
  31.         // 1,创建一个User对象
  32.         User user = new User();
  33.         user.setBalance(2000);
  34.         // 2,更新条件
  35.         QueryWrapper<User> wrapper = new QueryWrapper<User>()
  36.                 .eq("username", "Jack");
  37.         // 3,执行更新
  38.         userMapper.update(user,wrapper);
  39.     }
  40.     @Test
  41.     void testUpdateWrapper(){
  42.         List<Long> ids = List.of(1L,2L,4L);
  43.         UpdateWrapper<User> userUpdateWrapper = new UpdateWrapper<User>()
  44.                 .setSql("balance = balance - 50")
  45.                 .in("id", ids);
  46.         userMapper.update(null, userUpdateWrapper);
  47.     }
  48. }
复制代码
lambda来解决查询条件(解决硬编码问题)
  1.     @Test
  2.     public void testLambdaQueryWrapper() {
  3.         LambdaQueryWrapper<User> aa = new LambdaQueryWrapper<User>()
  4.                 .select(User::getId, User::getUsername, User::getInfo, User::getBalance)
  5.                 .like(User::getUsername, "o")
  6.                 .ge(User::getBalance, 500);
  7.         List<User> users = userMapper.selectList(aa);
  8.         log.info("users获取的用户信息:{}", users);
  9.         users.forEach(System.out::println);
  10.     }
复制代码
条件构造器的用法:
QueryWrapper和LambdaQueryWrapper通常用来构建select、delete、update的where条件部分
UpdateWrapper和LambdaUpdateWrapper通常只有在set语句比较特殊才使用
尽量使用LambdaQueryWrapper和LambdaUpdateWrapper,避免硬编码

mp-demo.zip (33.8 KB, 下载次数: 0, 售价: 50 金币)
SpringCloud微服务开发与实战


上一篇:SpringCloud微服务开发与实战之常见配置
下一篇:SpringCloud微服务开发与实战之自定义SQL
网站建设,公众号小程序开发,系统定制,软件App开发,技术维护【联系我们】手机/微信:17817817816 QQ:515138

QQ|Archiver|自丢网 ( 粤ICP备2024252464号-1 )

GMT+8, 2025-12-14 14:11

专注于网站建设,公众号小程序制作,商城小程序,系统定制,软件App开发

【联系我们】手机/微信:17817817816 QQ:515138

快速回复 返回顶部 返回列表