当前位置:   article > 正文

Java - LambdaQueryWrapper 的常用方法

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<LandLossAllowance> page1 = new Page<LandLossAllowance>(参数1,参数2);
  3. LambdaQueryWrapper<LandLossAllowance> queryWrapper = new LambdaQueryWrapper<>();
  4. 条件 eq 指的是相等
  5. queryWrapper.eq(LandLossAllowance::getCountrySide,landLossAllowanceOption.getCountrySide());
  6. 执行page方法 page(参数1,参数2)
  7. 参数1:上面的new的分页对象,参数2是lambda表达式查询条件
  8. IPage<LandLossAllowance> 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<User> 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<String> 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<User> queryWrapper = new QueryWrapper<>();
  5.     // 封装条件
  6.     Map<String, Object> hashMap = new HashMap<>();
  7.     hashMap.put("name", "张三");
  8.     hashMap.put("age", 20);
  9.  
  10.     queryWrapper.allEq(hashMap);
  11.  
  12.     List<User> userList = userMapper.selectList(queryWrapper);
  13.     userList.forEach(user -> {
  14.         System.out.println(user);
  15.     });
  16. }

eq

  1. eq("列名", 值) -> 列名 = 值
  2.     public List<Dict> listByDictCode(DictCode dictCode) {
  3.         LambdaQueryWrapper<Dict> 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<Dict> listByDictCode(DictCode dictCode) {
  3.         LambdaQueryWrapper<Dict> 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<User> userList() {
  3.         LambdaQueryWrapper<User> 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<User> userList() {
  3.         LambdaQueryWrapper<User> 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<User> userList() {
  3.         LambdaQueryWrapper<User> 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<User> userList() {
  3.         LambdaQueryWrapper<User> 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<User> userList() {
  4.         LambdaQueryWrapper<User> 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<User> userList() {
  4.         LambdaQueryWrapper<User> wrapper = Wrappers.lambdaQuery();
  5.          wrapper.like(User::getName, "张");           
  6.         return this.baseMapper.selectList(wrapper);
  7.     }

likeLeft

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

likeRight

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

isNull 空值查询

  1. isNotNull 非空值查询
  2.     public List<User> userList() {
  3.         LambdaQueryWrapper<User> 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<User> userList() {
  5.         LambdaQueryWrapper<User> 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<User> userList() {
  2.     LambdaQueryWrapper<User> 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<User> userList() {
  2.     LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
  3.     wrapper.groupBy(User::getName);
  4.     return this.baseMapper.selectList(wrapper);
  5. }

orderBy、orderByAsc、orderByDesc

  1. public List<User> userList() {
  2.     LambdaQueryWrapper<User> 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<User> userList() {
  2.         LambdaQueryWrapper<User> 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<User> userList() {
  2.     LambdaQueryWrapper<User> 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<User> userList() {
  2.  
  3.     LambdaQueryWrapper<User> 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<User> userList() {
  2.     LambdaQueryWrapper<User> 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<User> userList() {
  2.     LambdaQueryWrapper<User> 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. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/282263
推荐阅读
相关标签
  

闽ICP备14008679号