MyBatis-Plus 是一个基于 MyBatis 的增强工具,它提供了一套方便的注解方式来进行 SQL 查询。其中,它结合了条件构造器(Wrapper)和自定义 SQL 片段来构建查询语句。
官网:条件构造器 | MyBatis-Plus
需要
mybatis-plus
版本 >=3.0.7
假设我们有一个名为"Order"的表,包含"orderId"和"amount"两列:
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;
}
现在,我们要查询某个用户在指定时间范围内的订单金额总和。可以按照以下方式编写代码:
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 {
@Select("select sum(amount) from `order` ${ew.customSqlSegment}")
BigDecimal queryTotalAmountByUserAndDate(@Param(Constants.WRAPPER) LambdaQueryWrapper wrapper);
}
在上述代码中,我们定义了一个接口OrderMapper
,继承自BaseMapper
,并添加了一个方法queryTotalAmountByUserAndDate
用于查询订单金额总和。LambdaQueryWrapper
用于构建查询条件。
接下来,在你的业务逻辑代码中,可以按照以下方式使用该方法:
import java.math.BigDecimal;
import java.time.LocalDateTime;
// ...
private BigDecimal queryTotalAmountByUserAndDate(Long userId, LocalDateTime begin, LocalDateTime end) {
LambdaQueryWrapper wrapper = new LambdaQueryWrapper()
.eq(Order::getUserId, userId)
.between(Order::getCreateTime, begin, end);
BigDecimal totalAmount = orderMapper.queryTotalAmountByUserAndDate(wrapper);
return totalAmount == null ? BigDecimal.ZERO : totalAmount;
}
在上述代码中,我们创建了一个LambdaQueryWrapper
对象,并使用eq
方法和between
方法分别指定了用户ID和时间范围的条件。
然后,我们调用queryTotalAmountByUserAndDate
方法,并传入该wrapper
对象进行查询。最后,根据查询结果判断并返回订单金额总和。
(1)当使用SQL和Wrapper结合进行查询时,SQL用于编写具体的SQL语句,而Wrapper用于构建查询条件。
(2)SQL语句中的${ew.customSqlSegment}
会被Wrapper对象中的条件替换,从而形成最终的SQL查询语句。Wrapper对象中的条件会根据具体的方法调用来生成相应的SQL片段,并替换${ew.customSqlSegment}
。
在示例中:
我们使用了
LambdaQueryWrapper
作为Wrapper对象,它提供了一系列方法来构建查询条件,如eq
、between
等。同时,我们在SQL语句中使用了
sum(amount)
来求和,这个部分是纯粹的SQL语法。最后,通过调用
queryTotalAmountByUserAndDate
方法,我们将Wrapper对象传递给Mapper接口的查询方法,并使用${ew.customSqlSegment}
将Wrapper中的条件注入到SQL语句中。执行查询后,得到的结果会返回给调用方。
(3)综上所述,SQL和Wrapper的结合使用,可以通过Wrapper构建查询条件,然后将条件注入到SQL语句中,从而实现灵活的查询操作。
因为,MyBatis-Plus并没有直接提供对于SUM求和的方法。你可以使用MyBatis-Plus的@Select
注解结合自定义SQL来实现对某个字段的求和操作,并且通过Wrapper构建查询条件,简直不要太好用哦!!!