核心概念
- 配置文件作用:定义 MyBatis-Plus 的核心行为,如数据库连接、插件启用、主键策略、逻辑删除规则等。
- 配置方式:主要通过
application.yml
或application.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 版本开始,推荐使用
MybatisPlusInterceptor
和InnerInterceptor
方式配置插件,替代旧的PaginationInterceptor
。
常见错误
Invalid bound statement (not found)
:- 原因:Mapper XML 文件未被正确扫描或路径配置错误 (
mapper-locations
)。 - 解决:检查
application.yml
中mybatis-plus.mapper-locations
路径是否正确,文件是否在classpath
下,@MapperScan
包路径是否正确。
- 原因:Mapper XML 文件未被正确扫描或路径配置错误 (
Unknown column 'xxx' in 'field list'
:- 原因:实体类字段名与数据库列名不匹配,且未正确配置
@TableField
或map-underscore-to-camel-case
未开启。 - 解决:确保
map-underscore-to-camel-case: true
,或使用@TableField("column_name")
明确指定列名。
- 原因:实体类字段名与数据库列名不匹配,且未正确配置
- 主键生成问题 (如
0
或null
):- 原因:
@TableId
的type
配置错误,或全局id-type
配置与数据库/业务不符。 - 解决:检查
@TableId
注解的type
属性或mybatis-plus.global-config.db-config.id-type
配置。ASSIGN_ID
需要数据库字段为BIGINT
,AUTO
需要数据库支持自增。
- 原因:
- 逻辑删除失效:
- 原因:未配置
logic-delete-field
,logic-not-delete-value
,logic-delete-value
;或实体类字段未加@TableLogic
;或未正确配置MybatisPlusInterceptor
。 - 解决:检查全局配置、实体类注解和插件配置。
- 原因:未配置
- 分页查询无效 (返回所有数据):
- 原因:未正确配置
PaginationInnerInterceptor
到MybatisPlusInterceptor
中。 - 解决:确保在 Java 配置类中正确添加了
PaginationInnerInterceptor
。
- 原因:未正确配置
- 乐观锁失效:
- 原因:实体类未加
@Version
注解;或未配置OptimisticLockerInnerInterceptor
。 - 解决:检查
@Version
注解和插件配置。
- 原因:实体类未加
- 找不到 Mapper Bean:
- 原因:Mapper 接口未被 Spring 扫描到。
- 解决:确保使用了
@Mapper
注解或在启动类/配置类上使用了@MapperScan
。