码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 微服务项目:尚融宝(6)(上手复习mybatisplus)


    认清现实,放弃幻想,准备斗争

    一、wapper介绍 

    1、Wrapper家族

    在MP中我们可以使用通用Mapper(BaseMapper)实现基本查询,也可以使用自定义Mapper(自定义XML)来实现更高级的查询。当然你也可以结合条件构造器来方便的实现更多的高级查询。

     

    Wrapper : 条件构造抽象类,最顶端父类  

        AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件

            QueryWrapper : 查询条件封装

            UpdateWrapper : Update 条件封装

        AbstractLambdaWrapper : 使用Lambda 语法

            LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper

            LambdaUpdateWrapper : Lambda 更新封装Wrapper

    2、创建测试类

    1. @SpringBootTest
    2. public class WrapperTests {
    3. @Resource
    4. private UserMapper userMapper;
    5. }

    二、QueryWrapper

    1、例1:组装查询条件

    查询名字中包含n,年龄大于等于10且小于等于20,email不为空的用户

    1. @Test
    2. public void test1() {
    3. QueryWrapper queryWrapper = new QueryWrapper<>();
    4. queryWrapper
    5. .like("name","n")
    6. .between("age", 10, 20)
    7. .isNotNull("email");
    8. List users = userMapper.selectList(queryWrapper);
    9. users.forEach(System.out::println);
    10. }

    2、例2:组装排序条件

    按年龄降序查询用户,如果年龄相同则按id升序排列

    1. @Test
    2. public void test3() {
    3. QueryWrapper queryWrapper = new QueryWrapper<>();
    4. queryWrapper.isNull("email");
    5. int result = userMapper.delete(queryWrapper); //条件构造器也可以构建删除语句的条件
    6. System.out.println("delete return count = " + result);
    7. }

    3、例3:组装删除条件

    删除email为空的用户

    1. @Test
    2. public void test3() {
    3. QueryWrapper queryWrapper = new QueryWrapper<>();
    4. queryWrapper.isNull("email");
    5. int result = userMapper.delete(queryWrapper); //条件构造器也可以构建删除语句的条件
    6. System.out.println("delete return count = " + result);
    7. }

    4、例4:条件的优先级

    查询名字中包含n,且(年龄小于18或email为空的用户),并将这些用户的年龄设置为18,邮箱设置为 user@atguigu.com

    1. @Test
    2. public void test4() {
    3. //修改条件
    4. QueryWrapper queryWrapper = new QueryWrapper<>();
    5. queryWrapper
    6. .like("name", "n")
    7. .and(i -> i.lt("age", 18).or().isNull("email")); //lambda表达式内的逻辑优先运算
    8. User user = new User();
    9. user.setAge(18);
    10. user.setEmail("user@atguigu.com");
    11. int result = userMapper.update(user, queryWrapper);
    12. System.out.println(result);
    13. }

    5、例5:组装select子句

    查询所有用户的用户名和年龄

    1. @Test
    2. public void test5() {
    3. QueryWrapper queryWrapper = new QueryWrapper<>();
    4. queryWrapper.select("name", "age");
    5. //selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值为null
    6. List> maps = userMapper.selectMaps(queryWrapper);//返回值是Map列表
    7. maps.forEach(System.out::println);
    8. }

    6、例6:实现子查询

    查询id不大于3的所有用户的id列表
    1. @Test
    2. public void test6() {
    3. QueryWrapper queryWrapper = new QueryWrapper<>();
    4. queryWrapper.inSql("id", "select id from user where id <= 3");
    5. //selectObjs的使用场景:只返回一列
    6. List objects = userMapper.selectObjs(queryWrapper);//返回值是Object列表
    7. objects.forEach(System.out::println);
    8. }
    9. 但上面的方式容易引发sql注入

      1. queryWrapper.inSql("id", "select id from user where id <= 3 or true");
      2. // 或插叙出所有用户id
      1. queryWrapper.in("id", 1, 2, 3 );
      2. // 或
      3. queryWrapper.le("id", 3 );

      三、UpdateWrapper

      例7:需求同例4

      查询名字中包含n,且(年龄小于18或email为空的用户),并将这些用户的年龄设置为18,邮箱设置为 user@atguigu.com

      1. @Test
      2. public void test7() {
      3. //组装set子句
      4. UpdateWrapper updateWrapper = new UpdateWrapper<>();
      5. updateWrapper
      6. .set("age", 18)
      7. .set("email", "user@atguigu.com")
      8. .like("name", "n")
      9. .and(i -> i.lt("age", 18).or().isNull("email")); //lambda表达式内的逻辑优先运算
      10. //这里必须要创建User对象,否则无法应用自动填充。如果没有自动填充,可以设置为null
      11. User user = new User();
      12. int result = userMapper.update(user, updateWrapper);
      13. System.out.println(result);
      14. }

      四、condition

      例8:动态组装查询条件

      查询名字中包含n,年龄大于10且小于20的用户,查询条件来源于用户输入,是可选的

      1. @Test
      2. public void test8() {
      3. //定义查询条件,有可能为null(用户未输入)
      4. String name = null;
      5. Integer ageBegin = 10;
      6. Integer ageEnd = 20;
      7. QueryWrapper queryWrapper = new QueryWrapper<>();
      8. if(StringUtils.isNotBlank(name)){
      9. queryWrapper.like("name","n");
      10. }
      11. if(ageBegin != null){
      12. queryWrapper.ge("age", ageBegin);
      13. }
      14. if(ageEnd != null){
      15. queryWrapper.le("age", ageEnd);
      16. }
      17. List users = userMapper.selectList(queryWrapper);
      18. users.forEach(System.out::println);
      19. }

      五、LambdaXxxWrapper

      1、例9:Query - 需求同例8

      1. @Test
      2. public void test9() {
      3. //定义查询条件,有可能为null(用户未输入)
      4. String name = null;
      5. Integer ageBegin = 10;
      6. Integer ageEnd = 20;
      7. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
      8. queryWrapper
      9. //避免使用字符串表示字段,防止运行时错误
      10. .like(StringUtils.isNotBlank(name), User::getName, "n")
      11. .ge(ageBegin != null, User::getAge, ageBegin)
      12. .le(ageEnd != null, User::getAge, ageEnd);
      13. List users = userMapper.selectList(queryWrapper);
      14. users.forEach(System.out::println);
      15. }

    10. 相关阅读:
      MySQL开发规范小节
      Netty入门——概述
      线性代数学习笔记6-1:行列式与线性变换
      【Python百日进阶-数据分析】Day117 - Plotly 是免费的吗?
      LIO-SAM 详读代码笔记 -- 4.featureExtraction
      基于awk实现的表格检查框架
      抖音新接口——关键词月搜查询 API
      Kafka3.0.0版本——文件清理策略
      【Spring】bean的实例化
      跨qml通信
    11. 原文地址:https://blog.csdn.net/m0_62436868/article/details/126595873
      • 最新文章
      • 攻防演习之三天拿下官网站群
        数据安全治理学习——前期安全规划和安全管理体系建设
        企业安全 | 企业内一次钓鱼演练准备过程
        内网渗透测试 | Kerberos协议及其部分攻击手法
        0day的产生 | 不懂代码的"代码审计"
        安装scrcpy-client模块av模块异常,环境问题解决方案
        leetcode hot100【LeetCode 279. 完全平方数】java实现
        OpenWrt下安装Mosquitto
        AnatoMask论文汇总
        【AI日记】24.11.01 LangChain、openai api和github copilot
      • 热门文章
      • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
        奉劝各位学弟学妹们,该打造你的技术影响力了!
        五年了,我在 CSDN 的两个一百万。
        Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
        面试官都震惊,你这网络基础可以啊!
        你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
        心情不好的时候,用 Python 画棵樱花树送给自己吧
        通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
        13 万字 C 语言从入门到精通保姆级教程2021 年版
        10行代码集2000张美女图,Python爬虫120例,再上征途
      Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
      正则表达式工具 cron表达式工具 密码生成工具

      京公网安备 11010502049817号