在 Spring Boot 中使用 MyBatis-Plus 的详细教程

发布于:2025-06-30 ⋅ 阅读:(16) ⋅ 点赞:(0)

前言

在现代的 Java Web 开发中,Spring Boot 和 MyBatis 已经成为主流框架组合。为了提升开发效率和简化数据库操作,MyBatis-Plus(简称 MP)应运而生。它是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。

本文将详细介绍如何在 Spring Boot 项目中集成并使用 MyBatis-Plus,包括:

  • 环境搭建
  • 基本 CRUD 操作
  • 使用 Wrapper 构造查询条件
  • 注解的使用(如 @TableName@TableId@TableField
  • 分页插件配置
  • 多表关联查询示例

一、环境准备

1. 创建 Spring Boot 项目

你可以使用 Spring Initializr 创建一个基础项目,选择以下依赖:

  • Spring Web
  • MyBatis Framework
  • MySQL Driver

或者使用 IDEA 或 Eclipse 插件创建。

2. 添加 MyBatis-Plus 依赖

pom.xml 文件中添加 MyBatis-Plus 的 Starter 依赖:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-boot-starter</artifactId>
    <version>3.5.3.1</version>
</dependency>

如果你需要使用代码生成器,也可以加上:

<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>mybatis-plus-generator</artifactId>
    <version>3.5.1</version>
</dependency>

3. 配置数据库连接

application.yml 中配置数据源:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC&characterEncoding=utf8
    username: root
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  mapper-locations: classpath*:mapper/**/*.xml
  type-aliases-package: com.example.entity

二、实体类与注解

1. 表结构示例

假设我们有一个用户表 user

CREATE TABLE user (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(50),
    age INT,
    email VARCHAR(100)
);

2. 实体类定义

package com.example.entity;

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;

@Data
@TableName("user") // 映射到 user 表
public class User {

    @TableId(value = "id", type = IdType.AUTO) // 主键映射
    private Long id;

    @TableField("name") // 字段映射,默认自动识别驼峰命名转下划线
    private String name;

    @TableField("age")
    private Integer age;

    @TableField("email")
    private String email;
}

说明:

  • @TableName: 映射实体类与数据库表名。
  • @TableId: 标识主键字段,可指定数据库列名。
  • @TableField: 映射普通字段,若不写则默认按字段名转换成下划线匹配数据库列。
  • IdType.AUTO: 自动识别主键类型(自增、UUID 等),也可手动设置如 IdType.NONE, IdType.INPUT 等。

三、Mapper 接口与 Service 层

1. Mapper 接口

package com.example.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.entity.User;

public interface UserMapper extends BaseMapper<User> {
}

继承 BaseMapper 后即可获得基本的 CRUD 方法。

2. Service 层接口与实现

package com.example.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.example.entity.User;

public interface UserService extends IService<User> {
}
package com.example.service.impl;

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.entity.User;
import com.example.mapper.UserMapper;
import com.example.service.UserService;
import org.springframework.stereotype.Service;

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

四、Wrapper 查询构造器详解

MyBatis-Plus 提供了强大的查询构造器 QueryWrapperUpdateWrapper,可以链式构建 SQL 条件。

示例:使用 QueryWrapper 查询用户

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import java.util.List;

public List<User> getUsersByNameAndAge(String name, int minAge) {
    return userMapper.selectList(new QueryWrapper<User>()
        .like("name", name) // LIKE '%name%'
        .ge("age", minAge)); // age >= minAge
}

更多常用方法:

方法 说明
eq(column, value) 等于
ne(column, value) 不等于
gt(column, value) 大于
ge(column, value) 大于等于
lt(column, value) 小于
le(column, value) 小于等于
like(column, value) LIKE
in(column, collection) IN 查询
between(column, val1, val2) BETWEEN 查询
orderByAsc(column) / orderByDesc(column) 排序

LambdaQueryWrapper(推荐)

避免字符串硬编码错误,推荐使用 LambdaQueryWrapper

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;

List<User> users = userMapper.selectList(new LambdaQueryWrapper<User>()
    .like(User::getName, "Tom")
    .ge(User::getAge, 18));

五、分页插件配置

1. 配置分页插件

在配置类中启用分页功能:

package com.example.config;

import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class MyBatisPlusConfig {

    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor());
        return interceptor;
    }
}

2. 使用分页查询

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;

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

你也可以结合 Wrapper:

Page<User> page = userMapper.selectPage(
    new Page<>(1, 10),
    new LambdaQueryWrapper<User>().ge(User::getAge, 20)
);

六、多表关联查询(以一对一为例)

1. 新建 Address 表及实体类

CREATE TABLE address (
    id BIGINT PRIMARY KEY AUTO_INCREMENT,
    user_id BIGINT,
    detail VARCHAR(200)
);
package com.example.entity;

import com.baomidou.mybatisplus.annotation.*;

@Data
@TableName("address")
public class Address {

    @TableId(type = IdType.AUTO)
    private Long id;

    private Long userId;

    private String detail;
}

2. 修改 User 类(增加关联字段)

package com.example.entity;

import lombok.Data;

@Data
public class UserVO extends User {
    private Address address;
}

3. 自定义 SQL 查询(XML 方式)

<!-- UserMapper.xml -->
<select id="selectUserWithAddress" resultType="com.example.entity.UserVO">
    SELECT u.*, a.detail AS address_detail
    FROM user u
    LEFT JOIN address a ON u.id = a.user_id
    WHERE u.id = #{id}
</select>

4. Mapper 接口中声明方法

UserVO selectUserWithAddress(Long id);

七、总结

通过本文,你应该已经掌握了:

  • 如何在 Spring Boot 中集成 MyBatis-Plus;
  • 使用 @TableName@TableId@TableField 注解进行 ORM 映射;
  • 使用 Wrapper 构建灵活查询条件;
  • 使用分页插件进行分页;
  • 多表关联查询的基本方式。

MyBatis-Plus 是一个非常实用的 MyBatis 扩展库,能够显著提升开发效率,建议结合官方文档进一步深入学习其高级特性,例如自动填充、乐观锁、逻辑删除、多租户等。


参考资料