Spring Boot 集成 MyBatis-Plus 详解

MyBatis-Plus 是 MyBatis 的增强版,提供了开箱即用的 CRUD 操作、条件构造器、分页插件等功能,简化了开发工作,提升了生产力。通过将 MyBatis-Plus 集成到 Spring Boot 中,开发者可以轻松构建高效、简洁的数据库访问层。


1. 项目依赖配置

在 Spring Boot 项目中集成 MyBatis-Plus 需要添加相关的依赖。MyBatis-Plus 提供了一个 spring-boot-starter 来简化配置过程。

1.1 添加 Maven 依赖

pom.xml 中添加如下依赖:

<dependencies>
    <!-- Spring Boot Starter Web -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <!-- MyBatis-Plus Spring Boot Starter -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.1</version>
    </dependency>

    <!-- MySQL Connector -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>

    <!-- Lombok(可选,用于简化实体类代码) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <scope>provided</scope>
    </dependency>
</dependencies>
  • mybatis-plus-boot-starter:MyBatis-Plus 与 Spring Boot 的集成 starter,简化了 MyBatis-Plus 的配置。
  • mysql-connector-java:MySQL 数据库驱动。
1.2 配置数据库连接信息

src/main/resources/application.yml 中配置数据库连接信息:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydb
    username: root
    password: password
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  mapper-locations: classpath:mapper/*.xml  # XML 配置文件路径
  type-aliases-package: com.example.demo.model  # 实体类包路径
  • datasource:数据库连接相关信息。
  • mapper-locations:MyBatis Mapper XML 文件的路径。
  • type-aliases-package:实体类所在包,简化 MyBatis-Plus 的类型映射。

2. MyBatis-Plus 基础配置

在 MyBatis-Plus 中,通常需要定义实体类、Mapper 接口和相应的 XML 文件(可选)。

2.1 创建实体类

假设有一个 User 表,包含 idusernameemail 字段。首先创建对应的 User 实体类:

import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.IdType;
import lombok.Data;

@Data
public class User {

    @TableId(type = IdType.AUTO)  // 指定主键生成策略为自增
    private Integer id;

    private String username;

    private String email;
}
  • @TableId:指定主键及其生成策略,IdType.AUTO 表示使用数据库的自增主键。
2.2 创建 Mapper 接口

MyBatis-Plus 通过继承 BaseMapper 接口提供了基础的 CRUD 功能,开发者只需定义实体类对应的 Mapper 接口。

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.model.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
}
  • BaseMapper:提供了通用的 CRUD 操作,支持 insertupdatedeleteselect 等基本功能。
  • @Mapper:标识为 MyBatis Mapper,Spring Boot 会自动扫描并注入。
2.3 测试 CRUD 操作

为了测试基础的 CRUD 操作,我们创建一个简单的服务类和控制器。

服务类
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {

    public List<User> getAllUsers() {
        return list();
    }

    public User getUserById(int id) {
        return getById(id);
    }

    public void createUser(User user) {
        save(user);
    }

    public void updateUser(User user) {
        updateById(user);
    }

    public void deleteUser(int id) {
        removeById(id);
    }
}
控制器
import com.example.demo.model.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/users")
public class UserController {

    @Autowired
    private UserService userService;

    @GetMapping
    public List<User> getAllUsers() {
        return userService.getAllUsers();
    }

    @GetMapping("/{id}")
    public User getUserById(@PathVariable int id) {
        return userService.getUserById(id);
    }

    @PostMapping
    public void createUser(@RequestBody User user) {
        userService.createUser(user);
    }

    @PutMapping("/{id}")
    public void updateUser(@PathVariable int id, @RequestBody User user) {
        user.setId(id);
        userService.updateUser(user);
    }

    @DeleteMapping("/{id}")
    public void deleteUser(@PathVariable int id) {
        userService.deleteUser(id);
    }
}

通过该控制器,可以通过 RESTful API 测试基本的 CRUD 操作。


3. 复杂查询与条件构造器

MyBatis-Plus 提供了 Wrapper 条件构造器来简化复杂查询的实现,QueryWrapper 用于构建查询条件,UpdateWrapper 用于构建更新条件。

3.1 使用 QueryWrapper 进行条件查询
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
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> findUsersByCondition(String username, String email) {
        QueryWrapper<User> queryWrapper = new QueryWrapper<>();
        queryWrapper.eq(username != null, "username", username)
                    .like(email != null, "email", email);
        return userMapper.selectList(queryWrapper);
    }
}
  • eq:等值条件。
  • like:模糊匹配。

该查询方法可以根据传入的条件动态生成 SQL 查询。

3.2 使用 UpdateWrapper 进行条件更新
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;

public void updateUserEmail(Integer id, String email) {
    UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
    updateWrapper.eq("id", id).set("email", email);
    userMapper.update(null, updateWrapper);
}
  • set:指定要更新的字段。
  • eq:条件匹配。

该方法根据 id 更新用户的 email 字段。


4. 分页功能

MyBatis-Plus 提供了内置的分页插件,简化了分页查询操作。首先,需要在项目中配置分页插件。

4.1 配置分页插件

MyBatisPlusConfig 配置类中启用分页插件:

import com.baomidou.mybatisplus.extension.plugins.PaginationInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}
4.2 使用分页功能

在服务层使用分页功能:

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.demo.mapper.UserMapper;
import com.example.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

@Service
public class UserService {

    @Autowired
    private UserMapper userMapper;

    public Page<User> getUsersWithPagination(int pageNum, int pageSize) {
        Page<User> page = new Page<>(pageNum, pageSize);
        return userMapper.selectPage(page, null);
    }
}

在控制器中调用分页查询:

@GetMapping("/page")
public Page<User> getUsersWithPagination(@RequestParam int pageNum, @RequestParam int pageSize) {
    return userService.getUsersWithPagination(pageNum, pageSize);
}
  • Page<T>:MyBatis-Plus 提供的分页对象

,用于封装分页结果。


5. MyBatis-Plus 常用功能总结

  • 自动填充:通过 @TableField(fill = ...)MetaObjectHandler 实现插入和更新时的字段自动填充。
  • 逻辑删除:通过 @TableLogic 实现逻辑删除。
  • 乐观锁:通过 @Version 实现并发时的乐观锁机制。
  • 批量操作:MyBatis-Plus 支持批量插入、更新操作,提升性能。

6. 总结

MyBatis-Plus 的集成和使用在 Spring Boot 项目中非常简单。通过 mybatis-plus-boot-starter,开发者可以轻松构建基础的 CRUD 操作,并利用 MyBatis-Plus 提供的查询构造器、分页插件等功能,快速处理复杂的业务需求。

  • 基础 CRUD:通过继承 BaseMapper,可以直接调用常用的数据库操作方法。
  • 复杂查询:利用 QueryWrapperUpdateWrapper,实现灵活的条件查询和更新。
  • 分页功能:通过 MyBatis-Plus 的分页插件,轻松实现分页查询。
  • 事务管理:MyBatis-Plus 也完全支持 Spring 的事务管理,开发者可以使用 @Transactional 注解管理事务。
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐