一、关于条件构造器(Wrapper)

1.1 简介

MyBatis-Plus 提供了一套强大的条件构造器(Wrapper),用于构建复杂的数据库查询条件。Wrapper 类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的 SQL 语句,从而提高开发效率并减少 SQL 注入的风险。

1.2 发展

  1. 核心功能的发展

    • 从早期的MyBatis-Plus版本开始,条件构造器(Wrapper)就已经作为核心功能之一,用于构建复杂的数据库查询条件。随着版本的迭代,条件构造器的功能不断增强,提供了更多的方法来支持各种查询操作,如eq​(等于)、ne​(不等于)、gt​(大于)、lt​(小于)等。
  2. 链式调用的优化

    • 条件构造器支持链式调用,这使得代码更加简洁和易读。随着MyBatis-Plus的发展,链式调用的流畅性和易用性得到了进一步的优化,使得开发者可以更加方便地构建复杂的查询条件。
  3. Lambda表达式的引入

    • 随着Java 8的普及,MyBatis-Plus引入了基于Lambda表达式的条件构造器,如LambdaQueryWrapper​和LambdaUpdateWrapper​,这使得开发者可以使用更加现代的编程方式来构建查询和更新条件,提高了代码的可读性和安全性。
  4. 功能扩展

    • MyBatis-Plus条件构造器的功能不断扩展,新增了许多方法,如eqSql​、gtSql​、geSql​、ltSql​、leSql​等,这些方法允许开发者直接在条件构造器中嵌入SQL片段,提供了更高的灵活性。
  5. 性能优化

    • 随着MyBatis-Plus的发展,条件构造器在性能上也得到了优化。通过减少不必要的SQL拼接和优化条件构造逻辑,提高了查询的效率。
  6. 易用性的提升

    • MyBatis-Plus不断改进条件构造器的易用性,例如通过提供更多的方法来支持不同的查询场景,如groupBy​、orderBy​、having​等,使得开发者可以更加方便地构建复杂的查询条件。

1.3 特点

MyBatis-Plus的条件构造器具有以下特点:

  1. 链式调用:Wrapper类允许开发者以链式调用的方式构造查询条件,无需编写繁琐的SQL语句,从而提高开发效率。
  2. 安全性:通过使用Wrapper,可以避免直接拼接SQL片段,减少SQL注入的风险。
  3. 灵活性:支持多种查询操作,如等于、不等于、大于、小于等,以及逻辑组合如and​和or​。
  4. Lambda表达式:LambdaQueryWrapper和LambdaUpdateWrapper通过Lambda表达式引用实体类的属性,避免了硬编码字段名,提高了代码的可读性和可维护性。
  5. 减少代码量:Wrappers类作为一个静态工厂类,可以快速创建Wrapper实例,减少代码量,提高开发效率。
  6. 线程安全性:Wrapper实例不是线程安全的,建议每次使用时创建新的Wrapper实例,以避免多线程环境下的数据竞争和潜在错误。
  7. 支持复杂查询:支持嵌套查询和自定义SQL片段,通过nested​和apply​方法,可以构建更复杂的查询条件。
  8. 类型处理器:在Wrapper中可以使用TypeHandler处理特殊的数据类型,增强了对数据库类型的支持。
  9. 更新操作简化:使用UpdateWrapper或LambdaUpdateWrapper时,可以省略实体对象,直接在Wrapper中设置更新字段。

1.4 主要类型

MyBatis-Plus 提供了多种条件构造器,以满足不同的查询需求:

  1. QueryWrapper<T> :用于构建查询条件,支持链式调用,可以非常方便地添加各种查询条件。
  2. UpdateWrapper<T> :用于构建更新条件,支持链式调用,可以方便地添加各种更新条件。
  3. LambdaQueryWrapper<T> :使用 Lambda 表达式来构建查询条件,避免了字段名错误的问题,增强了代码的可读性和健壮性。
  4. LambdaUpdateWrapper<T> :使用 Lambda 表达式来构建更新条件,同样可以避免字段名错误的问题。
  5. 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类方法汇总:

  1. 基本条件方法

    • 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")​。
  2. 逻辑组合方法

    • and​:添加一个AND条件,例如 wrapper.and(wq -> wq.eq("name", "zhangsan"))​。
    • or​:添加一个OR条件,例如 wrapper.or(wq -> wq.eq("name", "zhangsan"))​。
  3. SQL片段方法

    • apply​:添加自定义SQL片段,例如 wrapper.apply("name = {0}", "zhangsan")​。
    • last​:添加自定义SQL片段到末尾,例如 wrapper.last("order by name")​。
  4. 子查询方法

    • 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")​。
  5. 分组与排序方法

    • groupBy​:分组,例如 wrapper.groupBy("name")​。
    • orderByAsc​:升序排序,例如 wrapper.orderByAsc("age")​。
    • orderByDesc​:降序排序,例如 wrapper.orderByDesc("age")​。
  6. 其他方法

    • 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条件构造器:构建安全、高效的数据库查询的更多相关文章

  1. MyBatis:条件构造器QueryWrapper方法详解

    QueryWrapper 说明:      继承自 AbstractWrapper ,自身的内部属性 entity 也用于生成 where 条件及 LambdaQueryWrapper, 可以通过 n ...

  2. Mybatis-Plus - 条件构造器 QueryWrapper 的使用

    目录 前言 查询示例 基础代码 QueryWrapper 的基本使用 QueryWrapper 的lambada写法 LambadaQueryWrapper 的使用 LambdaQueryChainW ...

  3. python 数据库查询条件`不等于`

    1.python 数据库查询条件不等于 当在做数据库查询的时候,想根据业务需求进行条件的筛选或过滤, 但是django封装的数据库语句中没有 '不等于' 查询操作. 2.例如:通过以下语句进行'不等于 ...

  4. MyBatis:MyBatis-Plus条件构造器EntityWrapper

    EntityWrapper 简介 1. MybatisPlus 通过 EntityWrapper(简称 EW,MybatisPlus 封装的一个查询条件构造器)或者 Condition(与 EW 类似 ...

  5. mybatis plus的条件构造器

    我们在使用条件构造器的时候要使用QueryWrapper或者UpdateWrapper来充当条件语句来进行构造 QueryWrapper(LambdaQueryWrapper) 和 UpdateWra ...

  6. MyBatisPlus性能分析插件,条件构造器,代码自动生成器详解

    性能分析插件 我们在平时的开发中,会遇到一些慢sql,测试,druid MP(MyBatisPlus)也提供性能分析插件,如果超过这个时间就停止 不过官方在3.2版本的时候取消了,原因如下 条件构造器 ...

  7. Java-MyBatis:MyBatis 3 | SQL 语句构建器类

    ylbtech-Java-MyBatis:MyBatis 3 | SQL 语句构建器类 1.返回顶部 1. SQL语句构建器类 问题 Java程序员面对的最痛苦的事情之一就是在Java代码中嵌入SQL ...

  8. 小书MybatisPlus第2篇-条件构造器的应用及总结

    一.条件构造器Wrapper Mybatis Plus为我们提供了如下的一些条件构造器,我们可以利用它们实现查询条件.删除条件.更新条件的构造. 条件构造器用于给如下的Mapper方法传参,通常情况下 ...

  9. MyBatis 判断条件为等于的问题

    在用MyBatis操作数据库的时候相信很多人都用到,当在判断null, 大于,大于等于,小于,小于等于,不等于时估计很多都用到,比较容易实现了,这里就省略了,但唯独判断条件为等于时估计蛮多人遇到坑了, ...

  10. Mybatis多条件查询

    在Mybatis多条件查询中: 1.参数如果是多条件,则需要将将添加到Map集合中进行传入. 2.就是将其参数用有序数字进行代替. Mybatis单个String类型参数传递 mysql文如下,传入参 ...

随机推荐

  1. c++高效位运算函数之 __builtin_

    https://www.cnblogs.com/tldr/p/11288935.html int __builtin_ffs (unsigned int x) 返回x的最后一位1的是从后向前第几位,比 ...

  2. Python开发中,日期时间的相关处理

    在Python开发中,日期和时间处理是一个常见的需求.Python提供了多种模块和方法来处理日期和时间,以下是一些常用的模块和操作.通过介绍一些系统的Python类库以及第三方的类库,我们可以快速的实 ...

  3. 后缀数组--SA--字符串

    SA (Suffix Array) -- 后缀数组 简介 这里明白两个定义: \(SA_i\) : 按字典序排列后大小为 \(i\) 的后缀的后缀头的下标. \(Rank_i\) : 后缀头的下标为 ...

  4. Typora 上传到 Github 实现笔记同步管理

    首先在 Github 上 new 一个 repository ,我建的名称是 md_notes 然后在本地 terminal 中启动以下命令新建一个 ssh key  ssh-keygen -o 生成 ...

  5. Mac 使用 Caps Lock 键切换输入法失灵问题解决

    Mac 上的 Caps Lock 键对于多语言用户来说,除了切换输入大小写的作用外还承担着切换输入法的功能.正常情况下,轻按一下 Caps Lock 键是切换输入法,长按是切换输入大小写.然而有时这个 ...

  6. Element Plus使用

    目录 Element Plus快速入门 常用组件 Element:是饿了么团队研发的,基于 Vue 3,面向设计师和开发者的组件库. 组件:组成网页的部件,例如 超链接.按钮.图片.表格.表单.分页条 ...

  7. php自定义函数访问其他地方定义的变量

    新捣鼓php,很多地方有.net的思维好难改过来. 在Connection/config.php 自定义了数据库连接字符串 然后在外部页面,自定义了一个function,对数据库进行操作 然后死活都给 ...

  8. sicp每日一题[1.44]

    Exercise 1.44 The idea of smoothing a function is an important concept in signal processing. If f is ...

  9. vue3 modifier

    vue3 modifier 是什么? modifier 中文意思为修饰符. 在vue3中主要是体现在v-model上,vue3允许我们添加自定义修饰符. 比如说这样: <template> ...

  10. CCIA数安委等组织发起“个人信息保护影响评估专题工作”,合合信息首批入选试点

    近期,"个人信息保护影响评估专题工作"(简称"PIA专题工作")试点评估结果正式发布.PIA专题工作组由中国电子技术标准化研究院.中国信息通信院等单位的法律与技 ...