MyBatis-Plus02_条件构造器QueryWrapperUpdateWrapperconditionLambdaQuery
Posted 所得皆惊喜
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyBatis-Plus02_条件构造器QueryWrapperUpdateWrapperconditionLambdaQuery相关的知识,希望对你有一定的参考价值。
文章目录
- ①. 条件构造器和常用接口
- ②. 条件构造器 - QueryWrapper
- ③. 条件构造器 - UpdateWrapper
- ④. 简化代码开发 - condition
- ⑤. LambdaQuery、updateWrapper
①. 条件构造器和常用接口
- ①. wapper介绍
- Wrapper : 条件构造抽象类,最顶端父类
- AbstractWrapper : 用于查询条件封装,生成sql的where条件
QueryWrapper : 查询条件封装
UpdateWrapper : Update 条件封装
AbstractLambdaWrapper : 使用Lambda语法 - LambdaQueryWrapper :用于Lambda语法使用的查询Wrapper
LambdaUpdateWrapper : Lambda 更新封装Wrapper
- ②. 表格为条件构造器使用中的各个方法格式和说明
②. 条件构造器 - QueryWrapper
- ①. 组装查询条件
查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
@Test
public void test1()
//查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
QueryWrapper<User> wrapper=new QueryWrapper<User>();
wrapper
.like("name","a")
.between("age",20,30)
.isNotNull("email");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::print);
- ②. 组装排序条件
按年龄降序查询用户,如果年龄相同则按id升序排列
@Test
public void test02()
//按年龄降序查询用户,如果年龄相同则按id升序排列
QueryWrapper<User> wrapper=new QueryWrapper<User>();
wrapper.orderByDesc("age").orderByAsc("id");
List<User> users = userMapper.selectList(wrapper);
users.forEach(System.out::print);
- ③. 组装删除条件
删除email为空的用户
@Test
public void test3()
//删除email为空的用户
// DELETE FROM t_user WHERE (email IS NULL)
QueryWrapper<User>wrapper=new QueryWrapper<>();
wrapper.isNull("email");
int result = userMapper.delete(wrapper);
System.out.println(result);
- ④. 条件的优先级
将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
@Test
public void test4()
//将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
// UPDATE t_user SET age=?, email=? WHERE (username LIKE ? AND age > ? OR email IS NULL)
QueryWrapper<User>wrapper=new QueryWrapper<>();
wrapper
.like("name","a")
.gt("age",20)
.or()
.isNull("email");
User user=new User();
user.setEmail("845195485@qq.com");
user.setAge(27);
int result = userMapper.update(user, wrapper);
System.out.println("result = " + result);
@Test
public void test5()
//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
//UPDATE t_user SET age=?, email=? WHERE (username LIKE ? AND (age > ? OR email IS NULL))
// lambda表达式内的逻辑优先运算
QueryWrapper<User>wrapper=new QueryWrapper<>();
wrapper
.like("name","a")
.and((user)->user.gt("age",20).or().isNull("email"));
User user=new User();
user.setEmail("128287979@qq.com");
user.setAge(26);
int result = userMapper.update(user, wrapper);
System.out.println("result = " + result);
- ⑤. 组装select子句
查询指定的字段
@Test
public void test6()
//查询用户信息的username和age字段
//SELECT username,age FROM t_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);
- ⑥. 如何实现子查询
@Test
public void test06()
//这里只是演示,知道子查询应该如何写,实际这个SQL没有任何的意义
//查询id小于等于3的用户信息
// SELECT id,username AS name,age,email,is_deleted FROM t_user WHERE (id IN (select id from t_user where id <= 3))
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.inSql("id", "select id from t_user where id <= 3");
List<User> list = userMapper.selectList(queryWrapper);
list.forEach(System.out::println);
③. 条件构造器 - UpdateWrapper
@Test
public void test8()
//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
//UPDATE t_user SET name=? WHERE is_delete=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
UpdateWrapper<User>updateWrapper=new UpdateWrapper<>();
updateWrapper
.like("name","a")
.and(item->item.gt("age",20).or().isNull("email"));
updateWrapper.set("name","TANG_updataWrapper");
int result = userMapper.update(null, updateWrapper);
System.out.println("result = " + result);
④. 简化代码开发 - condition
- ①. 在真正开发的过程中,组装条件是常见的功能,而这些条件数据来源于用户输入,是可选的,因此我们在组装这些条件时,必须先判断用户是否选择了这些条件,若选择则需要组装该条件,若没有选择则一定不能组装,以免影响SQL执行的结果
@Test
public void test9()
//定义查询条件,有可能为null(用户未输入或未选择)
String username = null;
Integer ageBegin = 10;
Integer ageEnd = 24;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
if (StringUtils.isNotBlank(username))
//StringUtils.isNotBlank()判断某字符串是否不为空且长度不为0且不由空白符(whitespace) 构成
queryWrapper.like("name",username);
if(ageBegin!=null)
queryWrapper.ge("age", ageBegin);
if(ageBegin!=null)
queryWrapper.lt("age",ageEnd);
userMapper.selectList(queryWrapper).forEach(System.out::print);
- ②. 上面的实现方案没有问题,但是代码比较复杂,我们可以使用带condition参数的重载方法构建查询条件,简化代码的编写
@Test
public void test10()
//定义查询条件,有可能为null(用户未输入或未选择)
String username = null;
Integer ageBegin = 10;
Integer ageEnd = 24;
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper
.like(StringUtils.isNotBlank(username),"name",username)
.ge(ageBegin!=null,"age",ageBegin)
.le(ageEnd!=null,"age",ageEnd);
userMapper.selectList(queryWrapper).forEach(System.out::print);
⑤. LambdaQuery、updateWrapper
- ①. 避免使用字符串表示字段,防止运行时错误
@Test public void test11()
//定义查询条件,有可能为null(用户未输入)
String username = "a";
Integer ageBegin = 10;
Integer ageEnd = 24;
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
//避免使用字符串表示字段,防止运行时错误
queryWrapper
.like(StringUtils.isNotBlank(username), User::getName, username)
.ge(ageBegin != null, User::getAge, ageBegin)
.le(ageEnd != null, User::getAge, ageEnd);
List<User> users = userMapper.selectList(queryWrapper);
users.forEach(System.out::println);
@Test
public void test12()
//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
//UPDATE t_user SET name=? WHERE is_delete=0 AND (name LIKE ? AND (age > ? OR email IS NULL))
LambdaUpdateWrapper<User>lambdaUpdateWrapper=new LambdaUpdateWrapper<>();
lambdaUpdateWrapper
.like(User::getName,"TANG_updataWrapper")
.and(item->item.gt(User::getAge,20).or().isNull(User::getEmail));
lambdaUpdateWrapper.set(User::getName,"LambdaUpdateWrapper");
int result = userMapper.update(null, lambdaUpdateWrapper);
System.out.println("result = " + result);
以上是关于MyBatis-Plus02_条件构造器QueryWrapperUpdateWrapperconditionLambdaQuery的主要内容,如果未能解决你的问题,请参考以下文章