【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 已经成为了一个完全独立于…

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;需要追加哪些功能。

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遭遇大流量攻击的识别、应急处理及长期防御策…

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;开启时…

如何在Weblogic环境中启动认证方式对接Zabbix监控

在WebLogic Server中&#xff0c;启动认证可用于确保只有经过授权的用户和系统能够访问WebLogic Server及其应用程序&#xff0c;通过合理配置认证提供者和安全领域&#xff0c;管理员可以有效管理和控制用户访问。 本文将详细介绍如何在Weblogic环境中配置启动认证并对接Zabb…

用域名访问的网站一定要用OV SSL证书

一、什么是域名 域名&#xff0c;英文名为Domain Name&#xff0c;是互联网上用于识别和定位计算机的层次结构式的字符标识符&#xff0c;通过一系列的字符和点来表示&#xff0c;用于在数据传输时标识计算机的电子方位。简单来说&#xff0c;域名就是网站在互联网上的地址&am…

Django视图层探索:GET/POST请求处理、参数传递与响应方式详解

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…

【源码】源码物品销售系统多种支付接口出售源码轻松赚钱

源码物品销售系统&#xff0c;多种支付接口&#xff0c;出售源码轻松赚钱。一款基于phpmysql开发的内容付费管理系统。系统支持多种收费方式&#xff0c;免签收款&#xff0c;三级分销&#xff0c;实名认证&#xff0c; 用户投稿/奖励&#xff0c;自动升级&#xff0c;佣金提现…

python中的循环控制语句break与continue

学习这两个语句之前&#xff0c;我们要先了解这两个语句是什么意思&#xff1a; break&#xff1a;中断、打破的意思。所以它的跳出循环的意思 continue&#xff1a;继续的意思&#xff0c;意思是跳过当前条件&#xff0c;继续循环 新需求来了&#xff01;我们不仅要告诉 Py…

Spark SQL - 操作数据集

本教程将通过一个具体的案例来演示如何在Spark SQL中操作数据集。我们将从创建本地文件开始&#xff0c;然后上传到HDFS&#xff0c;并使用Spark Shell启动Spark程序。接下来&#xff0c;我们将加载数据为DataSet&#xff0c;并给DataSet添加元数据信息。最后&#xff0c;我们将…

ChineseChess.2024.06.03

ChineseChess.2024.06.03 中国象棋&#xff0c;我下得不是象棋&#xff0c;是娱乐&#xff0c;是想看看自己的程序。哈哈 看很多主播挂棋局&#xff0c;吹牛批&#xff0c;为了涨粉&#xff0c;挂着&#xff0c;蛮摆个残局 中国象棋残局模拟器ChineseChess.2024.06.03

RabbitMQ(Direct 订阅模型-路由模式)的使用

文章目录 RabbitMQ&#xff08;Direct 订阅模型-路由模式&#xff09;一&#xff0c;Direct 订阅模型-路由模式介绍&#xff08;Routing&#xff09;二&#xff0c;使用1.添加依赖2.修改配置文件3.创建配置类4.注入RabbitMQ模版引擎5.消息的发送6.消息的接收(监听)7.设置回调函…