mybatisPlus中apply的使用以进行联表等复杂sql语句详解

 更新时间:2025年03月06日 09:35:45   作者:R-sz  
在MyBatis-Plus中,`apply()`方法可以用于添加任意的SQL片段,包括联表查询,使用`apply()`方法的好处是可以直接添加原生的SQL片段,而不受MyBatis-Plus提供的常规查询条件构建方法的限制,但是,使用`apply()`方法需要注意安全性和性能问题

mybatisPlus apply使用进行联表等复杂sql语句

在 MyBatis-Plus 中,`apply()` 方法可以用于添加任意的 SQL 片段,包括联表查询。因此,你可以使用 `apply()` 方法来处理各种类型的联表查询。

使用 apply()方法的好处

是可以在查询条件中直接添加原生的 SQL 片段,而不受 MyBatis-Plus 提供的常规查询条件构建方法的限制。这使得你可以更灵活地构建复杂的联表查询语句,满足特定的查询需求。

但是需要注意的是:

  • 使用 `apply()` 方法需要谨慎处理。
  • 由于 `apply()` 方法允许添加原生的 SQL 片段,这可能导致 SQL 注入等安全问题。
  • 为了避免潜在的安全风险,需要确保你添加的 SQL 片段是可信的,并且进行合适的参数化处理。

另外,使用 `apply()` 方法可能会导致查询性能下降,特别是在处理大量数据时。如果可能,建议优先考虑使用 MyBatis-Plus 提供的常规查询条件构建方法,以充分利用框架的优化能力。

综上所述:

  • 虽然 `apply()` 方法可以用于处理各种联表查询
  • 但在使用时需要谨慎考虑安全性和性能方面的问题

比如我想左联三张表,最后以时间倒序排序,怎么写?

举例子

假设你有三张表:`user`、`order` 和 `product`,它们之间的关系是 `user` 表和 `order` 表通过 `user_id` 进行关联,`order` 表和 `product` 表通过 `product_id` 进行关联。

你想要进行左联三张表,并按照时间倒序排序。

你可以使用 `apply()` 方法添加原生的 SQL 片段,来构建这个查询。

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper
.select("user.*, order.*, product.*") // 选择需要的列
.apply("LEFT JOIN `order` ON `user`.id = `order`.user_id")
.apply("LEFT JOIN `product` ON `order`.product_id = `product`.id")
.orderByDesc("`order`.create_time");

List<User> userList = userMapper.selectList(queryWrapper);

在上述示例中:

我们创建了一个QueryWrapper对象,并使用apply()方法添加了两个左联操作的 SQL 片段。

  • select()方法用于选择需要返回的列,这里我们选择了 user.*、order.*和 product.*,即返回三张表的所有列。
  • orderByDesc()方法用于按照 `order` 表的 `create_time` 字段进行时间倒序排序。

最后,我们使用selectList()方法执行查询,并将结果存储在userList中。

请注意:

  • 在实际使用中,你需要根据表的实际结构和字段名进行相应的调整。
  • 同时,还要确保表名和字段名在 SQL 语句中使用反引号 ` 来包裹,以避免与 MySQL 的关键字冲突。

希望这个示例能够帮助你理解如何使用 `apply()` 方法进行左联查询,并按照时间倒序排序。

如果你想在联表查询中进行 GROUP BY 操作,并使用 HAVING 子句进行筛选,你可以使用 MyBatis-Plus 的 `groupBy()` 和 `having()` 方法来实现。

以下是一个示例:

假设你要对 `user` 表和 `order` 表进行联表查询,按照 `user_id` 进行分组,并筛选出总订单金额大于 1000 的用户:

QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
queryWrapper
.select("user.id, user.name, SUM(order.amount) AS total_amount")
.eq("order.status", "completed")
.groupBy("user.id")
.having("total_amount > 1000");

List<Map<String, Object>> resultList = orderMapper.selectMaps(queryWrapper);

在上述示例中:

我们创建了一个 QueryWrapper 对象,并使用 `select()` 方法选择需要返回的列,这里我们选择了 `user.id`、`user.name` 和 `SUM(order.amount) AS total_amount`,即返回用户的 ID、姓名和总订单金额。`eq()` 方法用于添加查询条件,这里我们筛选出 `order` 表中状态为 "completed" 的订单。`groupBy()` 方法用于指定按照 `user.id` 进行分组。`having()` 方法用于添加 HAVING 子句,这里我们筛选出总订单金额大于 1000 的用户。

最后,我们使用 selectMaps() 方法执行查询,并将结果存储在 `resultList` 中。`selectMaps()` 方法返回的是一个 List<Map<String, Object>>,每个 Map 对应一条记录,其中键是列名,值是对应的值。

请注意,在实际使用中,你需要根据表的实际结构和字段名进行相应的调整。

希望这个示例能够帮助你理解如何在联表查询中进行 GROUP BY 操作,并使用 HAVING 子句进行筛选。

在 MyBatis-Plus 中,`apply()` 和 `last()` 都是 QueryWrapper 类的方法,但它们的作用和使用场景有所不同。

  1. apply() 方法用于在查询条件中添加自定义的 SQL 片段。你可以使用 apply() 方法来添加原生的 SQL 片段,以满足特定的查询需求,例如联表查询、自定义的条件表达式等。
  2. last() 方法用于在查询语句的最后添加原生的 SQL 片段。你可以使用 last() 方法来添加原生的 SQL 片段,以在查询语句的最后位置添加自定义的 SQL 语句,例如排序、分页等。

下面是一个示例:

展示了 apply() 和 last() 方法的使用:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper
.apply("LEFT JOIN `order` ON `user`.id = `order`.user_id")
.last("ORDER BY `order`.create_time DESC");

List<User> userList = userMapper.selectList(queryWrapper);

在上述示例中:

  • 我们使用 apply() 方法添加了一个联表操作的 SQL 片段,将 user 表和 order 表进行左联。
  • 然后,使用 last() 方法在查询语句的最后添加了一个原生的 SQL 片段,指定了按照 order 表的 create_time 字段进行降序排序。

需要注意的是:

  • 使用 last() 方法需要谨慎处理,因为它直接将原生的 SQL 片段拼接到查询语句的最后,可能会导致 SQL 注入等安全问题。
  • 为了避免潜在的安全风险,需要确保添加的 SQL 片段是可信的,并进行合适的参数化处理。

综上所述:

  • apply() 方法用于添加自定义的 SQL 片段到查询条件中,而 last() 方法用于在查询语句的最后添加原生的 SQL 片段。
  • 它们分别用于不同的场景和目的。

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • Java中的包(Package)与导入(Import)示例详解

    Java中的包(Package)与导入(Import)示例详解

    这篇文章主要详细介绍了Java中的包(Package)和导入(Import)概念,包括包的定义、作用、JDK中主要的包、导入的目的与用法、特殊情况的导入、静态导入、包的访问权限和命名规范,文章通过丰富的解释和代码示例,帮助读者深入理解这些概念的实际应用,需要的朋友可以参考下
    2024-11-11
  • java设计模式-装饰者模式详解

    java设计模式-装饰者模式详解

    这篇文章主要介绍了Java设计模式之装饰者模式详解和代码实例,Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案,需要的朋友可以参考下
    2021-07-07
  • java之swing实现复选框的方法

    java之swing实现复选框的方法

    这篇文章主要介绍了java之swing实现复选框的方法,实例分析了java基于图形界面复选框的实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-09-09
  • SpringBoot集成LiteFlow工作流引擎的完整指南

    SpringBoot集成LiteFlow工作流引擎的完整指南

    LiteFlow作为一款国产轻量级规则引擎/流程引擎,以其零学习成本、高可扩展性和极致性能成为微服务架构下的理想选择,本文将详细讲解SpringBoot集成LiteFlow的全过程,助大家轻松驾驭轻量级流程编排
    2025-06-06
  • RocketMQ集群消费与广播消费模式

    RocketMQ集群消费与广播消费模式

    这篇文章主要介绍了RocketMQ集群消费与广播消费模式,消息队列RocketMQ版支持集群消费和广播消费,本文介绍集群消费和广播消费的基本概念、适用场景、功能差异、注意事项以及设置方式
    2023-02-02
  • spring IOC容器管理必须知道的一些操作(基于XML方式)

    spring IOC容器管理必须知道的一些操作(基于XML方式)

    Spring框架的核心是Spring容器,容器创建对象,将它们装配在一起,配置它们并管理它们的完整生命周期,下面这篇文章主要给大家介绍了关于spring IOC容器管理必须知道的一些操作,需要的朋友可以参考下
    2022-03-03
  • IDEA maven加载依赖失败不展示Dependencies项的解决方案

    IDEA maven加载依赖失败不展示Dependencies项的解决方案

    低版本Maven手动新建工程时,可能因pom.xml中dependencyManagement依赖未定义版本号导致依赖丢失,下面给大家介绍IDEA maven加载依赖失败不展示Dependencies项的解决方案,感兴趣的朋友一起看看吧
    2025-07-07
  • Spring Boot如何使用Undertow代替Tomcat

    Spring Boot如何使用Undertow代替Tomcat

    这篇文章主要介绍了Spring Boot如何使用Undertow代替Tomcat,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 在SpringBoot微服务中设置和管理多个数据库的代码示例

    在SpringBoot微服务中设置和管理多个数据库的代码示例

    在现代微服务架构中,通常需要与多个数据库交互的服务,这可能是由于各种原因,例如遗留系统集成、不同类型的数据存储需求,或者仅仅是为了优化性能,在本综合指南中,我们将探讨如何在 Spring Boot 微服务中设置和管理多个数据库连接,需要的朋友可以参考下
    2024-12-12
  • Mybatis-Plus自动填充更新操作相关字段的实现

    Mybatis-Plus自动填充更新操作相关字段的实现

    这篇文章主要介绍了Mybatis-Plus自动填充更新操作相关字段的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12

最新评论