在进行查询的时候,我们的入口是在Wrapper这个类上,因为它是一个接口,所以我们需要去找它对 应的实现类,关于实现类也有很多,说明我们有多种构建查询条件对象的方式
1. 第一种:QueryWrapper
QueryWrapper qw = new QueryWrapper(); qw.lt("age",18); List<User> userList = userDao.selectList(qw); System.out.println(userList);
lt: 小于(<) ,最终的sql语句为
SELECT id,name,password,age,tel FROM user WHERE (age < ?)
更多的方法可以参考MyBatisPlus官网
条件构造器 | MyBatis-Plus (baomidou.com)
https://baomidou.com/pages/10c804/#abstractwrapper
这种方法有个小问题就是在写条件的时候,容易出错,比如age写错,就会导致查询不成功
2. 第二种:QueryWrapper的基础上使用lambda
QueryWrapper<User> qw = new QueryWrapper<User>(); qw.lambda().lt(User::getAge, 10);//添加条件 List<User> userList = userDao.selectList(qw); System.out.println(userList);
User::getAget,为lambda表达式中的,类名::方法名,最终的sql语句为
SELECT id,name,password,age,tel FROM user WHERE (age < ?)
注意: 构建 LambdaQueryWrapper 的时候泛型不能省
此时我们再次编写条件的时候,就不会存在写错名称的情况,但是qw后面多了一层lambda()调用
3. 第三种:LambdaQueryWrapper
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.lt(User::getAge, 10); List<User> userList = userDao.selectList(lqw); System.out.println(userList);
这种方式就解决了上一种方式所存在的问题。
多条件构建
需求:查询数据库表中,年龄在10岁到30岁之间的用户信息
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.lt(User::getAge, 30); lqw.gt(User::getAge, 10); List<User> userList = userDao.selectList(lqw); System.out.println(userList);
gt:大于(>),最终的SQL语句为
SELECT id,name,password,age,tel FROM user WHERE (age < ? AND age > ?)
构建多条件的时候,可以支持链式编程
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.lt(User::getAge, 30).gt(User::getAge, 10); List<User> userList = userDao.selectList(lqw); System.out.println(userList);
需求:查询数据库表中,年龄小于10或年龄大于30的数据
LambdaQueryWrapper<User> lqw = new LambdaQueryWrapper<User>(); lqw.lt(User::getAge, 10).or().gt(User::getAge, 30); List<User> userList = userDao.selectList(lqw); System.out.println(userList);
or()就相当于我们sql语句中的or关键字,不加默认是and,最终的sql语句为:
SELECT id,name,password,age,tel FROM user WHERE (age < ? OR age > ?)