一、MyBatis-Plus 简介

MyBatis-Plus(简称 MP)是 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。它提供了:

  • 无侵入
  • 损耗小
  • 强大的 CRUD 操作
  • 支持 Lambda 表达式
  • 支持自动分页
  • 代码生成器
  • 多种主键策略
  • 逻辑删除、自动填充等内置功能

二、项目依赖引入(Maven / Gradle)

✅ 1. Maven 依赖(推荐 Spring Boot 项目)

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

    <!-- MyBatis-Plus Starter -->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.5.6</version> <!-- 推荐使用最新稳定版 -->
    </dependency>

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

    <!-- 数据源(如 HikariCP,Spring Boot 默认) -->
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
    </dependency>

    <!-- Lombok(可选,简化实体类) -->
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <optional>true</optional>
    </dependency>
</dependencies>

🔔 注意:如果你使用 Spring Boot,mybatis-plus-boot-starter 会自动集成 Spring,无需手动配置 MyBatis。


✅ 2. Gradle 依赖

dependencies {
    implementation 'org.springframework.boot:spring-boot-starter-web'
    implementation 'com.baomidou:mybatis-plus-boot-starter:3.5.6'
    runtimeOnly 'mysql:mysql-connector-java'
    implementation 'com.zaxxer:HikariCP'
    compileOnly 'org.projectlombok:lombok'
    annotationProcessor 'org.projectlombok:lombok'
}

三、核心概念

概念 说明
@TableName 映射实体类与数据库表名
@TableId 标识主键字段,支持多种 ID 策略(如 AUTO, ID_WORKER, UUID
@TableField 映射非主键字段,支持 fill 自动填充
BaseMapper<T> 核心接口,提供通用 CRUD 方法
IService<T> / ServiceImpl 业务层通用接口与实现
@EnumValue 枚举字段映射
@Version 乐观锁注解
@LogicDelete 逻辑删除字段标记

四、详细操作步骤(Spring Boot + MySQL)

步骤 1:创建数据库表

CREATE DATABASE mydemo;
USE mydemo;

CREATE TABLE user (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL,
    age INT,
    email VARCHAR(100),
    create_time DATETIME DEFAULT CURRENT_TIMESTAMP,
    update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    deleted INT DEFAULT 0 COMMENT '0:未删除, 1:已删除'
);

步骤 2:创建实体类(User.java)

import com.baomidou.mybatisplus.annotation.*;
import lombok.Data;
import java.time.LocalDateTime;

@Data
@TableName("user")
public class User {
    @TableId(type = IdType.AUTO)
    private Long id;

    private String name;
    private Integer age;
    private String email;

    @TableField(fill = FieldFill.INSERT)
    private LocalDateTime createTime;

    @TableField(fill = FieldFill.INSERT_UPDATE)
    private LocalDateTime updateTime;

    @TableLogic
    @TableField(value = "deleted")
    private Integer deleted; // 逻辑删除字段
}

步骤 3:创建 Mapper 接口

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import org.apache.ibatis.annotations.Mapper;

@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 无需写任何方法,BaseMapper 已提供通用 CRUD
}

步骤 4:配置 application.yml

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/mydemo?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8
    username: root
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver

mybatis-plus:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl  # 控制台打印 SQL
  global-config:
    db-config:
      id-type: auto                         # 主键策略
      logic-delete-value: 1                 # 逻辑已删除值
      logic-not-delete-value: 0             # 逻辑未删除值
  mapper-locations: classpath*:mapper/*.xml # XML 映射文件位置(可选)

步骤 5:启用 MyBatis-Plus(Spring Boot 主类)

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
@MapperScan("com.example.mapper") // 扫描 Mapper 接口
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

步骤 6:编写 Service 层(可选)

import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import org.springframework.stereotype.Service;

@Service
public class UserService extends ServiceImpl<UserMapper, User> {
    // 可扩展自定义方法
}

步骤 7:编写 Controller 测试

import org.springframework.web.bind.annotation.*;
import java.util.List;

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

    private final UserMapper userMapper;

    public UserController(UserMapper userMapper) {
        this.userMapper = userMapper;
    }

    @GetMapping
    public List<User> getAll() {
        return userMapper.selectList(null);
    }

    @PostMapping
    public String save(@RequestBody User user) {
        userMapper.insert(user);
        return "success";
    }

    @GetMapping("/{id}")
    public User getById(@PathVariable Long id) {
        return userMapper.selectById(id);
    }

    @DeleteMapping("/{id}")
    public String delete(@PathVariable Long id) {
        userMapper.deleteById(id);
        return "deleted";
    }
}

五、常见错误与解决方案

错误 原因 解决方案
Invalid bound statement (not found) Mapper 未被扫描 检查 @MapperScan 路径是否正确
Unknown column 'xxx' in 'field list' 字段名不匹配 使用 @TableField("db_column_name") 映射
主键插入失败 ID 策略配置错误 检查 @TableId(type = IdType.AUTO) 和数据库是否自增
逻辑删除无效 未配置全局逻辑删除值 application.yml 中设置 logic-delete-valuelogic-not-delete-value
自动填充不生效 未实现 MetaObjectHandler 需自定义填充处理器(见下文)