MyBatis-Plus 是基于 MyBatis 的增强工具,提供了许多便捷的功能,如自动化 CRUD 操作、分页查询、性能分析等。虽然 MyBatis-Plus 提供了丰富的功能,但在一些复杂的业务逻辑中,开发者可能需要编写自定义 SQL 或进行复杂查询。本文将介绍 MyBatis-Plus 如何支持自定义 SQL 和复杂查询,并给出相关代码示例。
一、环境准备
首先,你需要在项目中引入 MyBatis-Plus 的依赖。以下是 Maven 的依赖配置:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.0</version> <!-- 请根据需要选择版本 -->
</dependency>
二、基础配置
接下来,我们要配置数据源和 MyBatis-Plus。通常在 application.yml
中进行配置:
mybatis-plus:
global-config:
db-config:
id-type: auto
configuration:
map-underscore-to-camel-case: true
三、实体类与映射接口
我们以一个简单的用户表 User
为例。首先,定义实体类和 Mapper 接口:
// User.java
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
@Data
@TableName("user")
public class User {
private Long id;
private String name;
private Integer age;
private String email;
}
// UserMapper.java
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface UserMapper extends BaseMapper<User> {
// 自定义方法可以在这里定义
}
四、自定义 SQL 查询
在实际项目中,常常需要执行一些复杂的 SQL 查询。你可以在 Mapper 接口中通过注解来实现自定义 SQL。例如,我们编写一个方法来统计每个年龄段的人数:
// UserMapper.java
import org.apache.ibatis.annotations.Select;
public interface UserMapper extends BaseMapper<User> {
@Select("SELECT age, COUNT(*) AS count FROM user GROUP BY age")
List<Map<String, Object>> countUsersByAge();
}
这个方法将会返回一个 List<Map<String, Object>>
,其中每个 Map
表示一个年龄段和对应的人数。
五、复杂查询示例
除了自定义 SQL 查询,MyBatis-Plus 还提供了一些内置方法,可以很方便地进行复杂查询。例如,我们要查询年龄大于某个值的用户,可以使用 LambdaQueryWrapper:
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public List<User> getUsersAboveAge(int age) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.gt(User::getAge, age); // 大于条件
return userMapper.selectList(queryWrapper);
}
}
六、结合多个条件查询
有时需要根据多个条件进行查询,比如查询名字以 "J" 开头且年龄大于 18 的用户。可以使用 or()
和 eq()
方法来实现:
public List<User> getUsersByNameAndAge(String namePrefix, int age) {
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.likeRight(User::getName, namePrefix)
.gt(User::getAge, age);
return userMapper.selectList(queryWrapper);
}
七、总结
MyBatis-Plus 提供了灵活的方式来执行自定义 SQL 和进行复杂查询。通过定义 Mapper 接口和使用 LambdaQueryWrapper,我们能够快速应对复杂的查询需求。在实际开发中,合理使用自定义 SQL 与 MyBatis-Plus 提供的功能,可以大大提高开发效率和代码的可维护性。希望本文对你理解 MyBatis-Plus 的自定义 SQL 和复杂查询有所帮助。