MyBatis Plus 功能详解
MyBatis Plus 是 MyBatis 的增强工具,在保留 MyBatis 原有特性的基础上,提供了诸多便捷功能以简化开发、提升效率。以下从核心功能、高级特性、使用场景及与原生 MyBatis 的对比四个维度进行详细解析:
一、核心功能
-
无侵入式增强
- 兼容性:MyBatis Plus 仅对 MyBatis 进行增强,不修改其原有代码,支持无缝集成到现有项目中。
- 灵活性:保留 MyBatis 的动态 SQL 标签(如
<if>
、<foreach>
),同时扩展更便捷的条件构造方式。
-
CRUD 操作简化
- 通用 Mapper(BaseMapper):提供
insert()
、deleteById()
、updateById()
、selectById()
等通用方法,无需编写 SQL 即可实现单表基础操作。 - Lambda 表达式支持:通过
LambdaQueryWrapper
构建查询条件,避免字段硬编码,提升代码可读性。LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>(); wrapper.eq(User::getName, "张三").ge(User::getAge, 18); List<User> users = userMapper.selectList(wrapper);
- 通用 Mapper(BaseMapper):提供
-
条件构造器(Wrapper)
- QueryWrapper/UpdateWrapper:支持链式调用,灵活构建复杂查询条件(如
eq
、like
、in
、orderBy
等)。 - 示例:
QueryWrapper<User> queryWrapper = new QueryWrapper<>(); queryWrapper.select("id", "name") .like("name", "Tom") .lt("age", 30); List<User> userList = userMapper.selectList(queryWrapper);
- QueryWrapper/UpdateWrapper:支持链式调用,灵活构建复杂查询条件(如
-
分页插件
- 内置物理分页:支持多种数据库(如 MySQL、Oracle),通过配置拦截器实现分页逻辑。
@Configuration public class MybatisPlusConfig { @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } }
- 使用分页:
Page<User> page = new Page<>(1, 10); // 当前页,每页大小 IPage<User> userPage = userMapper.selectPage(page, null); List<User> userList = userPage.getRecords();
- 内置物理分页:支持多种数据库(如 MySQL、Oracle),通过配置拦截器实现分页逻辑。
-
代码生成器
- 自动生成代码:通过
AutoGenerator
类生成 Entity、Mapper、Service、Controller 层代码,支持模板引擎和自定义配置。FastAutoGenerator.create("jdbc:mysql://localhost:3306/test", "root", "root") .globalConfig(builder -> builder.outputDir("D://code")) .packageConfig(builder -> builder.parent("com.example")) .strategyConfig(builder -> builder.addInclude("user")) .execute();
- 自动生成代码:通过
二、高级特性
-
乐观锁插件
- 版本控制:使用
@Version
注解标记版本字段,配置拦截器实现乐观锁,防止并发冲突。@Data @TableName("user") public class User { @TableId private Long id; @Version // 乐观锁字段 private Integer version; }
- 版本控制:使用
-
自动填充
- 字段自动填充:通过
@TableField(fill = FieldFill.INSERT)
注解,自动填充创建时间、更新时间等字段。@Data @TableName("user") public class User { @TableId private Long id; @TableField(fill = FieldFill.INSERT) private Date createTime; @TableField(fill = FieldFill.INSERT_UPDATE) private Date updateTime; }
- 字段自动填充:通过
-
逻辑删除
- 软删除实现:使用
@TableLogic
注解标记删除标志字段,实现数据逻辑删除。@Data @TableName("user") public class User { @TableId private Long id; @TableLogic private Integer deleted; // 0-未删除,1-已删除 }
- 软删除实现:使用
-
性能分析插件
- SQL 监控:输出 SQL 语句及其执行时间,帮助定位慢查询。
@Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PerformanceInterceptor()); return interceptor; }
- SQL 监控:输出 SQL 语句及其执行时间,帮助定位慢查询。
-
全局拦截器
- 安全防护:防止全表更新/删除操作,支持自定义拦截规则(如权限校验)。
三、使用场景
-
快速开发
- 单表 CRUD 场景:通过内置通用方法减少重复代码编写,提升开发效率。
- 微服务架构:支持分布式 ID 生成、批量操作,适合微服务环境。
-
企业级应用
- 数据一致性:通过乐观锁、逻辑删除等功能保障数据安全。
- 性能优化:利用性能分析插件定位慢查询,优化 SQL 执行效率。
-
复杂查询优化
- 动态条件构造:通过 Wrapper 类简化复杂查询逻辑,提升代码可维护性。
四、与原生 MyBatis 对比
特性 | MyBatis | MyBatis Plus |
---|---|---|
SQL 编写 | 需手动编写所有 SQL(XML 或注解) | 内置通用 CRUD,单表操作无需写 SQL |
条件构造 | 不支持,需手写动态 SQL | 提供 Wrapper 类支持链式调用 |
代码生成 | 无内置支持 | 提供代码生成器 |
主键策略 | 需手动配置 | 内置多种策略(如雪花算法、UUID) |
分页实现 | 需手动实现或集成第三方插件 | 内置分页插件 |
SQL 注入防护 | 依赖开发者使用 #{} 占位符 | 内置 SQL 注入剥离器 |
实体映射注解 | 需手动配置 XML 映射 | 支持 @TableName 、@TableId 等注解 |
总结
MyBatis Plus 通过提供无侵入式增强、CRUD 简化、条件构造器、分页插件等核心功能,以及乐观锁、自动填充、代码生成器等高级特性,显著提升了开发效率。其适用于快速开发、企业级应用及复杂查询优化等场景,与原生 MyBatis 相比,在功能丰富性和易用性上具有明显优势。