• Java - LambdaQueryWrapper 的常用方法


    1、查看项目中是否导入mybatisPlus的jar包

    2、servie 层和实现类要集成mybatisPlus

    service 继承IService<>

    在这里插入图片描述实现类中要继承IService的实现类ServiceImpl<mapper,实体类>

    在这里插入图片描述

    3、如果想要mapper中的一些方法,mapper 要继承BaseMapper<实体类>

    在这里插入图片描述

    4、在实现类中实现方法,不需要在xml中写一个方法了,常用的方法

    总结如下:

    【1】分页

    1. 参数1是分页起始位置,一般是1,参数2:结束位置, 一般都是前端传过来的,查询的数量
    2. Page page1 = new Page(参数1,参数2);
    3. LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
    4. 条件 eq 指的是相等
    5. queryWrapper.eq(LandLossAllowance::getCountrySide,landLossAllowanceOption.getCountrySide());
    6. 执行page方法 page(参数1,参数2)
    7. 参数1:上面的new的分页对象,参数2是lambda表达式查询条件
    8. IPage iPage = page(page1, queryWrapper);

    (一)PageHelper和IPage区别: 

    使用方法:

    PageHelper.startPage()然后后边写sql就可以。 紧接着的一个sql起作用。
    IPage则需要在dao层传入IPage的实现类Page对象,该对象实现了IPage。

    区别:

    PageHelper内部原理是将传入的页码和条数赋值给了Page对象,保存到了一个本地线程ThreadLoacl中,然后会进入Mybatis的拦截器中。
        然后再拦截器中获取本地线程中保存的分页的参数。最后再将这写分页参数和原本的sql以及内部定义好的sql进行拼接完成sql的分页处理。
        中间会进行判断该sql 的类型是查询还是修改操作。如果是查询才会进入分页的逻辑并判断封装好的Page对象是否是null,null则不分页,否则分页。

    IPage内部原理也是基于拦截器,但是这个拦截的是方法以及方法中的参数,这个也会判断是否是查询操作。如果是查询操作,才会进入分页的处理逻辑。
    进入分页逻辑处理后,拦截器会通过反射获取该方法的参数进行判断是否存在IPage对象的实现类。如果不存在则不进行分页,存在则将该参数赋值给IPage对象。
    然后进行拼接sql的处理完成分页操作。
    但是使用IPage需要注入一个bean拦截器交给spring进行管理。如下。否则不会进行拦截。

    使用Ipage之后,需要注入一些配置:

    1. @Configuration
    2. @MapperScan(value={"com.XX.**.mapper*"})
    3. public class MybatisPlusConfig {
    4. /**
    5. * 分页插件
    6. */
    7. @Bean
    8. public PaginationInterceptor paginationInterceptor() {
    9. // 设置sql的limit为无限制,默认是500
    10. return new PaginationInterceptor().setLimit(-1);
    11. }
    12. }

    (二)常用的lambda表达式的一些定义

    在这里插入图片描述

    com.baomidou.mybatisplus.core.conditions.query.QueryWrapper是MybatisPlus框架构造查询条件常用的对象

    使用lambda表达式写法更为清晰,简洁:

    1. QueryWrapper queryWrapper = new QueryWrapper<>();
    2.   queryWrapper.lambda().eq(User::getName,"aa");
    3.   queryWrapper.lambda().ge(User::getAge,20);

    默认情况下多个条件是and连接:上述写法对应的SQL为:where name like '%aa%' and age >= 20

    如果要使用or连接的话,方法如下:

    1. queryWrapper.lambda().and(wq->{
    2.     wq.like(User::getName,"aa");
    3.     wq.or().like(User::getName,"bb);
    4. });

    这里引申下我遇到的一个场景:需要or连接的是一个集合内的所有元素:

    1. List nameList = Lists.newArrayList("aa","bb","cc");
    2. String firstName = nameList.get(0);
    3. nameList.remove(0);
    4. queryWrapper.lambda().and(wq->{
    5.     wq.like(User::getName,firstName);
    6.     for(String name : nameList){
    7.         wq.or().like(User::getName,name);
    8.     }
    9. });

    allEq

    条件用 Map 进行封装

    1. “name” -> “张三”
    2. “age” -> 20
    3. public void testAllEq() {
    4.     QueryWrapper queryWrapper = new QueryWrapper<>();
    5.     // 封装条件
    6.     Map hashMap = new HashMap<>();
    7.     hashMap.put("name", "张三");
    8.     hashMap.put("age", 20);
    9.  
    10.     queryWrapper.allEq(hashMap);
    11.  
    12.     List userList = userMapper.selectList(queryWrapper);
    13.     userList.forEach(user -> {
    14.         System.out.println(user);
    15.     });
    16. }

    eq

    1. eq("列名", 值) -> 列名 = 值
    2.     public List listByDictCode(DictCode dictCode) {
    3.         LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
    4.         wrapper.eq(Dict::getDictCode, dictCode.getCode())
    5.                .eq(Dict::getEnabled, DictEnableEnum.VALID.getType());
    6.         return this.baseMapper.selectList(wrapper);
    7.     }

    ne

    1. ne("列名", 值) -> 列名 != 值
    2.     public List listByDictCode(DictCode dictCode) {
    3.         LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
    4.         wrapper.ne(Dict::getDictCode, dictCode.getCode())
    5.                .ne(Dict::getEnabled, DictEnableEnum.VALID.getType());
    6.         return this.baseMapper.selectList(wrapper);
    7.     }

    gt

    1. gt("age", 20) -> age > 20
    2.     public List userList() {
    3.         LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
    4.         wrapper.gt(User::getAge, 20);            
    5.         return this.baseMapper.selectList(wrapper);
    6.     }

    ge

    1. ge("age", 20) -> age >= 20
    2.     public List userList() {
    3.         LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
    4.         wrapper.ge(User::getAge, 20);            
    5.         return this.baseMapper.selectList(wrapper);
    6.     }

    lt

    1. lt("age", 20) -> age < 20
    2.     public List userList() {
    3.         LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
    4.         wrapper.lt(User::getAge, 20);            
    5.         return this.baseMapper.selectList(wrapper);
    6.     }

    le

    1. le("age", 21) -> age <= 21
    2.     public List userList() {
    3.         LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
    4.         wrapper.le(User::getAge, 20);            
    5.         return this.baseMapper.selectList(wrapper);
    6.     }

    between,notBetween

    1. between("age", 18, 25) -> age BETWEEN 18 AND 25 ,年龄在1825之间
    2. notBetween就是不在1825之间
    3.     public List userList() {
    4.         LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
    5.         wrapper.between(User::getAge, 18,25);                
    6.         return this.baseMapper.selectList(wrapper);
    7.     }

    like,notLike

    1. like 匹配值 -> "%值%" 模糊查询
    2. notLike 模糊查询不匹配"%值%"
    3.     public List userList() {
    4.         LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
    5.          wrapper.like(User::getName, "张");           
    6.         return this.baseMapper.selectList(wrapper);
    7.     }

    likeLeft

    1. likeLeft 匹配值 -> "%值"
    2.     public List userList() {
    3.         LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
    4.          wrapper.likeLeft(User::getName, "张");           
    5.         return this.baseMapper.selectList(wrapper);
    6.     }

    likeRight

    1. likeRight 匹配值 -> "值%"
    2.     public List userList() {
    3.         LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
    4.         wrapper.likeRight(User::getName, "张");           
    5.         return this.baseMapper.selectList(wrapper);
    6.     }

    isNull 空值查询

    1. isNotNull 非空值查询
    2.     public List userList() {
    3.         LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
    4.         wrapper.isNull(User::getName);
    5.         //wrapper.isNotNull(User::getName);              
    6.         return this.baseMapper.selectList(wrapper);
    7.     }

    in

    1. in("name", "张三", "李四") -> name in ("张三", "李四") 姓名是张三或李四的用户
    2. notIn
    3. notIn("name", "张三", "李四") -> name not in ("张三", "李四") 姓名不是张三或李四的用户
    4.     public List userList() {
    5.         LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
    6.         wrapper.in(User::getName, "张三","李四");
    7.         //wrapper.in(User::getName, "张三","李四");           
    8.         return this.baseMapper.selectList(wrapper);
    9.     }

    inSql、notInSql

    1. public List userList() {
    2.     LambdaQueryWrapper wrapper= new LambdaQueryWrapper<>();
    3.     // SELECT id,name,email,age FROM user WHERE (age IN (select age from user where id = 1))
    4.     wrapper.inSql(User::getAge, "select age from user where id = 1");
    5.     return this.baseMapper.selectList(wrapper);
    6. }

    groupBy分组

    1. public List userList() {
    2.     LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
    3.     wrapper.groupBy(User::getName);
    4.     return this.baseMapper.selectList(wrapper);
    5. }

    orderBy、orderByAsc、orderByDesc

    1. public List userList() {
    2.     LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
    3.     // SELECT id,name,email,age FROM user ORDER BY name ASC,age DESC
    4.     wrapper.orderBy(true, true, User::getName).orderBy(true, false, User::getAge);
    5.     
    6.     // SELECT id,name,email,age FROM user ORDER BY name ASC,age ASC
    7.     wrapper.orderByAsc(User::getName, User::getAge);
    8.  
    9.     // SELECT id,name,email,age FROM user ORDER BY name DESC,age DESC
    10.     wrapper.orderByDesc(User::getName, User::getAge);
    11.  
    12.     return this.baseMapper.selectList(wrapper);
    13. }

    or、and

    1. public List userList() {
    2.         LambdaQueryWrapper wrapper = Wrappers.lambdaQuery();
    3.  
    4.         // SELECT id,name,email,age FROM user WHERE (name = ? AND id = ?)
    5.         wrapper.eq(User::getName, "张三").and().eq(User::getId,1);
    6.  
    7.         // SELECT id,name,email,age FROM user WHERE (name = ? OR id = ?)       
    8.         wrapper.eq(User::getName, "张三").or().eq(User::getId,1);     
    9.         return this.baseMapper.selectList(wrapper);
    10.     }

    这里说明一下or和and的问题

    错误代码

    1. public List userList() {
    2.     LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
    3.     wrapper.eq(User::getId,1);
    4.     wrapper.like(User::getName,"张")
    5.            .or()
    6.            .like(User::getEmail,"163")
    7.            .or()
    8.            .like(User::getAge,1);
    9. }

    根据上面的写法写出的sql语句如下:

    1. WHERE id = '1' 
    2.     AND name LIKE '%张%'
    3.     OR email LIKE '%163%'
    4.     OR age LIKE '%1%'

    这样明显是不对的,根据mysql语句执行顺序or最后执行 ,这会导致一旦[name like '%张%']条件成立后面的or条件就会失效,所以第一个条件 并没有起到and的作用。

    解决方法

    1. public List userList() {
    2.  
    3.     LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
    4.     wrapper.eq(User::getId,1);
    5.     wrapper.and(wrapper->wrapper.like(User::getName,"张")
    6.                                 .or()
    7.                                 .like(User::getEmail,"163")
    8.                                 .or()
    9.                                 .like(User::getAge,1)
    10.                );
    11. }

    这样得到的sql语句如下

    1. WHERE id = '1' 
    2.     AND (name LIKE '%张%'
    3.     OR email LIKE '%163%'
    4.     OR age LIKE '%1%')

    这样就解决了,这个问题在我的公司中新人(包括我在内)貌似都遇到这个问题,在此说明一下

    last

    在末尾拼接sql语句

    注:last()有sql注入的风险,请谨慎使用!

    1. public List userList() {
    2.     LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
    3.     // SELECT id,name,email,age FROM user WHERE (name = ? OR age = ?) limit 1
    4.     wrapper.eq(User::getName, "张三").or().eq(User::getAge, 20).last("limit 1");
    5.     return this.baseMapper.selectList(wrapper);
    6. }

    exists、notExists

    1. public List userList() {
    2.     LambdaQueryWrapper wrapper = new LambdaQueryWrapper<>();
    3.  
    4.     // SELECT id,name,email,age FROM user WHERE (EXISTS (select name from user where age > ?))
    5.     wrapper.exists("select name from user where age > 21");
    6.  
    7.     // SELECT id,name,email,age FROM user WHERE (NOT EXISTS (select name from user where age > ?))
    8.     wrapper.notExists("select name from user where age > 21");
    9.  
    10.     return this.baseMapper.selectList(wrapper);
    11. }
  • 相关阅读:
    Elasticsearch 和 LangChain 合作开发可用于生产的 RAG 模板
    库存管理方法有哪些?有哪些库存管理软件比较好用?
    Java开发学习---Bean基础配置及其作用范围
    【Java】想进大厂?你应该知道的算法经典习题(链表)
    c++中的类和结构
    java中使用jacob实现word转pdf文件下载
    Unsafe类的使用
    说透缓存一致性与内存屏障
    SpringBoot:yaml配置及语法、yml数据读取、多环境开发控制
    AB实验遇到用户不均匀怎么办?—— vivo游戏中心业务实践经验分享
  • 原文地址:https://blog.csdn.net/MinggeQingchun/article/details/131034200