【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大于18
    wrapper.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");
    //这里的查询方法使用selectMaps
    List<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;
         *
         */
        @Test
        public 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.mfbz.cn/a/678353.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于ESP32-S3芯片的通用型无线模组方案,启明云端乐鑫一级代理商

随着物联网技术的飞速发展&#xff0c;智能设备正以前所未有的速度进入到我们的日常生活中&#xff0c;AIoT&#xff08;人工智能物联网&#xff09;已成为智能家居、智能设备、智能安防等领域的核心技术。 作为乐鑫一级代理商&#xff0c;基于ESP32-S3芯片&#xff0c;启明云…

武汉凯迪正大—开关柜综合试验台 通电试验车 开关柜通电测试台

产品概述 ​武汉凯迪正大KDGK-II 成套综合测试台用于高低压开关柜生产厂家对所生产的高低压开关柜进行出厂前的各项通电试验。它能提供各种交、直流电源&#xff0c;便于对开关柜的检测&#xff0c;提高工作效率。 技术参数 输入电源&#xff1a;三相四线AC380V 输出电压及电…

【JAVA架构】开发在线开具电子发票系统

【JAVA架构VUE】开发在线开具电子发票系统 对接税务厂家接口 实现销售发票开具 进项发票在线拉取 红冲发票在线开具 详细内容可以关注本人专栏等 销售发票开具 开具发票 进项发票在线拉取 红冲发票在线开具

YoloV9改进策略:Block篇|基于FasterNet的Block改进|性能和精度得到大幅度提高(独家原创)

本文使用FasterNet的Block改进YoloV9,对FasterNet的Block做了适当的修改,使其能够适配YoloV9,可以替换YoloV9的Bottleneck模块。 论文翻译:《CVPR2023年最新的网络,基于部分卷积PConv,性能远超MobileNet,MobileVit 为了设计快速神经网络,许多工作都专注于减少浮点运算…

高考杂志《高考》杂志社高考杂志社2024年第13期目录

高考论坛 新高考背景下高中生物核心素养培养的策略研究 胡世敏; 3-5《高考》投稿&#xff1a;cn7kantougao163.com 对新高考背景下职业生涯规划教育发展的思考 李昉睿; 6-8 基于新高考的高中语文现代诗歌教学探究 申艳; 9-11 “三新”改革下培养高中生英语核心…

A6110 轴相对振动监控器AMS 6500机械健康监测器

轴相对振动监控器的设计具有极高的可靠性 工厂最重要的旋转机械。此单槽显示器与一起使用 其他AMS 6500监视器构建一个完整的API 670机械保护监视器。 应用包括蒸汽、气体、压缩机和水力涡轮机械。 轴相对振动监控模块的主要功能是 通过比较准确监测轴相对振动并可靠地保护机械…

Vxe UI vue 使用 VxeUI.previewImage() 图片预览方法

Vxe UI vue 使用 VxeUI.previewImage() 图片预览方法的调用 查看 github 代码 调用全局方法 VxeUI.previewImage() 参数说明&#xff1a; urlList&#xff1a;图片列表&#xff0c;支持传字符串&#xff0c;也可以传对象数组 [{url: xx’l}] activeIndex&#xff1a;指定默…

OceanBase 4.3.0 列存引擎解读:OLAP场景的入门券

近期&#xff0c;OceanBase 发布了4.3.0版本&#xff0c;该版本成功实现了行存与列存存储的一体化&#xff0c;并同时推出了基于列存的全新向量化引擎和代价评估模型。通过强化这些能力&#xff0c;OceanBase V4.3.0 显著提高了处理宽表的效率&#xff0c;增强了在AP&#xff0…

excle中数据分析,excle导入用sql简单处理

前言&#xff1a; 办法一&#xff1a;直接用excle导入db就行&#xff0c;如果excle导如db不能用&#xff0c;就用笨办法下面这个方法去做 1、从系统中导出excle 2、db中插入相应的表和标题 3、先手动插入条件&#xff0c;把insert语句复制出来 INSERT INTO test.test (orders…

AI预测体彩排3采取888=3策略+和值012路或双胆下一一缩定乾坤测试6月4日预测第1弹

哈喽&#xff0c;各位亲爱的小伙伴&#xff0c;咱们从今天开始进行新一轮的测试验证&#xff0c;在正式开始前&#xff0c;咱们先对上一个周期的10次测试做一个总结。经过对一个周期&#xff08;10天&#xff09;的测试&#xff0c;我的AI模型对于8码定位的命中率为70%&#xf…

AI办公蓝桥杯全国总决赛获奖心得分享

从校赛到省赛&#xff0c;再到全国总决赛&#xff0c;一路走来&#xff0c;见证了自己的成长与蜕变。这篇文章将分享我在蓝桥杯大赛中的经历与心得&#xff0c;希望对正在奋斗路上的你有所启发和帮助。 1&#xff0c;从平凡到闪耀&#xff1a;自我成长的历程 最开始&#xff…

科技云报道:走出“实验室”,GenAI迎来关键拐点

科技云报道原创。 对传统产业来说&#xff0c;GenAI是一场“哥白尼式的革命”&#xff0c;它改变了传统的业务模式&#xff0c;开启了人类与AI合作的新纪元。基于AI助手和大语言模型&#xff0c;企业能够实现智能运营的目标。 如果说&#xff0c;2022年是AI大模型元年&#x…

mysql终端使用中的错误

在这个过程中&#xff0c;出现了几个问题&#xff1a; 在退出 MySQL 后&#xff0c;你尝试再次使用 mysql 命令登录&#xff0c;但系统提示找不到该命令。这可能是因为 MySQL 的执行文件路径没有加入到系统的环境变量中。你可以尝试使用绝对路径来运行 mysql 命令&#xff0c;或…

教师产假多少天

教师产假究竟有多少天&#xff1f;这个问题或许在您计划家庭时显得尤为重要。教师作为国家公职人员&#xff0c;享有法定的产假权益。 根据规定&#xff0c;女职工的产假一般为98天&#xff0c;包括产前15天和产后83天。但请注意&#xff0c;这一标准并非全国统一&#xff0c;不…

学习算法笔记(7.5)-贪心算法(股票售卖问题)

学到这里的大家应该都非常清楚贪心算法到底是怎么一回事了&#xff0c;说白了就是动态规划的一种特例&#xff0c;没有动态规划的使用范围广&#xff0c;但是效率却比动态规划效率高&#xff0c;贪心算法不考虑之前的情况&#xff0c;只考虑当前的最优选择以期达到最优的结果。…

【python】成功解决“ModuleNotFoundError: No module named ‘IPython’”错误的全面指南

成功解决“ModuleNotFoundError: No module named IPython’”错误的全面指南 一、引言 在Python编程中&#xff0c;ModuleNotFoundError是一种常见的错误类型&#xff0c;它通常表明Python解释器无法找到你试图导入的模块。特别是当你遇到“ModuleNotFoundError: No module…

echarts图例formatter配置添加百分比

echarts图例如何添加百分比 const pieChart async () > {const myChart echarts.init(piepic.value)const piedata await getPieData(); // 等待数据返回myChart.setOption({title: {},grid: {},tooltip: {trigger: item,},legend: {top: middle,align:left,icon: circl…

C# 解决 Excel 自动适应列宽的问题

目录 问题现象 原因分析 范例运行环境 解决问题 生成测试文本 实现自适应 小结 问题现象 通过 COM 操作 Excel 自动适应列宽的方法是 AutoFit 方法&#xff0c;该方法适于自动适应列宽或行高。 最近在我们的一款应用里发现效果并没有符合预期&#xff0c;我们提供了一…

YOLOv10训练自己的数据集

目录 0、引言 1、环境配置 2、数据集准备 3、创建配置文件 3.1、设置官方配置文件&#xff1a;default.yaml&#xff0c;可自行修改。 3.2、设置data.yaml 4、进行训练 4.1、方法一 4.2、方法二 5、验证模型 5.1、命令行输入 5.2、脚本运行 6、总结 0、引言 本文…

【线性代数】SVDPCA

用最直观的方式告诉你&#xff1a;什么是主成分分析PCA_哔哩哔哩_bilibili 奇异值分解singular value decomposition&#xff0c;SVD principal component analysis,PCA 降维操作 pca就是降维后使得信息损失最小 投影在坐标轴上的点越分散&#xff0c;信息保留越多 pca的实现…