MyBatis-Plus 超详细使用指南:从 0 到 1 实战
1. MyBatis-Plus 简介
MyBatis-Plus(简称 MP)是一个 MyBatis 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。
1.1 核心特性
- 无侵入:只做增强不做改变,引入它不会对现有项目产生影响
- CRUD 操作:内置通用 Mapper、通用 Service,仅需少量配置即可实现单表 CRUD 操作
- 条件构造器:强大的 Wrapper 条件构造器,使查询条件更加灵活
- 代码生成器:可快速生成实体类、Mapper、Mapper XML、Service、Controller 等各类代码
- 分页插件:基于 MyBatis 物理分页,开发者无需关心具体操作
- 性能分析:可输出 SQL 语句及其执行时间,便于开发者进行分析和优化
2. 环境搭建
2.1 创建 Spring Boot 项目
首先,我们使用 Spring Initializr 创建一个 Spring Boot 项目,选择以下依赖:
- Spring Web
- MySQL Driver
- Spring Data JPA (可选)
2.2 添加 MyBatis-Plus 依赖
在 pom.xml
中添加 MyBatis-Plus 依赖:
<!-- MyBatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.3</version>
</dependency>
<!-- MySQL 驱动 -->
<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>
2.3 配置数据库连接
在 application.yml
中配置数据库连接:
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mp_demo?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&useSSL=false
username: root
password: 123456
mybatis-plus:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 开启SQL日志
global-config:
db-config:
id-type: auto # 全局默认主键类型设置为自增
table-prefix: tbl_ # 表名前缀
2.4 创建数据库和表
CREATE DATABASE mp_demo;
USE mp_demo;
CREATE TABLE tbl_user (
id BIGINT(20) NOT NULL AUTO_INCREMENT COMMENT '主键ID',
name VARCHAR(30) NULL DEFAULT NULL COMMENT '姓名',
age INT(11) NULL DEFAULT NULL COMMENT '年龄',
email VARCHAR(50) NULL DEFAULT NULL COMMENT '邮箱',
create_time DATETIME NULL DEFAULT NULL COMMENT '创建时间',
update_time DATETIME NULL DEFAULT NULL COMMENT '更新时间',
deleted INT(1) NULL DEFAULT 0 COMMENT '逻辑删除标识(0-未删除,1-已删除)',
version INT(11) NULL DEFAULT 1 COMMENT '乐观锁版本号',
PRIMARY KEY (id)
);
-- 插入测试数据
INSERT INTO tbl_user (name, age, email, create_time) VALUES
('张三', 18, 'zhangsan@example.com', NOW()),
('李四', 20, 'lisi@example.com', NOW()),
('王五', 28, 'wangwu@example.com', NOW()),
('赵六', 21, 'zhaoliu@example.com', NOW()),
('田七', 24, 'tianqi@example.com', NOW());
2.5 配置 Spring Boot 启动类
@SpringBootApplication
@MapperScan("com.example.demo.mapper") // 扫描 Mapper 接口
public class MpDemoApplication {
public static void main(String[] args) {
SpringApplication.run(MpDemoApplication.class, args);
}
}
3. 基本使用
3.1 创建实体类
@Data
@TableName("tbl_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 // 逻辑删除
private Integer deleted;
@Version // 乐观锁
private Integer version;
}
3.2 创建 Mapper 接口
public interface UserMapper extends BaseMapper<User> {
// 继承 BaseMapper 后即可获得各种 CRUD 方法
// 无需编写任何 SQL,即可实现基本的增删改查操作
}
3.3 创建 Service 接口和实现类
// Service 接口
public interface UserService extends IService<User> {
// 继承 IService 获得更多批量操作方法
}
// Service 实现类
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
// 继承 ServiceImpl 提供的方法,无需编写基础实现代码
}
3.4 创建自动填充处理器
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {
@Override
public void insertFill(MetaObject metaObject) {
this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());
this.strictInsertFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
@Override
public void updateFill(MetaObject metaObject) {
this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());
}
}
3.5 创建 Controller
@RestController
@RequestMapping("/users")
public class UserController {
@Autowired
private UserService userService;
@GetMapping
public List<User> list() {
return userService.list();
}
@GetMapping("/{id}")
public User getById(@PathVariable Long id) {
return userService.getById(id);
}
@PostMapping
public boolean save(@RequestBody User user) {
return userService.save(user);
}
@PutMapping
public boolean update(@RequestBody User user) {
return userService.updateById(user);
}
@DeleteMapping("/{id}")
public boolean delete(@PathVariable Long id) {
return userService.removeById(id);
}
}
4. CRUD 操作详解
4.1 插入操作
// 单条插入
User user = new User();
user.setName("小明");
user.setAge(22);
user.setEmail("xiaoming@example.com");
userMapper.insert(user);
// 插入后会自动回填主键 ID
System.out.println("插入后的ID: " + user.getId());
// 批量插入
List<User> users = Arrays.asList(
new