【MyBatisPlus】MyBatisPlus条件查询

【MyBatisPlus】MyBatisPlus条件查询


文章目录

      • 【MyBatisPlus】MyBatisPlus条件查询
        • 1、查询条件方式
        • 2、组合条件
        • 3、NULL值处理
        • 4、查询投影-设置【查询字段、分组】
        • 5、查询条件
        • 6、字段映射与表名映射问题导入

1、查询条件方式

MyBatisPlus将书写复杂的SQL查询条件进行了封装,使用编程的形式完成查询条件的组合

image-20210801181232962

方式一:按条件查询

查询年龄大于18岁的用户

@Test
void testQueryWrapper() {//1. 创建查询条件封装对象,可以指定泛型QueryWrapper<User> wrapper = new QueryWrapper();//2.字段age大于18wrapper.gt("age", 18);//3.执行查询List<User> users = userMapper.selectList(wrapper);//4.输出结果users.forEach(System.out::println);
}

方式二:lambda格式按条件查询(推荐)

查询年龄小于10的用户

@Test
void testLambdaQueryWrapper() {//1.创建lambda查询包装器,支持泛型LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper();//2. 使用lambda参数,相当于调用 user -> user.getAge()方法,获取列名wrapper.le(User::getAge, 10);//3.查询List<User> users = userMapper.selectList(wrapper);//4.输出结果users.forEach(System.out::println);
}
2、组合条件

并且关系(and)

查询年龄小于30岁,而且大于10岁的用户

@Test
void testAnd() {//并且关系LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();//支持链式写法wrapper.lt(User::getAge, 30).gt(User::getAge, 10);List<User> userList = userMapper.selectList(wrapper);System.out.println(userList);
}

生成的SQL语句

SELECT id,name,gender,password,age,tel FROM user WHERE (age < ? AND age > ?)

或者关系(or)

查询年龄小于10岁或者大于30岁的用户

@Test
void testOr() {LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();//或者关系:小于10岁或者大于30岁wrapper.lt(User::getAge, 10).or().gt(User::getAge, 30);List<User> userList = userMapper.selectList(wrapper);System.out.println(userList);
}

生成的SQL语句

SELECT id,name,gender,password,age,tel FROM user WHERE (age < ? OR age > ?)
3、NULL值处理

在多条件查询中,有条件的值为空应该怎么解决?

  • 如果最小年龄不为空,则查询大于这个年龄的用户
  • 如果最大年龄不为空,则查询小于这个年龄的用户

if语句控制条件追加

@Test
void testNullValue() {Integer minAge = 10;  //将来有用户传递进来,此处简化成直接定义变量了Integer maxAge = null;  //将来有用户传递进来,此处简化成直接定义变量了LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();if (minAge != null) {wrapper.gt(User::getAge, minAge);  //大于}if (maxAge != null) {wrapper.lt(User::getAge, maxAge);  //小于}List<User> userList = userMapper.selectList(wrapper);userList.forEach(System.out::println);
}

条件参数控制

@Test
void testCondition() {Integer minAge=10;  //将来有用户传递进来,此处简化成直接定义变量了Integer maxAge=null;  //将来有用户传递进来,此处简化成直接定义变量了LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();//参数1:如果表达式为true,那么查询才使用该条件,也支持链式编程wrapper.gt(minAge != null, User::getAge, minAge);wrapper.lt(maxAge != null, User::getAge, maxAge);//查询List<User> userList = userMapper.selectList(wrapper);//输出userList.forEach(System.out::println);
}
4、查询投影-设置【查询字段、分组】

查询结果包含模型类中部分属性

查询所有用户,只显示id, name, age三个属性,不是全部列。

使用select(列名...)方法,查询的结果如果封装成实体类,则只有这三个属性有值,其它属性为NULL

@Test
void testSameColumn() {LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();//查询所有用户,只显示id, name, age三个属性,不是全部列wrapper.select(User::getId, User::getName, User::getAge);List<User> userList = userMapper.selectList(wrapper);System.out.println(userList);
}

SQL语句

SELECT id,name,age FROM user

查询结果包含模型类中未定义的属性

如果查询结果包含模型类中未定义的属性,则将每个元素封装成Map对象。

需求:按性别进行分组,统计每组的人数。只显示统计的人数和性别这两个字段

使用QueryWrapper包装对象的select方法

@Test
void testCountGender() {//使用QueryWrapper包装对象QueryWrapper<User> wrapper = new QueryWrapper<>();//查询2列:人数, 性别。 将聚合函数定义别名做为Map中的键wrapper.select("count(*) as count, gender");//按sex分组wrapper.groupBy("gender");//这里的查询方法使用selectMapsList<Map<String, Object>> list = userMapper.selectMaps(wrapper);list.forEach(System.out::println);
}
5、查询条件

多条件查询有哪些组合?

  • 范围匹配(> 、 = 、between)
  • 模糊匹配(like)
  • 空判定(null)
  • 包含性匹配(in)
  • 分组(group)
  • 排序(order)
  • ……

查询

  • 购物设定价格区间、户籍设定年龄区间(le ge匹配 或 between匹配)
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<User>();
//范围查询 lt le gt ge eq between
wrapper.between(User::getAge, 10, 30);
List<User> userList = userMapper.selectList(wrapper);
System.out.println(userList);
  • 查信息,搜索新闻(非全文检索版:like匹配)
/*** 需求: 查询姓张的用户*    select * from user where name like '张%'*/
@Test
public void testFindByLike(){LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.likeRight(User::getName,"张");List<User> userList = userMapper.selectList(lambdaQueryWrapper);userList.forEach(System.out::println);
}
  • 统计报表(分组查询聚合函数)
QueryWrapper<User> qw = new QueryWrapper<User>();
qw.select("gender", "count(*) as nums");
qw.groupBy("gender");
List<Map<String, Object>> maps = userMapper.selectMaps(qw);
System.out.println(maps);

排序和limit

题目:显示年龄最大的5个用户

  • 说明:

    ①:提示:对年龄进行降序排序

    ②:仅获取前5条数据(提示:使用分页功能控制数据显示数量)

  • last()方法的说明:

    无视优化规则直接拼接到 sql 的最后(有sql注入的风险,请谨慎使用),注意只能调用一次,多次调用以最后一次为准

     /*** 需求: 查询年龄大于18岁的前三位*      select * from user where age>18 order by age desc limit 3;**/@Testpublic void testFindByLimit(){LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();lambdaQueryWrapper.gt(User::getAge,18).orderByDesc(User::getAge).last("limit 3");List<User> userList = userMapper.selectList(lambdaQueryWrapper);userList.forEach(System.out::println);}
    

    生成的SQL

    SELECT id,name,gender,password,age,tel FROM user WHERE (age > ?) ORDER BY age DESC limit 3
    
6、字段映射与表名映射问题导入

问题一:表字段与编码属性设计不同步

解决办法:

  • 在模型类属性上方,使用**@TableField**属性注解,通过==value==属性,设置当前属性对应的数据库表中的字段关系。

image-20210801182722773

生成的SQL语句,自动给pwd这一列定义了别名为password, 从而给实体类属性password封装数据

SELECT id,name,gender,pwd AS password,age,tel FROM user

问题二:编码中添加了数据库中未定义的属性

解决方法:

  • 在模型类属性上方,使用**@TableField注解,通过exist**属性,设置属性在数据库表字段中是否存在,默认为true。此属性无法与value同时使用。

image-20210801182809131

不会去查询online

User(id=4, name=NewBoy, gender=男, password=123456, age=19, tel=12345678910, online=null)

问题三:某些字段和属性不参与查询

需求:password这个字段不查询

  • 在模型类属性上方,使用**@TableField注解,通过select**属性:设置该属性是否参与查询。此属性与select()映射配置不冲突。

image-20210801220534494

查询的SQL语句中不包含pwd字段

SELECT id,name,gender,age,tel FROM user WHERE id=?

实体类的password属性中没有值

User(id=4, name=NewBoy, gender=男, password=null, age=19, tel=12345678910, online=null)

问题四:表名与实体类名不同

解决方法:

  • 模型类上方,使用**@TableName注解,通过value**属性,设置当前类对应的数据库表名称。

image-20210801220807882

@Data
@TableName("tbl_user")
public class User {}

查询生成的SQL语句

 SELECT id,name,gender,age,tel FROM tbl_user WHERE id=?

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

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

相关文章

JSON 数据格式化方法

文章目录 数据介绍IDE 或脚本格式化在线工具网址总结 数据介绍 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&#xff0c;它基于JavaScript 编程语言的一个子集。尽管它起源于 JavaScript&#xff0c;但 JSON 已经成为了一个完全独立于…

保护隐私下的数据提取:方法与伦理考量

在数字化时代&#xff0c;数据的收集和分析为我们提供了前所未有的机会和便利。然而&#xff0c;这些机遇也伴随着隐私泄露的严重风险。如何在保护个人隐私的前提下进行数据提取&#xff0c;已成为一个亟待解决的问题。本文将探讨保护隐私下的数据提取方法&#xff0c;并深入分…

2024专精特新趋势论坛,汉王友基分享数字化创新实践之路

5月31日&#xff0c;由深圳市中小企业服务局作为指导单位&#xff0c;36氪主办的“WISE新风向2024专精特新趋势论坛”在粤港澳大湾区顺利举办。 汉王友基作为国家级专精特新“小巨人”企业代表&#xff0c;受邀参加此次大会&#xff0c;企业CTO邓立明先生进行了《数字赋能&…

让企业自己掌握数据主权,可道云teamOS让企业数据私有化不再是难题,让企业数据更安全、更可控

越来越多的企业开始意识到&#xff0c;仅仅依赖公共云存储服务可能无法满足其对于数据安全性的高标准要求。 毕竟每年都会有不同程度的数据泄露问题爆出&#xff0c;导致大家在使用企业网盘的时候也总是惴惴不安。一旦数据泄露或被非法获取&#xff0c;企业将面临巨大的经济损…

geotrust泛域名https600元

泛域名https证书&#xff0c;也可以称之为通配符https证书&#xff0c;是开发者用来保障网站安全、提升用户信任度的方案之一。开发者可以使用泛域名https证书为多个网站进行数据加密以及身份认证服务&#xff0c;提升网站的安全性。今天就随SSL盾小编了解geotrust旗下的泛域名…

如何理解 Java 线程的概念及线程的创建和管理,包括 Runnable 接口和 Thread 类

多线程编程是现代软件开发中的重要技术&#xff0c;能够显著提高程序的效率和响应速度。Java 提供了丰富的多线程编程支持&#xff0c;使开发者可以轻松地创建和管理线程。 1. 线程的基本概念 1.1 进程与线程 进程&#xff1a;是操作系统中独立运行的程序&#xff0c;每个进…

AI大模型页面

自己做的AI&#xff0c;模仿GPT。 访问地址&#xff1a;欢迎 请大家给点意见&#xff0c;需要追加哪些功能。

前端高速成长的八个阶段

高速成长阶段一&#xff1a;学会用 Google 英文搜索。 为什么不用百度&#xff1f; 因为搜索范围与质量相差太大。用谷歌&#xff0c;你通常能在第一页找到高质量的答案&#xff0c;而在百度你可能需要花费更多时间。英文搜索并不难&#xff0c;例如遇到 React 报错&#xff0…

Windows下设置pip代理(proxy)

使用场景 正常网络情况下我们安装如果比较多的python包时&#xff0c;会选择使用这种 pip install -r requirements.txt -i https://pypi.tuna.tsinghua.edu.cn/simple --trusted-hostpypi.tuna.tsinghua.edu.cn 国内的镜像来加快下载速度。 但是&#xff0c;当这台被限制上…

【python】修改目标检测的xml标签(VOC)类别名

需求&#xff1a; 在集成多个数据集一同训练时&#xff0c;可能会存在不同数据集针对同一种目标有不同的类名&#xff0c;可以通过python脚本修改数据内的类名映射&#xff0c;实现统一数据集标签名的目的。 代码&#xff1a; # -*- coding: utf-8 -*- # Time : 2023/9/11 1…

出海APP遭遇大流量攻击的应对与防御策略

随着全球化的加速&#xff0c;越来越多的中国企业选择将APP推向海外市场。然而&#xff0c;这也意味着他们将面临更加复杂多变的网络安全环境&#xff0c;其中大流量DDoS攻击便是常见且破坏力巨大的威胁之一。本文将深入探讨出海APP遭遇大流量攻击的识别、应急处理及长期防御策…

如何选择实名认证接口?C++身份证二、三要素实名认证接口提供厂商

线上平台进行身份证实名认证&#xff0c;有助于保障交易的安全性&#xff0c;防止身份信息被盗用的风险&#xff0c;其主要应用于金融、在线银行、支付平台、社交媒体、账号注册、内容发布等多种应用场景。那么&#xff0c;又当如何选择实名认证接口厂家呢&#xff1f; 翔云人…

java中的注解

文章目录 定义格式使用类型内置注解元注解自定义注解 注解实现 定义 注解一般用于对程序的说明&#xff0c;想注释一样&#xff0c;但是区别是&#xff0c;注释是给人看的&#xff0c;注解是给程序看的让编译器进行编辑检查的作用&#xff0c;比如&#xff1a;Override修饰的方…

富格林:正确应对虚假暗箱计策

富格林悉知&#xff0c;当前投资者对现货黄金交易热情高涨&#xff0c;要想通过现货黄金交易获得可观的收益&#xff0c;那么对于行情的准确分析和判断便是不可或缺的。富格林认为&#xff0c;基本上每位投资者都需要花费时间和精力去学习正规的技巧提高操作技术才可正确应对虚…

osi七层网络模型安全加固

应用层加固 应用层的攻击&#xff1a; 1、针对应用层协议的攻击&#xff1a;HTTP攻击、DNS攻击、电子邮件攻击等&#xff0c;利用应用层协议的漏洞&#xff0c;构造恶意数据包&#xff0c;是目标服务器执行恶意代码或暴露敏感信息 HTTP攻击&#xff1a;XSS、CSRF、HTTP头注入…

你每天都在用的APP,原来都是Python写的!

&#x1f446;点击关注 获取更多编程干货&#x1f446; 要说Python的用途&#xff0c;那可太多了&#xff0c;也许你不知道Python是什么&#xff0c;但你一定用过它开发的产品&#xff0c;就像你可能不了解汽车引擎的构造&#xff0c;但你每天都享受着汽车带来的便利一样。 比…

stm32-DMA转运数据

在配置前要记得先定义一下DMA转运的源端数组和目标数组两个数组哦。 接下来我们就开始准备配置吧 配置 初始化 1.RCC开启时钟&#xff08;开启DMA的时钟&#xff09; void RCC_AHBPeriphClockCmd(uint32_t RCC_AHBPeriph, FunctionalState NewState) 作用&#xff1a;开启时…

深入探讨Qt中的QVariant

深入探讨Qt中的QVariant 在Qt框架中&#xff0c;QVariant是一个非常强大的类&#xff0c;用于在运行时存储和操作不同类型的值。它类似于C标准库中的std::any或boost::any&#xff0c;能够动态存储任意类型的值&#xff0c;并且在需要时进行类型转换。本文将详细介绍QVariant的…

AbMole《丝光交织,未来可期:新型多功能丝素蛋白/透明质酸支架为脊髓修复带来新希望》

在生物医学领域&#xff0c;脊髓损伤&#xff08;Spinal Cord Injury, SCI&#xff09;的修复一直是一个巨大的挑战。由于脊髓缺乏自我修复的能力&#xff0c;一旦发生损伤&#xff0c;往往会导致永久性的功能障碍。然而&#xff0c;随着组织工程和生物材料科学的发展&#xff…

注册域名用哪个后缀好?

在互联网的世界中&#xff0c;域名是您品牌、业务或个人在线身份的基石。选择正确的域名后缀对于建立在线存在感和吸引目标受众至关重要。随着新顶级域名(New gTLDs)的涌现&#xff0c;域名后缀的选择变得多样化。本文将探讨如何选择最适合您需求的域名后缀。 传统顶级域名(TL…