一、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-value 和 logic-not-delete-value |
自动填充不生效 | 未实现 MetaObjectHandler |
需自定义填充处理器(见下文) |