当前位置: 首页 > news >正文

QueryWrapper 类的作用与示例详解

通俗易懂的解释

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

  • 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.xdnf.cn/news/1083997.html

相关文章:

  • QT并发机制
  • 数学建模的一般步骤
  • 暑假复习篇之五子棋③【人机对战篇1】
  • Oracle使用SQL一次性向表中插入多行数据
  • 数据可视化中常用的图表类型 及其适用场景,涵盖基础到高级,帮助你根据数据类型和展示目标选择合适的图表:
  • 【论文笔记】【强化微调】Pixel Reasoner:早期 tool call 的调用
  • react当中的this指向
  • 【从0-1的CSS】第3篇:盒子模型与弹性布局
  • 《前端路由重构:解锁多语言交互的底层逻辑》
  • 3. lvgl 9.3 vscode 模拟环境搭建 lv_port_pc_vscode-release-v9.3
  • Paimon索引概述
  • vue3.4中的v-model的用法~
  • 支持向量机(SVM)在肝脏CT/MRI图像分类(肝癌检测)中的应用及实现
  • 从源码到思想:OneCode框架模块化设计如何解决前端大型应用痛点
  • Application的onLowMemory从Android API 34开始系统不再触发,从API 35开始废弃
  • 【BTC】协议(共识机制)
  • 自定义指令
  • java+vue+SpringBoo职业生涯规划系统(程序+数据库+报告+部署教程+答辩指导)
  • 【AI大模型】Spring AI 基于mysql实现对话持久存储详解
  • 多模态大语言模型arxiv论文略读(149)
  • 【网络协议安全】任务13:ACL访问控制列表
  • 深度学习图像分类数据集—蘑菇可食性识别分类
  • 使用Python将PDF转换成word、PPT
  • 量子计算机技术(第二节,到底什么是量子)
  • 【CSS-15】深入理解CSS transition-duration:掌握过渡动画的时长控制
  • 高速信号眼图
  • ASP.NET代码审计 Web Forms框架 SQL注入漏洞
  • 【Python】使用读取到的文件
  • 零成本搭建浏览器远程Linux桌面:Ubuntu/Debian方案全解析
  • MySQL数据库主从复制