SpringBoot | 基于MyBatis-Plus实现Lambda Query查询

[复制链接]
发表于 2025-11-11 20:26:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
关注:CodingTechWork

弁言

  MyBatis-Plus 是 MyBatis 的增强工具,简化了数据库使用,并进步了开辟服从。它提供了多种查询方式,包罗通例的 SQL 查询、Lambda Query 查询、分页查询、条件查询等。在本篇博客中,我们将详细解说怎样使用 MyBatis-Plus 的各种查询方式,涵盖以下内容:

  • 根本环境设置
  • 表布局计划
  • 常见查询方法
  • 平凡查询
  • Lambda 查询
  • 条件构造器
  • 聚合查询
  • 分页查询
  • 复杂查询与多表联查
根本环境设置

  起首,你须要确保项目已经引入了 MyBatis-Plus 干系的依赖。假设你的项目是基于 Spring Boot 的,下面是怎样设置 Maven 依赖的示例。
依赖设置(Maven)
  1. <dependencies>
  2.     <!-- MyBatis-Plus Starter -->
  3.     <dependency>
  4.         <groupId>com.baomidou</groupId>
  5.         <artifactId>mybatis-plus-boot-starter</artifactId>
  6.         <version>3.5.0</version>
  7.     </dependency>
  8.     <!-- MySQL Connector -->
  9.     <dependency>
  10.         <groupId>mysql</groupId>
  11.         <artifactId>mysql-connector-java</artifactId>
  12.         <version>8.0.23</version>
  13.     </dependency>
  14.     <!-- Spring Boot Starter Web -->
  15.     <dependency>
  16.         <groupId>org.springframework.boot</groupId>
  17.         <artifactId>spring-boot-starter-web</artifactId>
  18.     </dependency>
  19. </dependencies>
复制代码
application.yml 设置
  1. spring:
  2.   datasource:
  3.     url: jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC
  4.     username: root
  5.     password: root
  6.     driver-class-name: com.mysql.cj.jdbc.Driver
  7.   mybatis-plus:
  8.     # 配置 MyBatis-Plus
  9.     mapper-locations: classpath:/mappers/*.xml
  10.     typeAliasesPackage: com.example.demo.entity
复制代码
表布局计划

假设有以下两个表:

  • demo_student:门生信息
  • demo_class:班级信息
demo_student 表布局
  1. CREATE TABLE demo_student (
  2.   id INT AUTO_INCREMENT PRIMARY KEY,
  3.   name VARCHAR(50) NOT NULL,
  4.   age INT,
  5.   class_id INT,
  6.   gender ENUM('M', 'F') DEFAULT 'M',
  7.   FOREIGN KEY (class_id) REFERENCES demo_class(id)
  8. );
复制代码
demo_student 表存储门生信息,此中 class_id 是外键,指向 demo_class 表。
demo_class 表布局
  1. CREATE TABLE demo_class (
  2.   id INT AUTO_INCREMENT PRIMARY KEY,
  3.   class_name VARCHAR(50) NOT NULL
  4. );
复制代码
常见查询方法

平凡查询(selectOne, selectList, selectById)


  • selectOne:查询单条记录。
  • selectList:查询多条记录。
  • selectById:通过主键查询一条记录。
  1. import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
  2. import com.baomidou.mybatisplus.extension.service.IService;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.stereotype.Service;
  5. import java.util.List;
  6. @Service
  7. public class DemoStudentService {
  8.     @Autowired
  9.     private DemoStudentMapper demoStudentMapper;
  10.     // 查询单个学生
  11.     public DemoStudent getStudentById(Long id) {
  12.         return demoStudentMapper.selectById(id);
  13.     }
  14.     // 查询所有学生
  15.     public List<DemoStudent> getAllStudents() {
  16.         return demoStudentMapper.selectList(new QueryWrapper<>());
  17.     }
  18. }
复制代码
Lambda Query 查询(LambdaQueryWrapper)

MyBatis-Plus 提供了 LambdaQueryWrapper,可以通过 Lambda 表达式来制止字段名硬编码。
  1. import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
  2. public List<DemoStudent> getStudentsByAge(int age) {
  3.     LambdaQueryWrapper<DemoStudent> queryWrapper = new LambdaQueryWrapper<>();
  4.     // 查询年龄大于指定值的学生
  5.     queryWrapper.gt(DemoStudent::getAge, age);  
  6.     return demoStudentMapper.selectList(queryWrapper);
  7. }
复制代码
条件构造器(QueryWrapper)

QueryWrapper 答应通过构建条件来查询。它支持 eq、ne、lt、gt、like 等各种条件。
  1. public List<DemoStudent> getStudentsByClassId(Long classId) {
  2.     QueryWrapper<DemoStudent> queryWrapper = new QueryWrapper<>();
  3.     // 根据班级ID查询
  4.     queryWrapper.eq("class_id", classId);  
  5.     return demoStudentMapper.selectList(queryWrapper);
  6. }
复制代码
条件链式查询

LambdaQueryWrapper 和QueryWrapper支持链式调用,可以将多个条件组合成一个查询。
  1. public List<DemoStudent> getFemaleStudentsOver18() {
  2.     LambdaQueryWrapper<DemoStudent> queryWrapper = new LambdaQueryWrapper<>();
  3.     queryWrapper.eq(DemoStudent::getGender, "F")
  4.                 .gt(DemoStudent::getAge, 18);  // 查找性别为女性,且年龄大于18岁的学生
  5.     return demoStudentMapper.selectList(queryWrapper);
  6. }
复制代码
聚合查询(selectCount, selectMax, selectMin 等)

MyBatis-Plus 支持根本的聚合查询,好比统计、求最大值、最小值、均匀值等。
  1. // 查询学生总数
  2. public int getTotalStudents() {
  3.     return demoStudentMapper.selectCount(new QueryWrapper<>());
  4. }
  5. // 查询年龄最大值
  6. public Integer getMaxAge() {
  7.     return demoStudentMapper.selectMax(DemoStudent::getAge);
  8. }
  9. // 查询年龄最小值
  10. public Integer getMinAge() {
  11.     return demoStudentMapper.selectMin(DemoStudent::getAge);
  12. }
复制代码
分页查询

分页查询在现实开辟中非经常见,MyBatis-Plus 提供了内置的分页功能,可以非常简朴地实现。
  1. import com.baomidou.mybatisplus.core.metadata.IPage;
  2. import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
  3. public IPage<DemoStudent> getStudentsPage(int pageNum, int pageSize) {
  4.     Page<DemoStudent> page = new Page<>(pageNum, pageSize);  // 创建分页对象
  5.     LambdaQueryWrapper<DemoStudent> queryWrapper = new LambdaQueryWrapper<>();
  6.     queryWrapper.gt(DemoStudent::getAge, 18);  // 查询年龄大于18的学生
  7.     return demoStudentMapper.selectPage(page, queryWrapper);  // 返回分页结果
  8. }
复制代码
分页插件设置

分页功能须要在 application.yml 中设置分页插件:
  1. mybatis-plus:
  2.   global-config:
  3.     db-config:
  4.       id-type: auto
  5.   configuration:
  6.     log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  7.   plugins:
  8.     - com.baomidou.mybatisplus.extension.plugins.pagination.PageInterceptor
复制代码
复杂查询与多表联查

在 MyBatis-Plus中,固然不直接支持JOIN使用,但我们可以通过自界说 SQL 来实现复杂的联表查询。
示例:查询门生和班级信息(联查)
  1. import org.apache.ibatis.annotations.Select;
  2. import java.util.List;
  3. public interface DemoStudentMapper {
  4.    
  5.     @Select("SELECT s.id AS student_id, s.name AS student_name, c.class_name " +
  6.             "FROM demo_student s LEFT JOIN demo_class c ON s.class_id = c.id")
  7.     List<StudentWithClass> selectStudentsWithClass();
  8. }
复制代码
实现自界说查询与复杂查询

对于一些须要自界说 SQL 的场景,可以直接使用 @Select 或 @Update 注解来编写 SQL。
  1. @Select("SELECT * FROM demo_student WHERE age > #{age} AND gender = #{gender}")
  2. List<DemoStudent> selectByAgeAndGender(int age, String gender);
复制代码
总结

  MyBatis-Plus提供了极为丰富的查询功能,通过简便的 API 和机动的查询构造器,可以非常方便地举行数据库查询使用。通过以下几点,可以更好地明白和应用 MyBatis-Plus 的查询功能:

  • 平凡查询:通过selectOne, selectList, selectById方法可以快速举行数据查询。
  • Lambda查询:通过LambdaQueryWrapper构建条件查询,制止硬编码字段名,进步代码可维护性。
  • 条件构造器:QueryWrapper和LambdaQueryWrapper提供了多种条件构建方式,支持链式调用。
  • 分页查询:MyBatis-Plus提供了内置的分页支持,可以轻松举行分页查询。
  • 聚合查询:支持常见的聚合使用,如selectCount, selectMax, selectMin等。
  • 复杂查询:通过自界说 SQL 支持联表查询,处置惩罚更复杂的查询需求。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表