MyBatis-Plus 基本概念详解
MyBatis-Plus 是基于 MyBatis 的增强工具,是一个简化开发、提升效率的 ORM 框架。它在 MyBatis 的基础上进行了很多功能扩展,如自动生成 CRUD 操作、代码生成器、通用查询条件构造器等,同时保持了 MyBatis 的灵活性和 SQL 可控性。MyBatis-Plus 的目标是减少开发者手动编写 SQL 的工作量,提升开发效率,同时提供更好的扩展和插件支持。
一、MyBatis-Plus 的特点
- 无侵入性:MyBatis-Plus 不会对现有的 MyBatis 项目产生任何侵入,它是在 MyBatis 之上提供了更多的功能。如果不需要某些功能,也可以选择不使用。
- 开箱即用:MyBatis-Plus 提供了大量的默认配置和功能,开发者可以通过少量配置快速启动并使用 CRUD、分页、查询构造器等功能。
- 自动化 CRUD:提供了通用的 CRUD 操作,减少手动编写 SQL 的工作。
- 支持 Lambda 表达式:MyBatis-Plus 支持使用 Java 8 的 Lambda 表达式来构建查询条件,使代码更加简洁优雅。
- 插件支持:提供丰富的插件支持,包括分页插件、性能分析插件、SQL 日志插件等。
- 代码生成器:通过代码生成器可以快速生成 Mapper、Service、Controller 等层的代码,大幅减少重复的代码编写。
二、MyBatis-Plus 基础配置
MyBatis-Plus 的配置非常简单,通常基于 Spring Boot 项目。MyBatis-Plus 提供了对 Spring Boot 的完美支持,集成方式与 MyBatis 类似。
1. 引入依赖
在 Spring Boot 项目中,首先需要引入 MyBatis-Plus 的 Maven 依赖:
<dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.1</version>
</dependency>
2. 配置文件
在 application.yml
中配置数据源和 MyBatis-Plus 相关信息:
spring:datasource:url: jdbc:mysql://localhost:3306/mydb?useUnicode=true&characterEncoding=UTF-8username: rootpassword: passworddriver-class-name: com.mysql.cj.jdbc.Driver
mybatis-plus:mapper-locations: classpath:/mapper/*.xmltype-aliases-package: com.example.entity
3. Mapper 接口
MyBatis-Plus 提供了一个基础的 BaseMapper
接口,继承该接口可以获得 MyBatis-Plus 提供的通用 CRUD 功能。所有的实体映射接口都可以继承 BaseMapper
,并通过泛型指定实体类。
public interface UserMapper extends BaseMapper<User> {
}
三、MyBatis-Plus 的核心功能
1. 自动化 CRUD 操作
MyBatis-Plus 提供了通用的 CRUD 接口,只需要继承 BaseMapper
,即可使用丰富的 CRUD 方法,无需再手动编写 SQL 语句。
- 查询:根据主键查询一条记录。
java User user = userMapper.selectById(1);
- 插入:插入一条记录。
java User user = new User(); user.setName("Alice"); user.setAge(25); int result = userMapper.insert(user);
- 更新:根据主键更新一条记录。
java user.setAge(26); int result = userMapper.updateById(user);
- 删除:根据主键删除一条记录。
java int result = userMapper.deleteById(1);
- 批量查询:根据 ID 列表批量查询。
java List<User> users = userMapper.selectBatchIds(Arrays.asList(1, 2, 3));
- 条件查询:使用
QueryWrapper
构建动态查询条件。
java QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.eq("name", "Alice").gt("age", 20); List<User> users = userMapper.selectList(queryWrapper);
2. Lambda 表达式查询
为了避免硬编码字段名,MyBatis-Plus 提供了 LambdaQueryWrapper
,可以通过 Lambda 表达式来构建查询条件,保证字段名与实体类字段一致。
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.eq(User::getName, "Alice").gt(User::getAge, 20);
List<User> users = userMapper.selectList(queryWrapper);
3. 分页查询
MyBatis-Plus 提供了分页插件,能够轻松实现分页功能。首先需要在配置中启用分页插件:
@Configuration
public class MyBatisPlusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor() {MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));return interceptor;}
}
然后在业务代码中直接使用分页功能:
Page<User> page = new Page<>(1, 10); // 第1页,每页10条记录
LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.gt(User::getAge, 20);
Page<User> userPage = userMapper.selectPage(page, queryWrapper);
selectPage
方法会返回 Page
对象,包含分页的详细信息,如总记录数、总页数等。
4. 逻辑删除
MyBatis-Plus 支持逻辑删除,意味着数据并不会真正从数据库中删除,而是通过标记字段来标识记录是否删除。首先在实体类中为逻辑删除字段添加 @TableLogic
注解:
@TableLogic
private Integer deleted;
然后,在全局配置中启用逻辑删除功能:
mybatis-plus:global-config:db-config:logic-delete-field: deleted
之后,调用 deleteById
方法时,MyBatis-Plus 会自动更新逻辑删除字段,而不是物理删除数据。
5. 自动填充字段
MyBatis-Plus 支持对创建时间、更新时间等字段的自动填充。可以通过实现 MetaObjectHandler
接口自定义填充逻辑:
@Component
public class MyMetaObjectHandler implements MetaObjectHandler {@Overridepublic void insertFill(MetaObject metaObject) {this.strictInsertFill(metaObject, "createTime", LocalDateTime.class, LocalDateTime.now());}@Overridepublic void updateFill(MetaObject metaObject) {this.strictUpdateFill(metaObject, "updateTime", LocalDateTime.class, LocalDateTime.now());}
}
然后在实体类中使用 @TableField
注解设置自动填充属性:
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
6. 代码生成器
MyBatis-Plus 提供了强大的代码生成器,能够根据数据库表结构自动生成实体类、Mapper 接口、Service 层和 Controller 层代码,极大地减少了开发者的重复劳动。
生成器的配置通常包括数据源配置、包名配置和表名配置,以下是一个简单的代码生成器配置示例:
public class CodeGenerator {public static void main(String[] args) {FastAutoGenerator.create("jdbc:mysql://localhost:3306/mydb", "root", "password").globalConfig(builder -> {builder.author("author") // 设置作者.outputDir(System.getProperty("user.dir") + "/src/main/java"); // 设置输出路径}).packageConfig(builder -> {builder.parent("com.example") // 设置父包名.moduleName("module"); // 设置模块名}).strategyConfig(builder -> {builder.addInclude("user"); // 设置需要生成的表}).execute();}
}
运行该代码后,MyBatis-Plus 会根据数据库表结构生成对应的实体类、Mapper 接口、Service 和 Controller 层的代码。
四、MyBatis-Plus 插件支持
MyBatis-Plus 提供了多个常用的插件,开发者可以根据需求选择使用:
- 分页插件:用于实现分页查询功能。
- 性能分析插件:用于分析 SQL 执行的性能,帮助开发者优化 SQL 语句。
- SQL 日志插件:用于输出 SQL 执行日志,便于开发和调试。
- 数据权限插件:用于在 SQL 查询中自动添加数据权限过滤条件。
五、MyBatis-Plus 与 MyBatis 的对比
| 特性 | MyBatis | MyBatis-Plus
|
|------------------------------|-----------------------------------|-------------------------------------------------|
| SQL 编写 | 手写 SQL,灵活控制 | 提供了自动 CRUD,减少手写 SQL |
| 配置复杂度 | 需要较多 XML 配置和手动管理 | 配置简单,支持开箱即用 |
| 分页支持 | 需要手动编写分页逻辑 | 提供分页插件,自动生成分页 SQL |
| Lambda 表达式支持 | 不支持 | 支持 Lambda 表达式,查询更加优雅 |
| 逻辑删除 | 需要手动实现 | 提供逻辑删除功能,自动控制逻辑删除 |
| 自动填充字段 | 不支持 | 支持字段自动填充,如创建时间、更新时间等 |
| 代码生成器 | 无 | 提供代码生成器,快速生成代码 |
| 扩展性 | 高,但需要较多配置和手动操作 | 高,且提供多种插件和扩展机制 |
六、总结
MyBatis-Plus 作为 MyBatis 的增强工具,通过自动化的 CRUD 操作、分页插件、Lambda 表达式支持、逻辑删除等功能,大幅提高了开发效率,并减少了手动编写 SQL 的工作量。它在保持 MyBatis 原有灵活性的同时,提供了更高层次的抽象和便利,特别适合中大型项目的开发。
MyBatis-Plus 的无侵入性设计和丰富的插件支持,使其可以轻松地集成到现有的 MyBatis 项目中,并且不会影响已有的业务逻辑。因此,对于追求快速开发和高效管理数据库操作的项目,MyBatis-Plus 是一个非常值得推荐的选择。