使用 MyBatisPlus 的注解方式进行 SQL 查询,它结合了条件构造器(Wrapper)和自定义 SQL 片段来构建查询语句。

MyBatis-Plus 是一个基于 MyBatis 的增强工具,它提供了一套方便的注解方式来进行 SQL 查询。其中,它结合了条件构造器(Wrapper)和自定义 SQL 片段来构建查询语句。

官网:条件构造器 | MyBatis-Plus

1、使用 Wrapper 自定义SQL注意事项

需要mybatis-plus版本 >= 3.0.7

2、直接通过一个简单的示例进行讲解:

假设我们有一个名为"Order"的表,包含"orderId"和"amount"两列:

java 复制代码
import lombok.Data;
import java.math.BigDecimal;
import java.time.LocalDateTime;

@Data
public class Order {
    private Long orderId;
    private Long userId;
    private BigDecimal amount;
    private LocalDateTime createTime;
}

现在,我们要查询某个用户在指定时间范围内的订单金额总和。可以按照以下方式编写代码:

java 复制代码
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Select;
import org.apache.ibatis.reflection.Constants;

public interface OrderMapper extends BaseMapper<Order> {
    @Select("select sum(amount) from `order` ${ew.customSqlSegment}")
    BigDecimal queryTotalAmountByUserAndDate(@Param(Constants.WRAPPER) LambdaQueryWrapper<Order> wrapper);
}

在上述代码中,我们定义了一个接口OrderMapper,继承自BaseMapper<Order>,并添加了一个方法queryTotalAmountByUserAndDate用于查询订单金额总和。LambdaQueryWrapper<Order>用于构建查询条件。


接下来,在你的业务逻辑代码中,可以按照以下方式使用该方法:

java 复制代码
import java.math.BigDecimal;
import java.time.LocalDateTime;

// ...

private BigDecimal queryTotalAmountByUserAndDate(Long userId, LocalDateTime begin, LocalDateTime end) {
    LambdaQueryWrapper<Order> wrapper = new LambdaQueryWrapper<Order>()
            .eq(Order::getUserId, userId)
            .between(Order::getCreateTime, begin, end);
    BigDecimal totalAmount = orderMapper.queryTotalAmountByUserAndDate(wrapper);
    return totalAmount == null ? BigDecimal.ZERO : totalAmount;
}

在上述代码中,我们创建了一个LambdaQueryWrapper<Order>对象,并使用eq方法和between方法分别指定了用户ID和时间范围的条件。

然后,我们调用queryTotalAmountByUserAndDate方法,并传入该wrapper对象进行查询。最后,根据查询结果判断并返回订单金额总和。


3、具体分析二者是如何结合使用的

(1)当使用SQL和Wrapper结合进行查询时,SQL用于编写具体的SQL语句,而Wrapper用于构建查询条件。

(2)SQL语句中的${ew.customSqlSegment}会被Wrapper对象中的条件替换,从而形成最终的SQL查询语句。Wrapper对象中的条件会根据具体的方法调用来生成相应的SQL片段,并替换${ew.customSqlSegment}


在示例中:

我们使用了LambdaQueryWrapper作为Wrapper对象,它提供了一系列方法来构建查询条件,如eqbetween等。

同时,我们在SQL语句中使用了sum(amount)来求和,这个部分是纯粹的SQL语法。

最后,通过调用queryTotalAmountByUserAndDate方法,我们将**Wrapper对象传递给Mapper接口的查询方法,并使用${ew.customSqlSegment}将Wrapper中的条件注入到SQL语句中。**执行查询后,得到的结果会返回给调用方。

(3)综上所述,SQL和Wrapper的结合使用,可以通过Wrapper构建查询条件,然后将条件注入到SQL语句中,从而实现灵活的查询操作。


4、这样使用的原因

因为,MyBatis-Plus并没有直接提供对于SUM求和的方法。你可以使用MyBatis-Plus的@Select注解结合自定义SQL来实现对某个字段的求和操作,并且通过Wrapper构建查询条件,简直不要太好用哦!!!

相关推荐
老马952718 小时前
opencode7-桌面应用实战2
java·人工智能·后端
李白的天不白18 小时前
大规模请求数据并发问题
java·前端·数据库
智慧物业老杨18 小时前
智慧物业数智化转型实战:从工单响应到业主满意度的闭环构建
java·开发语言
Kiling_070418 小时前
Java集合框架:List集合详解与应用
java·开发语言·windows
极客先躯18 小时前
高级java每日一道面试题-2025年12月08日-实战篇[Docker]-如何为 Docker 配置代理?如何为容器配置代理?
java·docker·代理配置的双层架构·docker 守护进程配置代理·为容器配置代理·构建时环境变量·运行时注入环境变量
csdn2015_19 小时前
java springboot 文件导入,判断第一列的值是否有重复
java·windows·spring boot
Navicat中国19 小时前
AI 代码补全如何改变 DBA 编写 SQL 的方式
数据库·人工智能·sql·dba·navicat
~|Bernard|19 小时前
四,go语言中GMP调度模型
java·前端·golang
Tisfy19 小时前
LeetCode 2553.分割数组中数字的数位:模拟(maybe+翻转)——java也O(1)
java·数学·算法·leetcode·题解·模拟·取模
怪祝浙19 小时前
从简单项目入手Java(学生系统)V6(Web版本 Spring Boot3 MySQL Vue3 MyBatis)
java·spring boot·mysql