MyBatis-Plus
是一个非常流行的 MyBatis 增强工具,提供了很多简化查询和操作的方法。apply
是其中一个非常有用的方法,它允许您直接添加原生 SQL 片段到查询条件中。这个功能通常用于需要构建复杂查询的场景。
apply
方法的概述
apply
方法主要用于在 QueryWrapper
或 LambdaQueryWrapper
中,自定义添加一个原生 SQL 片段到查询条件中,并且可以通过占位符进行参数化。
示例代码
下面是一些常见的使用示例,展示了 apply
方法的多种应用场景:
基本用法
-
基本用法:直接添加
SQL
片段,不带参数化占位符。// 假设此变量是您的Mapper对象 UserMapper userMapper = ...; QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.apply("date(created_at) = '2023-10-01'"); List<User> users = userMapper.selectList(queryWrapper);
-
带参数化占位符:使用占位符传递参数,防止 SQL 注入。
QueryWrapper<User> queryWrapper = new QueryWrapper<>(); String dateParam = "2023-10-01"; queryWrapper.apply("date(created_at) = {0}", dateParam); List<User> users = userMapper.selectList(queryWrapper);
-
结合其他条件:可以与其他查询条件结合使用。
QueryWrapper<User> queryWrapper = new QueryWrapper<>(); String startDate = "2023-10-01"; String endDate = "2023-10-31"; queryWrapper .ge("age", 18) // 年龄大于等于18 .apply("date(created_at) BETWEEN {0} AND {1}", startDate, endDate); List<User> users = userMapper.selectList(queryWrapper);
LambdaQueryWrapper 用法
- Lambda 表达式:使用
LambdaQueryWrapper
时可以提供一种更类型安全的方式传递字段。LambdaQueryWrapper<User> lambdaQuery = new LambdaQueryWrapper<>(); lambdaQuery.apply("date(created_at) = {0}", dateParam); List<User> users = userMapper.selectList(lambdaQuery);
示例中的实体类和Mapper接口
假设有一个实体类 User
和对应的 Mapper 接口 UserMapper
:
User
实体类
public class User {
private Long id;
private String name;
private Integer age;
private Date createdAt;
// Getters and Setters
}
UserMapper
接口
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserMapper extends BaseMapper<User> {
}
复杂查询示例
在实际应用中,apply
方法可以用于构建更加复杂的查询条件,比如多表联查、自定义复杂的过滤条件等。以下示例展示了如何在多表联查中使用 apply
:
多表联查示例
假设我们有另外一个表 Order
,需要查询用户及其最近的一笔订单信息:
public class Order {
private Long id;
private Long userId;
private Date orderDate;
private BigDecimal amount;
// Getters and Setters
}
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface OrderMapper extends BaseMapper<Order> {
}
复杂查询示例
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import java.util.List;
public class UserService {
private final UserMapper userMapper;
private final OrderMapper orderMapper;
public UserService(UserMapper userMapper, OrderMapper orderMapper) {
this.userMapper = userMapper;
this.orderMapper = orderMapper;
}
public List<User> getUsersWithRecentOrders() {
QueryWrapper<User> queryWrapper = Wrappers.query();
queryWrapper.apply("EXISTS (SELECT 1 FROM orders o WHERE o.user_id = user.id AND o.order_date = " +
"(SELECT MAX(order_date) FROM orders WHERE user_id = o.user_id))");
return userMapper.selectList(queryWrapper);
}
}
总结
通过以上示例,可以看出 apply
方法在 MyBatis-Plus
中非常强大,提供了直接插入原生 SQL 片段的能力,这让开发者在构建复杂的查询条件时更加灵活。同时,使用参数化查询可以有效防止 SQL 注入问题,保证查询的安全性。在实际开发中,根据具体需求,可以结合其他条件构造方法灵活使用 apply
方法,构建各种复杂查询。