通俗易懂的解释

想象一下你去图书馆找书:

  • QueryWrapper 就像是一个智能的图书管理员
  • 你告诉管理员你的需求:"我要找计算机类、2020年后出版的、作者是张三的书"
  • 管理员会根据你的要求组合查询条件,然后去书库帮你找书

在编程中,QueryWrapper 就是这样一个"智能查询构建器",它帮助我们用面向对象的方式构建数据库查询条件,避免直接写复杂的 SQL 语句。

QueryWrapper 的核心作用

  1. 条件构建:用链式调用组合查询条件
  2. 安全防护:防止 SQL 注入攻击
  3. 代码可读:使查询逻辑更清晰
  4. 数据库无关:支持多种数据库

实际应用示例

基础查询:用户管理系统

// 创建 QueryWrapper 实例
QueryWrapper<User> queryWrapper = new QueryWrapper<>();// 设置查询条件:年龄大于18岁,状态为激活
queryWrapper.gt("age", 18)          // age > 18.eq("status", "active"); // status = 'active'// 添加排序:按注册时间倒序
queryWrapper.orderByDesc("register_time");// 执行查询
List<User> userList = userMapper.selectList(queryWrapper);

复杂查询:商品搜索系统

QueryWrapper<Product> wrapper = new QueryWrapper<>();// 组合条件:价格在100-500之间,库存大于0,名称包含"手机"
wrapper.between("price", 100, 500)  // 100 <= price <= 500.gt("stock", 0)              // stock > 0.like("name", "手机")         // name LIKE '%手机%'// 嵌套条件:(品牌是华为或小米) 且 评分大于4.5.and(qw -> qw.eq("brand", "华为").or().eq("brand", "小米")).gt("rating", 4.5);// 分页查询
Page<Product> page = new Page<>(1, 10); // 第1页,每页10条
IPage<Product> result = productMapper.selectPage(page, wrapper);

动态条件构建:订单查询

public List<Order> searchOrders(OrderSearchParams params) {QueryWrapper<Order> wrapper = new QueryWrapper<>();// 根据参数动态添加条件if (params.getUserId() != null) {wrapper.eq("user_id", params.getUserId());}if (params.getStartDate() != null && params.getEndDate() != null) {wrapper.between("create_time", params.getStartDate(), params.getEndDate());}if (params.getMinAmount() != null) {wrapper.ge("total_amount", params.getMinAmount()); // >= minAmount}if (params.getOrderStatus() != null) {wrapper.in("status", params.getOrderStatus());}// 执行查询return orderMapper.selectList(wrapper);
}

QueryWrapper 常用方法详解

方法名作用示例等价 SQL
eq()等于eq("status", 1)status = 1
ne()不等于ne("deleted", 1)deleted <> 1
gt()大于gt("age", 18)age > 18
ge()大于等于ge("score", 60)score >= 60
lt()小于lt("price", 1000)price < 1000
le()小于等于le("weight", 5)weight <= 5
between()在...之间between("age", 18, 30)age BETWEEN 18 AND 30
like()模糊匹配like("name", "张%")name LIKE '张%'
in()在列表中in("category_id", Arrays.asList(1,2,3))category_id IN (1,2,3)
orderByAsc()升序排序orderByAsc("create_time")ORDER BY create_time ASC
select()指定返回字段select("id", "name", "email")SELECT id, name, email

 

实际应用场景

场景1:权限控制查询

public List<Document> getUserDocuments(Long userId) {QueryWrapper<Document> wrapper = new QueryWrapper<>();wrapper.eq("owner_id", userId) // 用户自己的文档.or() // 或者.inSql("id", "SELECT document_id FROM shares WHERE user_id = " + userId); // 被共享的文档return documentMapper.selectList(wrapper);
}

场景2:统计报表

public Map<String, Object> getSalesReport(int year) {QueryWrapper<Order> wrapper = new QueryWrapper<>();wrapper.select("MONTH(create_time) as month", "SUM(total_amount) as sales").eq("YEAR(create_time)", year).groupBy("MONTH(create_time)").orderByAsc("MONTH(create_time)");return orderMapper.selectMaps(wrapper); // 返回 Map 列表
}

为什么使用 QueryWrapper?

安全:避免 SQL 注入

// 错误做法(有SQL注入风险)
String sql = "SELECT * FROM users WHERE name = '" + userName + "'";// 正确做法(使用QueryWrapper安全)
wrapper.eq("name", userName);

 可维护:条件修改方便

// 修改条件只需调整一行代码
wrapper.eq("status", newStatus);

可读:链式调用清晰表达逻辑

wrapper.gt("age", 18).lt("age", 30).eq("gender", "male");

   跨数据库:自动适配不同数据库语法

总结

QueryWrapper 就像是一个智能查询助手

  1. 你告诉它需要什么条件(等于、大于、包含等)
  2. 它把这些条件翻译成正确的 SQL
  3. 帮你安全高效地执行查询

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

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

相关文章

【PyTorch】PyTorch中torch.nn模块的循环层

PyTorch深度学习总结 第九章 PyTorch中torch.nn模块的循环层 文章目录PyTorch深度学习总结前言一、循环层1. 简单循环层&#xff08;RNN&#xff09;2. 长短期记忆网络&#xff08;LSTM&#xff09;3. 门控循环单元&#xff08;GRU&#xff09;4. 双向循环层二、循环层参数1. …

Ubuntu 24.04 LTS 服务器配置:安装 JDK、Nginx、Redis。

Ubuntu 24.04 LTS 服务器配置&#xff1a;安装 JDK、Nginx、Redis。新建用来放置软件安装包的目录 mkdir /home/software 配置目录所有者为 ubuntu 用户&#xff1a; chown ubuntu /home/software将软件安装包上传到 /home/software配置 JDK-8 新建 jdk 安装目录 mkdir /usr/ja…

工作中用到过哪些设计模式?是怎么实现的?

1. 单例模式&#xff08;结合 Spring Component&#xff09;场景&#xff1a;配置中心、全局状态管理 Spring 实现&#xff1a;java// 自动注册为Spring Bean&#xff08;默认单例&#xff09; Component public class AppConfig {Value("${server.port}")private in…

Leetcode 3609. Minimum Moves to Reach Target in Grid

Leetcode 3609. Minimum Moves to Reach Target in Grid 1. 解题思路2. 代码实现 题目链接&#xff1a;3609. Minimum Moves to Reach Target in Grid 1. 解题思路 这一题我一开始走岔了&#xff0c;走了一个正向遍历走法的思路&#xff0c;无论怎么剪枝都一直超时。后来看了…

工作流引擎:IDEA没有actiBPMN插件怎么办?

文章目录一、问题描述二、替代方案一、问题描述 我们在学习activiti7工作流引擎的时候&#xff0c;需要设计流程图。 一般推荐的就是使用IDEA插件actiBPMN进行开发。 但是&#xff0c;这个插件在IDEA2019后的版本都不在支持。 也就是搜不到 那么&#xff0c;怎么办了&#x…

Android音视频探索之旅 | CMake基础语法 创建支持Ffmpeg的Android项目

一.CMake语法 CMake语法非常多&#xff0c;我们知道如何导入静态库和动态库以及最基础的使用&#xff0c;目前是够用的。其它方面则根据实际项目同步学习。 1.1.基础语法-常用 cmake_minimum_required&#xff1a;指定cmake最小版本include_directories&#xff1a;引入&#x…

React Native 初始化项目和模拟器运行

中文官方文档&#xff1a;https://reactnative.cn/docs/environment-setup 英文官方文档&#xff1a;https://reactnative.dev/docs/getting-started-without-a-framework#step-1-creating-a-new-application 创建新项目 1、初始化 # 如果你之前全局安装过旧的react-native-cli…

20250706-5-Docker 快速入门(上)-创建容器常用选项_笔记

一、创建容器常用选项&#xfeff;&#xfeff;1. 创建容器常用选项&#xfeff;1&#xff09;常用选项创建容器常用选项&#xfeff;交互式选项&#xff1a;-i&#xff1a;保持标准输入打开&#xff0c;允许交互式操作-t&#xff1a;分配伪终端&#xff0c;使容器像传统终端一…

插值与拟合(3):B样条曲线

在路径规划问题中&#xff0c;通常会用到B样条来平滑路径&#xff0c;本文实现并封装了三次准均匀开放B样条曲线&#xff0c;供大学学习使用。作者提供了三套代码方案。可以用于不同平台&#xff1a;方案1&#xff1a;MATLAB&#xff1b;方案2&#xff1a;标准C&#xff1b;方案…

[免费]基于Python豆瓣电影数据分析及可视化系统(Flask+echarts+pandas)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的于Python豆瓣电影数据分析及可视化系统(Flaskechartpandas)【论文源码SQL脚本】&#xff0c;分享下哈。项目介绍随着如今电影越来越多&#xff0c;各种各样的烂片和捞钱的商业片也层出不穷&#xff0c;而有意…

SQL127 月总刷题数和日均刷题数

SQL127 月总刷题数和日均刷题数 withtemp as (selectDATE_FORMAT(submit_time, "%Y%m") as submit_month,count(question_id) as month_q_cnt,round(count(question_id) / day(last_day(max(submit_time))),3) as avg_day_q_cntfrompractice_recordwhereyear(submit…

unity luban接入

1.找到luban官网并下载他的例子和.net8.0的sdk安装 官网地址如下 快速上手 | Luban 参考大佬教程如下 Luban新版本接入教程_哔哩哔哩_bilibili 2.找到他的luban_examples-main示例下的两个文件MiniTemplate和tool 3.MiniTemplate这个文件复制一份到项目工程下&#xff0c;自…

Django服务开发镜像构建

最后完整的项目目录结构1、安装依赖pip install django django-tables2 django-filter2、创建项目和主应用django-admin startproject configcd configpython manage.py startapp dynamic_models3、配置settings.py将项目模块dynamic_models加入进来&#xff0c;django_tables2…

20250706-3-Docker 快速入门(上)-常用镜像管理命令_笔记

一、配置加速器&#xfeff;1. Docker Hub简介与地址&#xfeff;公共镜像仓库: 由Docker公司维护的公共镜像仓库&#xff0c;包含大量容器镜像默认下载源: Docker工具默认从这个公共镜像库下载镜像访问地址: https://hub.docker.com镜像搜索功能: 可通过浏览器访问图形化管理系…

【unity游戏开发——优化篇】使用Occlusion Culling遮挡剔除,只渲染相机视野内的游戏物体提升游戏性能

注意&#xff1a;考虑到优化的内容比较多&#xff0c;我将该内容分开&#xff0c;并全部整合放在【unity游戏开发——优化篇】专栏里&#xff0c;感兴趣的小伙伴可以前往逐一查看学习。 文章目录 前言实战1、确保所有静止的3D物体都标记为Occluder Static静态遮挡体和Occludee …

通用业务编号生成工具类(MyBatis-Plus + Spring Boot)详解 + 3种调用方式

在企业应用开发中&#xff0c;我们经常需要生成类似 BZ -240704-0001 这种“业务编号”&#xff0c;它通常具有以下特点&#xff1a;前缀&#xff1a;代表业务类型&#xff0c;如 BZ 表示包装日期&#xff1a;年月日格式&#xff0c;通常为 yyMMdd序列号&#xff1a;当天内递增…

前端相关性能优化笔记

1.打开速度怎么变快 - 首屏加载优化2.再次打开速度怎么变快 - 缓存优化了3.操作怎么才顺滑 - 渲染优化4.动画怎么保证流畅 - 长任务拆分2.1 首屏加载指标细化:1.FP(First Paint 首次绘制) 2.FCP(First contentful Paint 首次内容绘制)&#xff0c;FP 到 FCP 中间其实主要是 SPA…

7.7晚自习作业

实操作业02&#xff1a;Spark核心开发 作业说明 请严格按照步骤操作&#xff0c;并将最终结果文件&#xff08;命名为&#xff1a;sparkcore_result.txt&#xff09;于20点前上传。结果文件需包含每一步的关键命令执行结果文本输出。 一、数据读取与转换操作 上传账户数据$…

手机FunASR识别SIM卡通话占用内存和运行性能分析

手机FunASR识别SIM卡通话占用内存和运行性能分析 --本地AI电话机器人 上一篇&#xff1a;手机无网离线使用FunASR识别SIM卡语音通话内容 下一篇&#xff1a;手机通话语音离线ASR识别商用和优化方向 一、前言 书接上一文《阿里FunASR本地断网离线识别模型简析》&#xff0c;…

虚幻引擎Unreal Engine5恐怖游戏设计制作教程,从入门到精通从零开始完整项目开发实战详细讲解中英字幕

和大家分享一个以前收集的UE5虚幻引擎恐怖游戏开发教程&#xff0c;这是国外一个大神制作的视频教程&#xff0c;教程从零开始到制作出一款完整的游戏。内容讲解全面&#xff0c;如蓝图基础知识讲解、角色控制、高级交互系统、高级库存系统、物品检查、恐怖环境氛围设计、过场动…