Mybatis-plus动态条件查询QueryWrapper的函数用法

2023-12-22 16:28

本文主要是介绍Mybatis-plus动态条件查询QueryWrapper的函数用法,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 前言
  • 1. QueryWrapper
  • 2. 函数
  • 3. Demo

前言

原本都是在Mapper文件中修改,直到看到项目中使用了QueryWrapper这个函数,大致了解了用法以及功能,发现还可以!

对此此贴为科普帖以及笔记帖

1. QueryWrapper

MyBatis-Plus 是 MyBatis 的增强工具包,它简化了 MyBatis 的开发流程,提供了一些常用功能的增强和简化方法。其中,QueryWrapper 是 MyBatis-Plus 中用于构建动态条件查询的一个重要类。QueryWrapper 可以用于构建 SQL 的 WHERE 子句,动态地拼接条件,以实现灵活的查询。

查看其层级结构:
在这里插入图片描述

对于Wrapper主体父类其下有关系的类,主要作用如下:

  • Wrapper:
    Wrapper 接口是用于构建查询条件的基础接口。
    它声明了一些常用的设置条件的方法,比如 eq、ne、like 等。
    QueryWrapper 和 UpdateWrapper 都实现了这个接口。
  • AbstractWrapper:
    AbstractWrapper 是一个抽象类,实现了 Wrapper 接口。
    为常用的条件设置方法提供了默认实现。
  • AbstractLambdaWrapper:
    AbstractLambdaWrapper 继承自 AbstractWrapper,引入了用于类型安全查询的 lambda 表达式。
    它专为使用 Java lambda 表达式指定查询条件的实体设计。
  • LambdaQueryWrapper:
    LambdaQueryWrapper 是 AbstractLambdaWrapper 的具体实现,用于查询操作。
    支持使用 lambda 表达式以类型安全的方式指定查询条件。
    对于实体属性名称的编译时检查,避免运行时错误。
  • LambdaUpdateWrapper:
    LambdaUpdateWrapper 是 AbstractLambdaWrapper 的具体实现,用于更新操作。
    允许使用 lambda 表达式以类型安全的方式更新实体字段。
    类似于 LambdaQueryWrapper,它通过编译时检查帮助避免运行时错误。
  • QueryWrapper:
    QueryWrapper 是 AbstractWrapper 的具体实现,用于查询操作。
    提供了各种方法用于设置不同的查询条件,如 eq、ne、like 等

2. 函数

以下是 QueryWrapper 常用的一些函数和用法:

  • eq、ne、gt、ge、lt、le:

这些方法分别表示等于、不等于、大于、大于等于、小于、小于等于的条件。

QueryWrapper<User> wrapper = new QueryWrapper<>();
wrapper.eq("name", "John") .ne("age", 25).gt("salary", 50000).ge("create_time", "2022-01-01").lt("update_time", "2023-01-01").le("status", 1);
  • like、notLike、likeLeft、likeRight:用于构建模糊查询条件。
wrapper.like("name", "John").notLike("description", "test").likeLeft("code", "abc").likeRight("email", "@domain.com");
  • isNull、isNotNull:用于构建判空条件。
wrapper.isNull("email").isNotNull("phone");
  • in、notIn:用于构建 IN 和 NOT IN 条件。
wrapper.in("role", "admin", "user", "guest").notIn("status", 0, 2, 3);
  • between、notBetween:用于构建 BETWEEN 和 NOT BETWEEN 条件。
wrapper.between("age", 20, 30).notBetween("salary", 50000, 80000);
  • or、and:用于构建 OR 和 AND 条件,可以嵌套使用。
wrapper.and(i -> i.eq("name", "John").ne("age", 25)).or(i -> i.like("name", "Tom").ge("age", 30));
  • orderBy、orderByAsc、orderByDesc:用于指定排序方式。
wrapper.orderBy(true, true, "age").orderByAsc("create_time").orderByDesc("update_time");
  • groupBy、having:用于指定分组和分组后的条件。
wrapper.groupBy("department").having("SUM(salary) > 50000");
  • apply:用于直接拼接 SQL 片段。
wrapper.apply("DATE_FORMAT(create_time, '%Y-%m-%d') = '2022-01-01'");

这些方法可以根据实际需要组合使用,动态地构建查询条件。

在 MyBatis-Plus 中,QueryWrapper 的使用使得动态条件查询变得更加方便和灵活。


关于该类的具体源码,由于比较多,我分析一个给大家看看,感兴趣的可以自已去看源码:

eq判断相等的函数:

  1. 该类继承了AbstractWrapper类:
    在这里插入图片描述
  • 找到AbstractWarpper类中重写的eq方法,对应其参数以及其怎么实现:(具体参数讲解可继续点击其addCondition)
    在这里插入图片描述
  • 查看其具体函数执行
    columnToString函数是将属性转换为string属性
    formatSql函数将val进行格式化
    doIt函数判断condition条件为true,则执行sql片段的组装
    在这里插入图片描述

3. Demo

大致相关的User类别以及Mapper需要进行创建

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;// Assuming you have a User entity with fields like id, name, age, email, etc.public class UserQueryExample {public static void main(String[] args) {// Example: Constructing a dynamic query// Create a QueryWrapper instanceQueryWrapper<User> wrapper = new QueryWrapper<>();// Basic conditionswrapper.eq("name", "John").between("age", 25, 35).like("email", "@domain.com");// Nested conditions using lambdawrapper.and(qw -> qw.gt("salary", 50000).or().lt("salary", 80000));// Order bywrapper.orderByAsc("age");// Applying additional conditions using applywrapper.apply("DATE_FORMAT(create_time, '%Y-%m-%d') = '2022-01-01'");// Print the generated SQLSystem.out.println("Generated SQL: " + wrapper.getSqlSegment());// If you are using MyBatis-Plus mapper, you can directly use the wrapper in your query// For example, if you have a UserMapper, you can do something like:// List<User> userList = userMapper.selectList(wrapper);}
}

以往我们都是使用Mapper文件中的sql进行编写,对于以往的sql语句:
存在一些问题:

  • SQL 注入风险: 直接拼接字符串可能导致 SQL 注入的风险,因为用户输入的数据没有经过严格的检查和处理。

  • 可读性差: 通过字符串拼接构建 SQL,代码的可读性较差,难以维护和理解。

  • 不够灵活: 需要手动处理各种情况,代码容易变得冗长。

相比之下,使用 MyBatis-Plus 的 QueryWrapper,可以更清晰、安全、易维护地构建动态查询条件,避免了手动拼接 SQL 字符串的繁琐和潜在的安全问题。


对于该类的更多例子可以看这篇文章的比较:Mybatis-plus 动态条件查询QueryWrapper的使用

这篇关于Mybatis-plus动态条件查询QueryWrapper的函数用法的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/524635

相关文章

Java调用C++动态库超详细步骤讲解(附源码)

《Java调用C++动态库超详细步骤讲解(附源码)》C语言因其高效和接近硬件的特性,时常会被用在性能要求较高或者需要直接操作硬件的场合,:本文主要介绍Java调用C++动态库的相关资料,文中通过代... 目录一、直接调用C++库第一步:动态库生成(vs2017+qt5.12.10)第二步:Java调用C++

Mybatis 传参与排序模糊查询功能实现

《Mybatis传参与排序模糊查询功能实现》:本文主要介绍Mybatis传参与排序模糊查询功能实现,本文通过实例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录一、#{ }和${ }传参的区别二、排序三、like查询四、数据库连接池五、mysql 开发企业规范一、#{ }和${ }传参的

C/C++错误信息处理的常见方法及函数

《C/C++错误信息处理的常见方法及函数》C/C++是两种广泛使用的编程语言,特别是在系统编程、嵌入式开发以及高性能计算领域,:本文主要介绍C/C++错误信息处理的常见方法及函数,文中通过代码介绍... 目录前言1. errno 和 perror()示例:2. strerror()示例:3. perror(

基于SpringBoot+Mybatis实现Mysql分表

《基于SpringBoot+Mybatis实现Mysql分表》这篇文章主要为大家详细介绍了基于SpringBoot+Mybatis实现Mysql分表的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可... 目录基本思路定义注解创建ThreadLocal创建拦截器业务处理基本思路1.根据创建时间字段按年进

前端高级CSS用法示例详解

《前端高级CSS用法示例详解》在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交互和动态效果的关键技术之一,随着前端技术的不断发展,CSS的用法也日益丰富和高级,本文将深... 前端高级css用法在前端开发中,CSS(层叠样式表)不仅是用来控制网页的外观和布局,更是实现复杂交

将Mybatis升级为Mybatis-Plus的详细过程

《将Mybatis升级为Mybatis-Plus的详细过程》本文详细介绍了在若依管理系统(v3.8.8)中将MyBatis升级为MyBatis-Plus的过程,旨在提升开发效率,通过本文,开发者可实现... 目录说明流程增加依赖修改配置文件注释掉MyBATisConfig里面的Bean代码生成使用IDEA生

揭秘Python Socket网络编程的7种硬核用法

《揭秘PythonSocket网络编程的7种硬核用法》Socket不仅能做聊天室,还能干一大堆硬核操作,这篇文章就带大家看看Python网络编程的7种超实用玩法,感兴趣的小伙伴可以跟随小编一起... 目录1.端口扫描器:探测开放端口2.简易 HTTP 服务器:10 秒搭个网页3.局域网游戏:多人联机对战4.

Kotlin 作用域函数apply、let、run、with、also使用指南

《Kotlin作用域函数apply、let、run、with、also使用指南》在Kotlin开发中,作用域函数(ScopeFunctions)是一组能让代码更简洁、更函数式的高阶函数,本文将... 目录一、引言:为什么需要作用域函数?二、作用域函China编程数详解1. apply:对象配置的 “流式构建器”最

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

Spring Boot + MyBatis Plus 高效开发实战从入门到进阶优化(推荐)

《SpringBoot+MyBatisPlus高效开发实战从入门到进阶优化(推荐)》本文将详细介绍SpringBoot+MyBatisPlus的完整开发流程,并深入剖析分页查询、批量操作、动... 目录Spring Boot + MyBATis Plus 高效开发实战:从入门到进阶优化1. MyBatis