04条件构造器和常用接口

条件构造器和常用接口

wapper介绍

在这里插入图片描述
条件构造器的两个条件之间默认就是AND并列关系,如果需要或者的关系则需要调用构造器的or()方法

条件构造器类型作用
Wrapper条件构造抽象类,最顶端父类
AbstractWrapper生成SQL的where条件
QueryWrapper封装查询或删除的条件
UpdateWrapper封装修改的条件和要修改的字段的值
AbstractLambdaWrapper使用Lambda语法,生成SQL的where条件
LambdaQueryWrapper使用Lambda语法封装查询或删除的条件
LambdaUpdateWrapper使用Lambda语法封装修改的条件和要修改的字段

支持传入条件构造器的CRUD方法

int delete(@Param(Constants.WRAPPER) Wrapper<T> wrapper);
// 如果设置了修改的字段,实体类可以为null
int update(@Param(Constants.ENTITY) T entity, @Param(Constants.WRAPPER) Wrapper<T> updateWrapper);
T selectOne(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
List<T> selectList(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据Wrapper条件查询全部记录
List<Map<String, Object>> selectMaps(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据Wrapper条件查询全部记录(返回第一个字段的值)
List<Object> selectObjs(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 分页查询
IPage<T> selectPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据Wrapper条件,查询全部记录并翻页
IPage<Map<String, Object>> selectMapsPage(IPage<T> page, @Param(Constants.WRAPPER) Wrapper<T> queryWrapper);
// 根据Wrapper条件,查询总记录数
Integer selectCount(@Param(Constants.WRAPPER) Wrapper<T> queryWrapper);

QueryWrapper

由于这些方法的返回值最后都是QueryWrapper对象所以都支持链式结构的调用

方法名功能
QueryWrapper between(数据库表中字段,最小值,最大值)查询指定范围的区间包括边界值
QueryWrapper gt/ge(数据库表中字段,值)gt表示查询大于区间,ge表示查询大于等于区间(e表示equal的意思)
QueryWrapper lt/le(数据库表中字段,值)lt表示查询小于区间,le表示查询小于等于区间
QueryWrapper eq/ne(数据库表中字段,值)eq表示查询字段等于某个值的记录,ne表示查询字段不等于某个值的记录
QueryWrapper in()包含哪几个值
QueryWrapper orderByDesc(数据库表中字段)对查询到的结果按照字段降序排序
QueryWrapper orderByAsc(数据库表中字段)对查询到的结果按照字段升序排序
方法名功能
QueryWrapper like(数据库表中字段,值)模糊查询
QueryWrapper isNotNull/isNull(数据库表中字段)判断某个字段值为不为空
QueryWrapper and(Consumer< Param>,consumer)相当于在待执行的SQL语句前加了一个括号,Param参数是wrapper的子类即条件构造器
QueryWrapper or()使用or关键字连接条件,默认调用方法是使用and关键字连接条件但不加括号
QueryWrapper select(数据库字段…)指定要查询的字段,selectList方法默认是查询所有的字段
QueryWrapper inSql(数据库字段,查询语句)以某次查询结果为基础再次查询

使用QueryWrapper条件构造器封装查询的条件实现查询和排序功能

@Data
public class User {private Long id;@TableFiled("user_name")private String name;private Integer age;private String email;@TableLogicprivate Integer isDeleted;  
}
@springBootTest
public class MybatisPlusWrapperTest{@Autowiredprivate UserMapper userMapper;//查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息/*SELECT id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 AND (user_name LIKE ? AND age BETWEEN ? AND ? AND email IS NOT NULL)*/@Testpublic void test01(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();//链式结构的调用,这些方法的返回值最后都是queryWrapper对象queryWrapper.like("user_name", "a").between("age", 20, 30).isNotNull("email");//将查询的结果集映射到实体类的属性最后一起放入List集合当中(一条记录对应一个User对象)List<User> list = userMapper.selectList(queryWrapper);list.forEach(System.out::println);}//按年龄降序查询用户,如果年龄相同则按id升序排列/*SELECT id,user_name AS name,age,email,is_deleted FROM t_user WHERE is_deleted=0 ORDER BY age DESC,id ASC*/@Testpublic void test02(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.orderByDesc("age").orderByAsc("id");List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);}
}
// 查询用户名包含a,年龄在20到30之间,并且邮箱不为null的用户信息
User(id=4,name=Sandy,age=21,email=test4@baomidou.com,isDeleted=0)//按年龄降序查询用户,如果年龄相同则按id升序排列    
User(id=5,name=Billie, age=24, email=test5@baomidou.com, isDeleted=0)
User(id=6,name=张三,age=23,email=zhangsan@atguigu.com,isDeleted=0)
User(id=100,name=张三,age=23,Iemail=zhangsan@atguigu.com,isDeleted=0)
User(id=101,name=张三,age=23,email=zhangsan@atguigu.com,isDeleted=0)
User(id=102,name=张三,age=23,email=zhangsan@atguigu.com,isDeleted=0)
User(id=103,name=张三,age=23,email=zhangsan@atguigu.com,isDeleted=0
User(id=104,name=张三,age=23,email=zhangsan@atguigu.com,isDeleted=0)
User(id=4,name=Sandy,age=21,email=test4@baomidou.com,isDeleted=0)

使用QueryWrapper条件构造器封装删除的条件实现删除功能(逻辑删除)

//删除email为空的用户
/*
UPDATEt_user 
SET is_deleted=1 
WHERE is_deleted=0 AND (email IS NULL)
*/
@Test
public void test03(){QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.isNull("email");int result = userMapper.delete(queryWrapper);System.out.println("受影响的行数:" + resu	lt);
}

使用QueryWrapper条件构造器指定修改的条件配合实体类指定修改的字段实现修改功能

//将(年龄大于20并且用户名中包含有a)或邮箱为null的用户信息修改
/*
UPDATE t_user 
SET age=?, email=? 
WHERE is_deleted = 0 AND (user_name LIKE ? AND age > ? OR email IS NULL)
*/
@Test
public void test04() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.like("user_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);
}

使用QueryWrapper条件构造器查询数据表中特定的字段(selectList方法默认查询所有字段)

//查询用户信息的user_name和age字段
/*
SELECT user_name,age,email 
FROM t_user 
WHERE is_deleted=0
*/
@Test
public void test05() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();queryWrapper.select("user_name", "age","email");//selectMaps()方法将查询的结果集以key(字段名)=value(字段值)的形式存到Map集合当中最后一起放入List集合(一条记录对应一个Map集合)List<Map<String, Object>> maps = userMapper.selectMaps(queryWrapper);maps.forEach(System.out::println);
}
//查询用户信息的user_name和age字段,并将一条记录封装到一个Map集合中
{user_name=小明,age=21,email=test@atguigu.com}
{user_nameBillie,age=24, email=test5@baomidou.com}
{user_name=张三,age=23,email=zhangsan@atguigu.com}
{user_name=张三,age=23,email=zhangsan@atguigu.com}
{user_name=张三,age=23,email=zhangsan@atguigu.com}
{user_name=张三,age=23,email=zhangsan@atguigu.com}
{user_name=张三,age=23,email=zhangsan@atguigu.com}
{user_name=张三,age=23,email=zhangsan@atguigu.com}
{user_name=小红,email=test@atguigu.com}

使用QueryWrapper条件构造器组装子查询(以某次查询结果为基础上再次查询)

// 查询id小于等于3的用户信息
/*
SELECT id,user_name,age,email,is_deleted 
FROM t_user
WHERE is_deleted=0 AND (id IN(select id from t_user where id <= 3))
*/
@Test
public void test06() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();//第一个参数是子查询要比较的字段,第二个参数是SQL查询语句,就是将要比较字段在查询的结果上再一次筛选queryWrapper.inSql("id", "select id from t_user where id <= 3");List<User> list = userMapper.selectList(queryWrapper);list.forEach(System.out::println);
}

条件构造器优先级

条件构造器中封装的条件默认按照从左到右的顺序执行,调用构造器的and(Consumer<QueryWrapper<实体类>> consumer)方法可以加小括号设置优先级

  • 在and方法内使用lambda表达式中可以保证条件优先执行,方法的参数我们就是要操作的条件构造器
// 将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
/*
UPDATE t_user 
SET age=?, email=? 
WHERE is_deleted=0 AND (user_name LIKE ? AND (age > ? OR email IS NULL))
*/
@Test
public void test04() {QueryWrapper<User> queryWrapper = new QueryWrapper<>();//queryWrapper.like("user_name", "a").and((QueryWrapper i){return i.gt("age", 20).or().isNull("email")});queryWrapper.like("user_name", "a").and(i -> i.gt("age", 20).or().isNull("email"));//设置实体类中要修改的字段,没设置的字段不会被修改User user = new User();user.setAge(20);user.setEmail("user@atguigu.com");int result = userMapper.update(user, queryWrapper);System.out.println("受影响的行数:" + result);
}

UpdateWrapper

方法名功能
UpdateWrapper set(数据库字段,值)设置要修改的字段及其值

使用UpdateWrapper不仅可以设置修改的条件还可以设置要修改的字段即不用再像QurreyWrapper一样创建实体类对象

//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
/*
UPDATE t_user 
SET age=?,email=? 
WHERE is_deleted=0 AND (user_name LIKE ? AND(age > ? OR email IS NULL))
*/
@Test
public void test07() {UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();//设置修改的字段及其对应的值updateWrapper.set("age", 18).set("email", "user@atguigu.com");//设置修改的条件,lambda表达式内的逻辑优先运算updateWrapper.like("user_name", "a").and(i -> i.gt("age", 20).or().isNull("email"));//设置修改的条件和字段简写/*updateWrapper.set("age", 18).set("email", "user@atguigu.com").like("user_name", "a").and(i -> i.gt("age", 20).or().isNull("email"));*///由于之前设置了修改的字段,所以此时不再需要传递实体类参数直接传递null即可int result = userMapper.update(null, updateWrapper);System.out.println(result);
}

condition组装条件(动态SQL)

在开发的过程中一些SQL条件来源于用户的选择,因此最终在执行SQL语句时必须先判断用户是否选择了某些条件,若选择了则拼接该SQL条件若没有选择则不拼接

方法名功能
boolean isNotBlank(Sting string)判断某字符串是否不为空字符串"",不为null,不为空白符,总之如果字符串没有数据就返回false
QueryWrapper like(condition判断条件,数据库表中字段,值)如果判断条件返回为true,则组装后面的条件进行模糊查询

传统方式: 使用if语句做判断拼装查询的条件

// 根据年龄和username查询用户信息,其中username为null
/*
SELECT id,user_name AS name,age,email,is_deleted 
FROM t_user 
WHERE is_deleted=0 AND (age >=? AND age <= ?)
*/
@Test
public void test08() {// 查询条件有可能为null(用户未输入或未选择)String username = null;Integer ageBegin = 10;Integer ageEnd = 24;QueryWrapper<User> queryWrapper = new QueryWrapper<>();//StringUtils是由Mybatis-pius提供判断字符串是由有无数据的工具类if(StringUtils.isNotBlank(username)){queryWrapper.like("user_name",username);}if(ageBegin != null){queryWrapper.ge("age", ageBegin);}if(ageEnd != null){queryWrapper.le("age", ageEnd);}//由于username为null所以只有年龄作为条件List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

调用条件构造器的条件方法时直接额外传递一个condition判断条件参数即一个bollean类型的值,如果条件为true表示组装后面的条件fasle则不组装

/*
SELECT id,user_name AS name,age,email,is_deleted 
FROM t_user 
WHERE is_deleted=0 AND (user_name like ? AND age <= ?)
*/
@Test
public void test08UseCondition() {//查询条件有可能为null(用户未输入或未选择)String username = "a";Integer ageBegin = null;Integer ageEnd = 24;QueryWrapper<User> queryWrapper = new QueryWrapper<>();//方法的参数传入condition判断条件queryWrapper.like(StringUtils.isNotBlank(username), "user_name", username).ge(ageBegin != null, "age", ageBegin)							.le(ageEnd != null, "age", ageEnd);List<User> users = userMapper.selectList(queryWrapper);users.forEach(System.out::println);
}

LambdaQuery/UpdateWrapper

当使用字符串指定一个字段时容易写错导致运行时出现错误

LambdaQuery/UpdateWrapper的条件方法中另外提供了一个函数式接口Function(实体类,?),我们可以直接访问实体类的某个属性从而获取对应字段作为条件

  • 使用LambdaQuery/UpdateWrapper的条件构造器必须使用函数式接口指定字段名

类::实例方法: 抽象方法a在被重写时使用了某一个对象的方法b,如果方法a和b的返回值类型相同但方法b的形参少一个,则可以使用方法b实现对方法a的重写替换

  • Function中的R apply(T t)方法和User中的R getXxx()方法
方法名功能
QueryWrapper like(condition判断条件,Function(实体类,?),值)通过访问实体类的属性获取属性对应的字段做模糊查询

使用LambdaQueryWrapper

// 查询用户名包含有a,年龄在10-24之间的用户
/*
SELECT id,user_name AS name,age,email,is_deleted 
FROM t_user 
WHERE (user_name LIKE ? age >=? AND age <= ?)
*/
@Test
public void test09() {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);
}

使用LambdaUpdateWrapper

//将用户名中包含有a并且(年龄大于20或邮箱为null)的用户信息修改
/*
UPDATE t_user 
SET age=?,email=? 
WHERE is_deleted=0 AND (user_name LIKE ? AND(age > ? OR email IS NULL))
*/
@Test
public void test10() {LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();//设置修改的条件和字段updateWrapper.set(User::getAge, 18).set(User::getEmail, "user@atguigu.com").like(User::getName, "a").and(i -> i.lt(User::getAge, 24).or().isNull(User::getEmail)); int result = userMapper.update(null, updateWrapper);System.out.println("受影响的行数:" + result);
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/136443.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小程序自定义tabbar

前言 使用小程序默认的tabbar可以满足常规开发&#xff0c;但是满足不了个性化需求&#xff0c;如果想个性化开发就需要用到自定义tabbar,以下图为例子 一、在app.json配置 先按照以往默认的形式配置&#xff0c;如果中间的样式特殊则不需要配置 "tabBar": {&qu…

社区分享|MeterSphere变身“啄木鸟”,助力云帐房落地接口自动化测试

云帐房网络科技有限公司&#xff08;以下简称为“云帐房”&#xff09;成立于2015年3月&#xff0c;以“成为最值得信赖的税务智能公司”为愿景&#xff0c;运用人工智能、大数据等互联网技术&#xff0c;结合深厚的财税行业服务经验&#xff0c;为代账公司和中大型企业提供智能…

避雷器雷击计数器检验

试验目的 由于密封不良&#xff0c; 放电计数器在运行中可能进入潮气或水分&#xff0c; 使内部元件锈蚀&#xff0c;导致计数器不能正确动作&#xff0c; 因此需定期试验以判断计数器是否状态良好、 能否正常动作&#xff0c; 以便总结运行经验并有助于事故分析。 带有泄漏电…

小程序隐私弹窗的实现

小程序的开发者对于微信官方来说是有爱有恨&#xff0c;三天二头整事是鹅厂的一贯风格。 隐私弹窗的几个要点 回归正题&#xff0c;小程序隐私弹窗的几个要点&#xff1a; 1、何时弹出用户隐私协议的弹窗&#xff1f; 2、是每次进小程序都弹出来吗&#xff1f; 这两个想明…

什么是HTTP状态码?常见的HTTP状态码有哪些?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 什么是HTTP状态码&#xff1f;⭐ 1xx - 信息性状态码⭐ 2xx - 成功状态码⭐ 3xx - 重定向状态码⭐ 4xx - 客户端错误状态码⭐ 5xx - 服务器错误状态码⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 欢迎来到前…

1979-2021年地级市空气流通系数数据

1979-2021年地级市空气流通系数数据 1、时间&#xff1a;1979-2021年 2、来源&#xff1a;整理自era-interim 3、范围&#xff1a;367个地级市 4、指标&#xff1a;10米风速、边界层高度、空气流通系数 5、指标解释&#xff1a; 空气流动系数是空气污染的常用工具变量&am…

小米手机安装面具教程(Xiaomi手机获取root权限)

文章目录 1.Magisk中文网&#xff1a;2.某呼&#xff1a;3.最后一步打开cmd命令行输入的时候:4.Flash Boot 通包-Magisk&#xff08;Flash Boot通刷包&#xff09;5.小米Rom下载&#xff08;官方刷机包&#xff09;6.Magisk最新版本国内源下载 1.Magisk中文网&#xff1a; htt…

SpringBoot对Filter过滤器中的异常进行全局处理

前言 今天处理拦截器中的异常时&#xff0c;遇到这样一个问题&#xff0c;我们希望在过滤器中对用户的请求进行判断&#xff0c;如果不符合要求直接抛出异常并在前端展示。但是如果我们直接在过滤器中throw一个异常时&#xff0c;尽管我们使用ControllerAdvice和 ExceptionHan…

再见纸质档案!电子会计档案数字化建设,为企业持续创造价值

传统的会计档案工作需要依靠纸张存储&#xff0c;对存储的空间大小、温度和湿度都有要求&#xff0c;财务人员要人工完成所有归档工作&#xff0c;档案在采集、调阅、借阅的过程中也易发生损坏、丢失等情况&#xff0c;企业需要付出高额的管理成本&#xff0c;不仅给财务人员带…

【IoT】生产制造:锅仔片上机做 SMT 加工吗?

目录 简介 锅仔片 简介 由于最近做产品用到了锅仔按键&#xff0c;由于单品用量过多&#xff0c;但是成品锅仔按键价格又太高&#xff0c;不适合量产。 这个时候就想到了锅仔片&#xff0c;问题又来了&#xff0c;锅仔片是否可以上机呢&#xff1f; 答案是肯定的。 锅仔片…

Spring实例化源码解析(二)

ConfigurationClassPostProcessor源码 解析 书接上回&#xff0c;在第一次调用invokeBeanDefinitionRegistryPostProcessors方法的时候参数currentRegistryProcessors为ConfigurationClassPostProcessor&#xff0c;本章主要深入这个类的postProcessBeanDefinitionRegistry方法…

B树的定义和特点

1.多叉查找树的效率 策略1:m叉查找树中&#xff0c;规定除了根节点外&#xff0c;任何结点至少有[m/2]个分叉&#xff0c;即至少含有[m/2]-1个关键字。策略2:m叉查找树中&#xff0c;规定对于任何一个结点&#xff0c;其所有子树的高度都要相同。 而满足以上两种策略的树被称…

halcon算子2、gray_histo

gray_histo 计算直方图 原形&#xff1a;gray_histo(Regions, Image : : : AbsoluteHisto, RelativeHisto) 功能&#xff1a;计算直方图 参数&#xff1a;Regions&#xff1a;区域&#xff0c;要计算的区域&#xff08;在image上的区域&#xff09; Image &#xff1a;要计算的…

【算法】迷宫问题

文章目录 前言1.迷宫问题求解分步骤求解代码 2.迷宫最短路径求解代码 前言 迷宫问题本质就是一个图的遍历问题&#xff0c;从起点开始不断四个方向探索&#xff0c;直到走到出口&#xff0c;走的过程中我们借助栈记录走过路径的坐标。 栈记录坐标有两方面的作用&#xff0c;一…

Git配置SSH

前言&#xff1a; Git是分布式的代码管理工具&#xff0c;远程的代码管理是基于SSH的&#xff0c;所以要使用远程的Git则需要SSH的配置 温馨提示&#xff1a; 1.查看是否已经有了ssh公钥&#xff1a;cd ~/.ssh 如果没有则不会有此文件夹&#xff0c;有则删除 一、git 配置 &a…

【HarmonyOS】【DevEco Studio】盘点DevEco Studio日志获取途径

【关键词】 DevEco Studio、日志获取 【问题背景】 在收到IDE工单的时候&#xff0c;很多时候开发者出现的问题都需要提供一些日志&#xff0c;然后根据日志分析&#xff0c;那么你知道IDE各种日志的获取方式么&#xff1f;往下看 【获取方法】 一、idea.log获取 IDE界面H…

【数据结构】二叉树的层序遍历(四)

目录 一&#xff0c;层序遍历概念 二&#xff0c;层序遍历的实现 1&#xff0c;层序遍历的实现思路 2&#xff0c;创建队列 Queue.h Queue.c 3&#xff0c;创建二叉树 BTree.h BTree.c 4&#xff0c;层序遍历的实现 一&#xff0c;层序遍历概念 层序遍历&#xff1a;除了先序…

大模型助力企业数据驱动,火山引擎数智平台发布AI助手

9月19日&#xff0c;火山引擎在其举办的“V-Tech数据驱动科技峰会”上宣布&#xff0c;火山引擎数智平台VeDI推出“AI助手”&#xff0c;通过接入人工智能大模型&#xff0c;帮助企业提升数据处理和查询分析的效率。即使是不会写代码的运营人员&#xff0c;和大模型对话也能做好…

基于conda的相关命令

conda 查看python版本环境 打开Anaconda Prompt的命令输入框 查看自己的python版本 conda env list激活相应的python版本(环境&#xff09; conda avtivate python_3.9 若输入以下命令可查看python版本 python -V #注意V是大写安装相应的包 pip install 包名5.查看已安装…

stm32----ADC模数转换

一、ADC介绍 ADC&#xff0c;即模数转换器&#xff0c;它可以将模拟信号转化为数字信号。在stm32种一般有3个ADC&#xff0c;每个ADC有18个通道。 12位ADC是一种逐次逼近型模拟数字转换器&#xff0c;它有多达18个通道&#xff0c;可测量16个外部和两个内部信号源。各个通道的A…