MyBatis-Plus条件构造器:构建安全、高效的数据库查询
一、关于条件构造器(Wrapper)
1.1 简介
MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。
1.2 发展
核心功能的发展:
- 从早期的MyBatis-Plus版本开始,条件构造器(Wrapper)就已经作为核心功能之一,用于构建复杂的数据库查询条件。随着版本的迭代,条件构造器的功能不断增强,提供了更多的方法来支持各种查询操作,如
eq(等于)、ne(不等于)、gt(大于)、lt(小于)等。
- 从早期的MyBatis-Plus版本开始,条件构造器(Wrapper)就已经作为核心功能之一,用于构建复杂的数据库查询条件。随着版本的迭代,条件构造器的功能不断增强,提供了更多的方法来支持各种查询操作,如
链式调用的优化:
- 条件构造器支持链式调用,这使得代码更加简洁和易读。随着MyBatis-Plus的发展,链式调用的流畅性和易用性得到了进一步的优化,使得开发者可以更加方便地构建复杂的查询条件。
Lambda表达式的引入:
- 随着Java 8的普及,MyBatis-Plus引入了基于Lambda表达式的条件构造器,如
LambdaQueryWrapper和LambdaUpdateWrapper,这使得开发者可以使用更加现代的编程方式来构建查询和更新条件,提高了代码的可读性和安全性。
- 随着Java 8的普及,MyBatis-Plus引入了基于Lambda表达式的条件构造器,如
功能扩展:
- MyBatis-Plus条件构造器的功能不断扩展,新增了许多方法,如
eqSql、gtSql、geSql、ltSql、leSql等,这些方法允许开发者直接在条件构造器中嵌入SQL片段,提供了更高的灵活性。
- MyBatis-Plus条件构造器的功能不断扩展,新增了许多方法,如
性能优化:
- 随着MyBatis-Plus的发展,条件构造器在性能上也得到了优化。通过减少不必要的SQL拼接和优化条件构造逻辑,提高了查询的效率。
易用性的提升:
- MyBatis-Plus不断改进条件构造器的易用性,例如通过提供更多的方法来支持不同的查询场景,如
groupBy、orderBy、having等,使得开发者可以更加方便地构建复杂的查询条件。
- MyBatis-Plus不断改进条件构造器的易用性,例如通过提供更多的方法来支持不同的查询场景,如
1.3 特点
MyBatis-Plus的条件构造器具有以下特点:
- 链式调用:Wrapper类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的SQL语句,从而提高开发效率。
- 安全性:通过使用Wrapper,可以避免直接拼接SQL片段,减少SQL注入的风险。
- 灵活性:支持多种查询操作,如等于、不等于、大于、小于等,以及逻辑组合如
and和or。 - Lambda表达式:LambdaQueryWrapper和LambdaUpdateWrapper通过Lambda表达式引用实体类的属性,避免了硬编码字段名,提高了代码的可读性和可维护性。
- 减少代码量:Wrappers类作为一个静态工厂类,可以快速创建Wrapper实例,减少代码量,提高开发效率。
- 线程安全性:Wrapper实例不是线程安全的,建议每次使用时创建新的Wrapper实例,以避免多线程环境下的数据竞争和潜在错误。
- 支持复杂查询:支持嵌套查询和自定义SQL片段,通过
nested和apply方法,可以构建更复杂的查询条件。 - 类型处理器:在Wrapper中可以使用TypeHandler处理特殊的数据类型,增强了对数据库类型的支持。
- 更新操作简化:使用UpdateWrapper或LambdaUpdateWrapper时,可以省略实体对象,直接在Wrapper中设置更新字段。
1.4 主要类型
MyBatis-Plus 提供了多种条件构造器,以满足不同的查询需求:
- QueryWrapper<T> :用于构建查询条件,支持链式调用,可以非常方便地添加各种查询条件。
- UpdateWrapper<T> :用于构建更新条件,支持链式调用,可以方便地添加各种更新条件。
- LambdaQueryWrapper<T> :使用 Lambda 表达式来构建查询条件,避免了字段名错误的问题,增强了代码的可读性和健壮性。
- LambdaUpdateWrapper<T> :使用 Lambda 表达式来构建更新条件,同样可以避免字段名错误的问题。
- AbstractWrapper<T> :是一个抽象类,其他 Wrapper 类继承自这个类,提供了一些基础的方法实现。
二、基本运用
2.1 使用方法
条件构造器允许开发者以链式调用的方式构造SQL的WHERE子句,提供了极大的灵活性和便利性。例如,使用QueryWrapper可以这样构建查询条件:
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("name", "Kimi").lt("age", 30);
这将生成SQL:SELECT * FROM user WHERE name = 'Kimi' AND age < 30。
2.2 示例
QueryWrapper 示例
// 创建 QueryWrapper 对象
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
// 添加查询条件
queryWrapper.eq("name", "张三") // 字段等于某个值
.gt("age", 18) // 字段大于某个值
.like("email", "%@gmail.com"); // 字段包含某个值
// 使用条件进行查询
List<User> users = userMapper.selectList(queryWrapper);
UpdateWrapper 示例
// 创建 UpdateWrapper 对象
UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
// 设置更新条件
updateWrapper.eq("id", 1); // 更新 id=1 的记录
// 设置要更新的数据
User user = new User();
user.setName("李四");
user.setAge(20);
// 执行更新操作
int result = userMapper.update(user, updateWrapper);
LambdaQueryWrapper 示例
// 创建 LambdaQueryWrapper 对象
LambdaQueryWrapper<User> lambdaQueryWrapper = new LambdaQueryWrapper<>();
// 添加查询条件
lambdaQueryWrapper.eq(User::getName, "张三")
.gt(User::getAge, 18)
.like(User::getEmail, "%@gmail.com");
// 使用条件进行查询
List<User> users = userMapper.selectList(lambdaQueryWrapper);
三、Wrapper 类
3.1 简介
在 MyBatis-Plus 中,Wrapper 类是构建查询和更新条件的核心工具。
3.2 方法
MyBatis-Plus的Wrapper类提供了一系列方法来构建复杂的数据库查询条件。以下是一些常用的Wrapper类方法汇总:
基本条件方法:
eq:等于条件,例如wrapper.eq("name", "zhangsan")。ne:不等于条件,例如wrapper.ne("name", "zhangsan")。gt:大于条件,例如wrapper.gt("age", 18)。lt:小于条件,例如wrapper.lt("age", 18)。ge:大于等于条件,例如wrapper.ge("age", 18)。le:小于等于条件,例如wrapper.le("age", 18)。between:介于两个值之间,例如wrapper.between("age", 18, 30)。notBetween:不介于两个值之间,例如wrapper.notBetween("age", 18, 30)。like:模糊匹配,例如wrapper.like("name", "%zhangsan%")。notLike:不模糊匹配,例如wrapper.notLike("name", "%zhangsan%")。likeLeft:左模糊匹配,例如wrapper.likeLeft("name", "zhangsan%")。likeRight:右模糊匹配,例如wrapper.likeRight("name", "%zhangsan")。isNull:字段值为null,例如wrapper.isNull("name")。isNotNull:字段值不为null,例如wrapper.isNotNull("name")。in:字段值在指定集合中,例如wrapper.in("name", "zhangsan", "Tom")。notIn:字段值不在指定集合中,例如wrapper.notIn("name", "zhangsan", "Tom")。
逻辑组合方法:
and:添加一个AND条件,例如wrapper.and(wq -> wq.eq("name", "zhangsan"))。or:添加一个OR条件,例如wrapper.or(wq -> wq.eq("name", "zhangsan"))。
SQL片段方法:
apply:添加自定义SQL片段,例如wrapper.apply("name = {0}", "zhangsan")。last:添加自定义SQL片段到末尾,例如wrapper.last("order by name")。
子查询方法:
inSql:子查询IN条件,例如wrapper.inSql("name", "select name from user where age > 21")。notInSql:子查询NOT IN条件,例如wrapper.notInSql("name", "select name from user where age > 21")。
分组与排序方法:
groupBy:分组,例如wrapper.groupBy("name")。orderByAsc:升序排序,例如wrapper.orderByAsc("age")。orderByDesc:降序排序,例如wrapper.orderByDesc("age")。
其他方法:
exists:存在条件,例如wrapper.exists("select * from user where name = {0}", "zhangsan")。notExists:不存在条件,例如wrapper.notExists("select * from user where name = {0}", "zhangsan")。set:更新操作时设置字段值,例如updateWrapper.set("name", "zhangsan")。having(String column, Object val): HAVING 过滤条件,用于聚合后的过滤,例如
queryWrapper.select("name", "age")
.groupBy("age")
.having("count(id) > 1");
以上方法提供了构建查询和更新条件的灵活性和强大功能,使得MyBatis-Plus在数据库操作方面更加高效和安全。
MyBatis-Plus条件构造器:构建安全、高效的数据库查询的更多相关文章
- MyBatis:条件构造器QueryWrapper方法详解
QueryWrapper 说明: 继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaQueryWrapper, 可以通过 n ...
- Mybatis-Plus - 条件构造器 QueryWrapper 的使用
目录 前言 查询示例 基础代码 QueryWrapper 的基本使用 QueryWrapper 的lambada写法 LambadaQueryWrapper 的使用 LambdaQueryChainW ...
- python 数据库查询条件`不等于`
1.python 数据库查询条件不等于 当在做数据库查询的时候,想根据业务需求进行条件的筛选或过滤, 但是django封装的数据库语句中没有 '不等于' 查询操作. 2.例如:通过以下语句进行'不等于 ...
- MyBatis:MyBatis-Plus条件构造器EntityWrapper
EntityWrapper 简介 1. MybatisPlus 通过 EntityWrapper(简称 EW,MybatisPlus 封装的一个查询条件构造器)或者 Condition(与 EW 类似 ...
- mybatis plus的条件构造器
我们在使用条件构造器的时候要使用QueryWrapper或者UpdateWrapper来充当条件语句来进行构造 QueryWrapper(LambdaQueryWrapper) 和 UpdateWra ...
- MyBatisPlus性能分析插件,条件构造器,代码自动生成器详解
性能分析插件 我们在平时的开发中,会遇到一些慢sql,测试,druid MP(MyBatisPlus)也提供性能分析插件,如果超过这个时间就停止 不过官方在3.2版本的时候取消了,原因如下 条件构造器 ...
- Java-MyBatis:MyBatis 3 | SQL 语句构建器类
ylbtech-Java-MyBatis:MyBatis 3 | SQL 语句构建器类 1.返回顶部 1. SQL语句构建器类 问题 Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL ...
- 小书MybatisPlus第2篇-条件构造器的应用及总结
一.条件构造器Wrapper Mybatis Plus为我们提供了如下的一些条件构造器,我们可以利用它们实现查询条件.删除条件.更新条件的构造. 条件构造器用于给如下的Mapper方法传参,通常情况下 ...
- MyBatis 判断条件为等于的问题
在用MyBatis操作数据库的时候相信很多人都用到,当在判断null, 大于,大于等于,小于,小于等于,不等于时估计很多都用到,比较容易实现了,这里就省略了,但唯独判断条件为等于时估计蛮多人遇到坑了, ...
- Mybatis多条件查询
在Mybatis多条件查询中: 1.参数如果是多条件,则需要将将添加到Map集合中进行传入. 2.就是将其参数用有序数字进行代替. Mybatis单个String类型参数传递 mysql文如下,传入参 ...
随机推荐
- 5. RCC
- Python3.11二进制AI项目程序打包为苹果Mac App(DMG)-应用程序pyinstaller制作流程(AppleSilicon)
众所周知,苹果MacOs系统虽然贵为Unix内核系统,但由于系统不支持N卡,所以如果想在本地跑AI项目,还需要对相关的AI模块进行定制化操作,本次我们演示一下如何将基于Python3.11的AI项目程 ...
- Devexpress GridView使用技巧
1.表格数据根据前面列的值展示不同的值 例子:根据检测类型(定量.定性)展示,定性展示合格与不合格,定量展示实际值 实现如下: 1.使用 表格CustomColumnDisplayText事件 //需 ...
- 小程序bindinput和bindblur赋值延迟问题解决
小程序bindinput和bindblur赋值延迟问题解决 问题链接:https://developers.weixin.qq.com/community/develop/doc/000a0ebdc4 ...
- CSS – Clip Path
前言 我是在搞 1 side box-shadow 发现这个功能的. 平常很少做特效, 所以对这个好功能缺乏认识. 这篇大概记入一下先, 以后有认真用再补上细节. 参考 Youtube – Aweso ...
- Naming Conversion & Case Style 命名规范
前言 写代码有 2 个点很重要 第一是表达 (不要词不达意) 要达到这点, 就要多参考其它人如何表达. 第二是一致性 (一样的东西就用一样的写法) 要达到这点就要建立规范 以前的笔记 命名规范 nam ...
- tailwindcss 3.3.3(完成入门,需要补充每个单独样式)
归纳 修饰符堆叠 <button class="dark:md:hover:bg-fuchsia-600"> 以下为修饰符 伪类伪元素 使用方法: 在实用程序类前添加h ...
- Spring —— 注解开发(总结)
XML配置与注解配置对比
- YAML 文件基本语法格式(十四)
一.YAML 文件基本语法格式 前面我们得 Kubernetes 集群已经搭建成功了,现在我们就可以在集群里面来跑我们的应用了.要在集群里面运行我们自己的应用,首先我们需要知道几个概念. 第一个当然就 ...
- .Net技术栈
一.后端 1. 框架 C# 异步多线程 委托 事件 标准事件模式 泛型 特性 反射 Linq Lambda Expression表达式树 PLinq IO文件操作 XML操作 .Net IOC/DI依 ...