在 Java 后端开发领域,持久层框架的选择对于项目的开发效率和维护成本至关重要。MyBatis 凭借其灵活的 SQL 编写能力和高性能,一直是许多开发者的首选。然而,MyBatis 在面对大量单表 CRUD 操作时,仍然需要编写冗余的 Mapper 接口和 XML 映射文件,这在一定程度上降低了开发效率。
MyBatis-Plus(简称 MP)正是为了解决这一痛点而生。作为 MyBatis 的增强工具,它在 MyBatis 的基础上提供了大量简化开发的特性,如:
- 无侵入: 仅仅是增强,不会对 MyBatis 造成任何改变,正常使用 MyBatis 所有的功能。
- 启动即用: 引入依赖即可使用,无需复杂配置。
- 强大的 CRUD 操作: 提供单表 CRUD 的强大能力,无需编写 Mapper XML,甚至无需编写 Mapper 接口方法。
- 代码生成器: 快速生成实体、Mapper、Service、Controller 等代码。
- 分页插件: 集成 RowBounds 或 PageHelper 的分页功能。
- 乐观锁、逻辑删除、自动填充等: 提供常用的业务功能。
本文将详细介绍如何在 Spring Boot 项目中整合 MyBatis-Plus,并分享如何利用其特性快速构建高效、简洁的持久层。
1. 为什么选择 MyBatis-Plus?
- 告别繁琐的 CRUD: 大部分单表操作无需手写 SQL 和 Mapper 接口方法,大大减少代码量。
- 开发效率提升: 聚焦业务逻辑,而不是重复的持久层代码。
- 维护成本降低: 代码量减少,逻辑更清晰,维护更方便。
- 性能优异: 基于 MyBatis,保持了高性能的特点。
- 功能丰富: 提供大量开箱即用的功能,如分页、乐观锁、逻辑删除、自动填充等。
2. Spring Boot 整合 MyBatis-Plus 基础
2.1 引入依赖
在 pom.xml
中添加 MyBatis-Plus Starter 和数据库驱动(以 MySQL 为例)依赖:
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.5.7</version> </dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version> </dependency>
2.2 配置数据源
在 application.properties
或 application.yml
中配置数据库连接信息:
# application.properties
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=Asia/Shanghai
spring.datasource.username=your_username
spring.datasource.password=your_password
# MyBatis-Plus 配置(可选,但推荐)
mybatis-plus.mapper-locations=classpath*:/mapper/**/*.xml # Mapper XML 文件路径,如果使用注解方式可省略
mybatis-plus.type-aliases-package=com.example.demo.entity # 实体类包路径,方便起别名
mybatis-plus.global-config.db-config.id-type=auto # ID 主键策略,AUTO, NONE, INPUT, ASSIGN_ID, ASSIGN_UUID
mybatis-plus.global-config.db-config.logic-delete-field=deleted # 逻辑删除字段名
mybatis-plus.global-config.db-config.logic-delete-value=1 # 逻辑删除值
mybatis-plus.global-config.db-config.logic-not-delete-value=0 # 逻辑未删除值
2.3 创建实体类
创建数据库表对应的实体类,并使用 Lombok(可选,但推荐)和 MyBatis-Plus 的注解。
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.AllArgsConstructor;
import java.io.Serializable;
import java.time.LocalDateTime; // 使用 Java 8 日期时间 API
@Data // Lombok 注解,自动生成 Getter, Setter, equals, hashCode, toString
@NoArgsConstructor
@AllArgsConstructor
@TableName("user") // 映射数据库表名
public class User implements Serializable {
@TableId(value = "id", type = IdType.AUTO) // 主键ID,类型为自增
private Long id;
private String name;
private Integer age;
private String email;
@TableField("create_time") // 映射数据库字段名,如果字段名与Java驼峰命名一致可省略
private LocalDateTime createTime;
@TableField("update_time")
private LocalDateTime updateTime;
// 逻辑删除字段(如果开启了逻辑删除)
@TableLogic
private Integer deleted;
}
2.4 创建 Mapper 接口
MyBatis-Plus 的核心特性之一就是无需编写大量的基础 CRUD 方法。你只需要让你的 Mapper 接口继承 BaseMapper<T>
即可。
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.