核心概念

  • 配置文件作用:定义 MyBatis-Plus 的核心行为,如数据库连接、插件启用、主键策略、逻辑删除规则等。
  • 配置方式:主要通过 application.ymlapplication.properties 文件进行 Spring Boot 风格的配置。
  • 核心配置项mybatis-plus.configuration, mybatis-plus.mapper-locations, mybatis-plus.type-aliases-package, mybatis-plus.global-config, mybatis-plus.configuration.* (MyBatis 原生配置)。
  • 插件配置:分页、乐观锁、逻辑删除、多租户等插件需要在配置文件中声明并可能需要额外的 Bean 配置。

操作步骤 (非常详细)

步骤 1: 添加依赖 (Maven 示例) 确保 pom.xml 中包含 MyBatis-Plus 和数据库驱动依赖。

<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.3.1</version> <!-- 使用最新稳定版 -->
    </dependency>

    <!-- 数据库驱动 (以 MySQL 8 为例) -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>

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

步骤 2: 配置数据源 (application.yml)src/main/resources/application.yml 中配置数据库连接信息。这是基础。

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/your_database?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
    username: your_username
    password: your_password
    driver-class-name: com.mysql.cj.jdbc.Driver
    # 可选:配置连接池 (推荐使用 HikariCP, Spring Boot 默认)
    # hikari:
    #   maximum-pool-size: 20
    #   minimum-idle: 5

(如果是 application.properties,格式为 spring.datasource.url=..., spring.datasource.username=... 等)

步骤 3: 配置 MyBatis-Plus 核心属性 (application.yml)application.yml 同级或下级添加 MyBatis-Plus 特定配置。

mybatis-plus:
  # 配置 MyBatis 的 Configuration
  configuration:
    # 是否开启自动驼峰命名规则映射: 数据库列名 (a_column) -> Java 属性名 (aColumn)
    map-underscore-to-camel-case: true
    # 其他 MyBatis 原生配置...
    # cache-enabled: false # 全局禁用二级缓存 (可选)
    # lazy-loading-enabled: true # 开启懒加载 (需配合其他设置)
    # aggressive-lazy-loading: false # 禁用立即加载 (与懒加载配合)
    # log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 控制台输出 SQL (调试用)

  # 指定 MyBatis Mapper XML 文件的位置
  mapper-locations: classpath*:mapper/**/*.xml
  # 如果有多个路径,可以用逗号分隔: classpath:mapper/*.xml,classpath:mybatis/mapper/*.xml

  # 指定实体类所在的包,用于别名 (在 XML 中可以直接用类名)
  type-aliases-package: com.yourcompany.yourproject.entity

  # 全局配置 (对应 GlobalConfig)
  global-config:
    db-config:
      # 主键生成策略 (IdType)
      # AUTO: 数据库自增 (如 MySQL AUTO_INCREMENT)
      # ASSIGN_ID: 雪花算法生成 19 位长整型 (推荐分布式)
      # ASSIGN_UUID: 生成 UUID
      id-type: ASSIGN_ID
      # 逻辑删除字段名
      logic-delete-field: deleted
      # 逻辑未删除值 (数据库存储的值)
      logic-not-delete-value: 0
      # 逻辑已删除值 (数据库存储的值)
      logic-delete-value: 1
      # 表名前缀 (生成 SQL 时会自动去除)
      # table-prefix: tbl_
    # 其他全局配置...
    # banner: false # 启动时不打印 MyBatis-Plus 的 banner

  # 插件配置 (通常需要 Java 配置类,但部分可在此声明,如分页插件的方言)
  # configuration:
  #   default-scripting-language: org.apache.ibatis.scripting.xmltags.XMLLanguageDriver # 可选

步骤 4: 创建实体类 (Entity)

package com.yourcompany.yourproject.entity;

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

@Data
@TableName("user") // 指定数据库表名,若与类名一致可省略
public class User {
    @TableId(value = "id", type = IdType.AUTO) // 主键,策略也可在全局配置
    private Long id;

    @TableField("name")
    private String name;

    @TableField("email")
    private String email;

    @TableField("create_time")
    private LocalDateTime createTime;

    @TableField("update_time")
    private LocalDateTime updateTime;

    @TableLogic // 标记为逻辑删除字段
    @TableField("deleted")
    private Integer deleted; // 对应全局配置的 logic-delete-field
}

步骤 5: 创建 Mapper 接口

package com.yourcompany.yourproject.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yourcompany.yourproject.entity.User;
import org.apache.ibatis.annotations.Mapper;

@Mapper // 或在启动类加 @MapperScan
public interface UserMapper extends BaseMapper<User> {
    // 继承 BaseMapper 后,已拥有通用 CRUD 方法
    // 可在此定义自定义方法,需配合 XML 或注解
}

步骤 6: 启动类配置 (可选) 如果未使用 @Mapper 注解,需在启动类上扫描 Mapper 包。

package com.yourcompany.yourproject;

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

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

步骤 7: (可选) 配置插件 (Java Config) 虽然部分配置可在 YAML 中完成,但核心插件(分页、乐观锁)通常需要 Java 配置类。在 src/main/java 下创建配置类。

package com.yourcompany.yourproject.config;

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

@Configuration
public class MyBatisPlusConfig {

    /**
     * 配置 MyBatis-Plus 插件链
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        // 添加分页插件
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); // 指定数据库类型
        // 添加乐观锁插件
        interceptor.addInnerInterceptor(new OptimisticLockerInnerInterceptor());
        // 可以继续添加其他插件,如多租户、SQL 防注入等
        return interceptor;
    }
}

注意:从 3.4.0 版本开始,推荐使用 MybatisPlusInterceptorInnerInterceptor 方式配置插件,替代旧的 PaginationInterceptor

常见错误

  1. Invalid bound statement (not found):
    • 原因:Mapper XML 文件未被正确扫描或路径配置错误 (mapper-locations)。
    • 解决:检查 application.ymlmybatis-plus.mapper-locations 路径是否正确,文件是否在 classpath 下,@MapperScan 包路径是否正确。
  2. Unknown column 'xxx' in 'field list':
    • 原因:实体类字段名与数据库列名不匹配,且未正确配置 @TableFieldmap-underscore-to-camel-case 未开启。
    • 解决:确保 map-underscore-to-camel-case: true,或使用 @TableField("column_name") 明确指定列名。
  3. 主键生成问题 (如 0null):
    • 原因:@TableIdtype 配置错误,或全局 id-type 配置与数据库/业务不符。
    • 解决:检查 @TableId 注解的 type 属性或 mybatis-plus.global-config.db-config.id-type 配置。ASSIGN_ID 需要数据库字段为 BIGINTAUTO 需要数据库支持自增。
  4. 逻辑删除失效:
    • 原因:未配置 logic-delete-field, logic-not-delete-value, logic-delete-value;或实体类字段未加 @TableLogic;或未正确配置 MybatisPlusInterceptor
    • 解决:检查全局配置、实体类注解和插件配置。
  5. 分页查询无效 (返回所有数据):
    • 原因:未正确配置 PaginationInnerInterceptorMybatisPlusInterceptor 中。
    • 解决:确保在 Java 配置类中正确添加了 PaginationInnerInterceptor
  6. 乐观锁失效:
    • 原因:实体类未加 @Version 注解;或未配置 OptimisticLockerInnerInterceptor
    • 解决:检查 @Version 注解和插件配置。
  7. 找不到 Mapper Bean:
    • 原因:Mapper 接口未被 Spring 扫描到。
    • 解决:确保使用了 @Mapper 注解或在启动类/配置类上使用了 @MapperScan