mybatis_plus条件构造器
mybatis_plus条件构造器
- Wrapper : 条件构造抽象类,最顶端父类
- AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
- QueryWrapper : 查询条件封装
- UpdateWrapper : Update 条件封装
- AbstractLambdaWrapper : 使用Lambda 语法
- LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
- LambdaUpdateWrapper : Lambda 更新封装Wrapper
- AbstractWrapper : 用于查询条件封装,生成 sql 的 where 条件
常用条件构造器
eq
eq(R column, Object val)
eq(boolean condition, R column, Object val)
等于 = 例: eq("name", "老王")--->name = '老王'
ne
ne(R column, Object val)
ne(boolean condition, R column, Object val)
不等于 <> 例: ne("name", "老王")--->name <> '老王'
gt
gt(R column, Object val)
gt(boolean condition, R column, Object val)
大于 > 例: gt("age", 18)--->age > 18
ge
ge(R column, Object val)
ge(boolean condition, R column, Object val)
大于等于 >= 例: ge("age", 18)--->age >= 18
lt
lt(R column, Object val)
lt(boolean condition, R column, Object val)
小于 < 例: lt("age", 18)--->age < 18
le
le(R column, Object val)
le(boolean condition, R column, Object val)
小于等于 <= 例: le("age", 18)--->age <= 18
between
between(R column, Object val1, Object val2)
between(boolean condition, R column, Object val1, Object val2)
BETWEEN 值1 AND 值2 例: between("age", 18, 30)--->age between 18 and 30
like
like(R column, Object val)
like(boolean condition, R column, Object val)
LIKE '%值%' 例: like("name", "王")--->name like '%王%'
notLike
notLike(R column, Object val)
notLike(boolean condition, R column, Object val)
NOT LIKE '%值%' 例: notLike("name", "王")--->name not like '%王%' 例: notInSql("id", "select id from table where id < 3")--->id not in (select id from table where id < 3)
group by
groupBy(R... columns)
groupBy(boolean condition, R... columns)
分组:GROUP BY 字段, ... 例: groupBy("id", "name")--->group by id,name
orderByAsc
orderByAsc(R... columns)
orderByAsc(boolean condition, R... columns)
排序:ORDER BY 字段, ... ASC 例: orderByAsc("id", "name")--->order by id ASC,name ASC
orderByDesc
orderByDesc(R... columns)
orderByDesc(boolean condition, R... columns)
排序:ORDER BY 字段, ... DESC 例: orderByDesc("id", "name")--->order by id DESC,name DESC
orderBy
orderBy(boolean condition, boolean isAsc, R... columns)
排序:ORDER BY 字段, ... 例: orderBy(true, true, "id", "name")--->order by id ASC,name ASC
or
or()
or(boolean condition)
拼接 OR 注意事项:主动调用or表示紧接着下一个方法不是用and连接!(不调用or则默认为使用and连接) 例: eq("id",1).or().eq("name","老王")--->id = 1 or name = '老王'
QueryWrapper 查询条件封装
例1:组装查询条件
新建测试类MybatisPlusServiceTest中新增方法 test01
package com.imooc;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.imooc.mapper.UserMapper;
import com.imooc.pojo.User;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.util.List;
@SpringBootTest
public class MybatisPlusServiceTest {
@Autowired
private UserMapper userMapper;
@Test
public void test01(){
//查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
// SELECT id,name AS name,age,email,is_deleted FROM user WHERE is_deleted=0 AND (name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.like("name", "a") .between("age", 20, 30) .isNotNull("email");
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
}
运行测试方法,结果

例2:组装排序条件
在测试类MybatisPlusServiceTest中新增方法 test02
@Test
public void test02(){
//按年龄降序查询用户,如果年龄相同则按id升序排列
// SELECT id,name AS name,age,email,is_deleted FROM user WHERE is_deleted=0 ORDER BY age DESC,id ASC
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper .orderByDesc("age") .orderByAsc("id");
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
运行测试方法,结果

例3:组装删除条件
在测试类MybatisPlusServiceTest中新增方法 test03
@Test
public void test03(){
//删除email为空的用户
// DELETE FROM user WHERE (email IS NULL)
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.isNull("email");
//条件构造器也可以构建删除语句的条件
int result = userMapper.delete(queryWrapper);
System.out.println("受影响的行数:" + result);
}
运行测试方法,结果

例4:条件的优先级
方式一:在测试类MybatisPlusServiceTest中新增方法 test04
@Test
public void test04() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
// UPDATE user SET age=?, email=? WHERE (name LIKE ? AND age > ? OR email IS NULL)
queryWrapper
.like("name", "a")
.gt("age", 20)
.or()
.isNull("email");
User user = new User();
user.setAge(18);
user.setEmail("user@atguigu.com");
int result = userMapper.update(user, queryWrapper);
System.out.println("受影响的行数:" + result);
}
方式二:在测试类MybatisPlusServiceTest中新增方法 test04
@Test
public void test04() {
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
// UPDATE user SET age=?, email=? WHERE (name LIKE ? AND (age > ? OR email IS NULL))
// lambda表达式内的逻辑优先运算 queryWrapper
queryWrapper
.like("name", "a")
.and(i -> i.gt("age", 20).or().isNull("email"));
User user = new User();
user.setAge(18);
user.setEmail("user@atguigu.com");
int result = userMapper.update(user, queryWrapper);
System.out.println("受影响的行数:" + result);
}
运行测试方法,结果

例5:组装select子句
在测试类MybatisPlusServiceTest中新增方法 test05
@Test
public void test05() {
//查询用户信息的name和age字段
// SELECT name,age FROM user
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.select("name", "age");
//selectMaps()返回Map集合列表,通常配合select()使用,避免User对象中没有被查询到的列值 为null
List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);
maps.forEach(System.out::println);
}
运行测试方法,结果

例6:实现子查询
在测试类MybatisPlusServiceTest中新增方法 test06
@Test
public void test06() {
//查询id小于等于3的用户信息
// SELECT id,name AS name,age,email,is_deleted FROM user WHERE (id IN (select id from user where id <= 3))
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.inSql("id", "select id from user where id <= 3");
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
}
运行测试方法,结果

UpdateWrapper Update 条件封装
在测试类MybatisPlusServiceTest中新增方法 test07
@Test
public void test07() {
//将(年龄大于20或邮箱为null)并且用户名中包含有a的用户信息修改
// 组装set子句以及修改条件
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
// lambda表达式内的逻辑优先运算
updateWrapper
.set("age", 18)
.set("email", "12343545@atguigu.com")
.like("name", "a")
.and(i -> i.gt("age", 20).or().isNull("email"));
//这里必须要创建User对象,否则无法应用自动填充。如果没有自动填充,可以设置为null
// UPDATE user SET user=?, age=?,email=? WHERE (user LIKE ? AND (age > ? OR email IS NULL))
// User user = new User();
// user.setName("张三");
//int result = userMapper.update(user, updateWrapper);
// UPDATE user SET age=?,email=? WHERE (user LIKE ? AND (age > ? OR email IS NULL))
int result = userMapper.update(null, updateWrapper);
System.out.println(result);
}
运行测试方法,结果

condition
在真正开发的过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因 此我们在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若 没有选择则一定不能组装,以免影响SQL执行的结果
思路一:
在测试类MybatisPlusServiceTest中新增方法 test08
@Test
public void test08() {
//定义查询条件,有可能为null(用户未输入或未选择)
String name = null;
Integer ageBegin = 10;
Integer ageEnd = 24;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//StringUtils.isNotBlank()判断某字符串是否不为空且长度不为0且不由空白符(whitespace) 构成
if(StringUtils.isNotBlank(name)){
queryWrapper.like("username","a");
}
if(ageBegin != null){
queryWrapper.ge("age", ageBegin);
}
if(ageEnd != null){
queryWrapper.le("age", ageEnd);
}
//SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (age >= ? AND age <= ?)
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
运行测试方法,结果

思路二:
上面的实现方案没有问题,但是代码比较复杂,我们可以使用带condition参数的重载方法构建查 询条件,简化代码的编写
在测试类MybatisPlusServiceTest中新增方法 test08UseCondition
@Test
public void test08UseCondition() {
//定义查询条件,有可能为null(用户未输入或未选择)
String name = null;
Integer ageBegin = 10;
Integer ageEnd = 24;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
//StringUtils.isNotBlank()判断某字符串是否不为空且长度不为0且不由空白符(whitespace) 构成
queryWrapper
.like(StringUtils.isNotBlank(name), "username", "a")
.ge(ageBegin != null, "age", ageBegin)
.le(ageEnd != null, "age", ageEnd);
//SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (age >= ? AND age <= ?)
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
运行测试方法,结果

链式调用 lambda 式
获取 LambdaWrapper -在QueryWrapper中是获取LambdaQueryWrapper -在UpdateWrapper中是获取LambdaUpdateWrapper 代码演示如下,改成链式写法:
public List getUsersByIdAndDate(Integer userId,Integer age){
//lambda条件构造器
LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>();
//传入条件
queryWrapper.eq(UserEntity::getId,userId);
queryWrapper.eq(UserEntity::getAge,age);
//调用修改方法
return this.list(queryWrapper);
}
说白了,lambda式玩法也一样,唯独就是你要先入门一下java8新特性之lambda表达式语法
LambdaQueryWrapper 用于Lambda语法使用的查询Wrapper
在测试类MybatisPlusServiceTest中新增方法 test09
@Test
public void test09() {
//定义查询条件,有可能为null(用户未输入)
String name = "a";
Integer ageBegin = 10;
Integer ageEnd = 24;
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
//避免使用字符串表示字段,防止运行时错误
queryWrapper
.like(StringUtils.isNotBlank(name), User::getName, name)
.ge(ageBegin != null, User::getAge, ageBegin)
.le(ageEnd != null, User::getAge, ageEnd);
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
}
运行测试方法,结果

LambdaUpdateWrapper Lambda 更新封装Wrapper
在测试类MybatisPlusServiceTest中新增方法 test10
@Test
public void test10() {
//组装set子句
LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
updateWrapper
.set(User::getAge, 18)
.set(User::getEmail, "bbbbbbbbbb@atguigu.com")
.like(User::getName, "a")
.and(i -> i.lt(User::getAge, 24).or().isNull(User::getEmail));
//lambda 表达式内的逻辑优先运算
User user = new User();
int result = userMapper.update(user, updateWrapper);
System.out.println("受影响的行数:" + result);
}
运行测试方法,结果
