MyBatis 和 MyBatis-Plus 是 Java 中常用的持久层框架,MyBatis-Plus 是在 MyBatis 基础上增强的工具包,让开发更便捷、高效。下面是两者主要的区别:
✅ 核心区别总结:
特性 | MyBatis | MyBatis-Plus |
---|---|---|
配置复杂度 | 需要手写大量 XML 或注解 | 极简配置,自动生成 SQL |
CRUD 操作 | 手写 Mapper 方法 + SQL | 内置通用 CRUD 方法 |
分页功能 | 需要手写分页逻辑或第三方插件 | 内置分页插件,开箱即用 |
条件构造器 | 无,需要手写 where 条件 | 内置 Lambda 条件构造器 |
代码生成 | 无 | 提供代码生成器(Code Generator) |
主键策略 | 需要手动配置 | 内置多种主键生成策略 |
乐观锁 | 自己实现 | 提供内置乐观锁插件 |
审计字段(如创建时间、修改时间) | 自行维护 | 提供自动填充功能 |
性能分析 | 需要额外工具 | 内置 SQL 性能分析插件 |
兼容性 | 灵活、手动控制高 | 完全兼容 MyBatis,可随时退回 |
🧩 1. 配置复杂度
✅ MyBatis:
-
需要创建
Mapper 接口
+Mapper.xml
文件 -
SQL 都需要手动写,配置较繁琐
-
实体类、字段和表结构需要手动映射(resultMap 或 @Results)
<!-- MyBatis 的 select 示例 -->
<select id="selectById" resultType="User">SELECT * FROM user WHERE id = #{id}
</select>
✅ MyBatis-Plus:
-
只需配置数据库连接、扫描 Mapper 包
-
不需要写 XML,自动完成 SQL 拼接
-
实体类字段与表字段名称一致可自动映射
// 简洁调用
User user = userMapper.selectById(1L);
🧩 2. CRUD 操作
✅ MyBatis:
-
所有 CRUD 方法都需要手写
-
如果实体类字段多,SQL 写起来冗长,易出错
✅ MyBatis-Plus:
-
提供
BaseMapper<T>
,自动拥有 20+ 个通用 CRUD 方法 -
例如:
-
selectById
,insert
,updateById
,deleteById
-
批量插入、分页查询、条件查询等也支持
-
userMapper.insert(user); // 自动生成 insert SQL
🧩 3. 分页功能
✅ MyBatis:
-
需要自己拼接分页 SQL(LIMIT/OFFSET)
-
或接入第三方分页插件如 PageHelper
✅ MyBatis-Plus:
-
提供
分页插件
,配置一次后,使用非常方便 -
统一使用
Page<T>
对象传参
Page<User> page = new Page<>(1, 10); // 页码1,每页10条
Page<User> result = userMapper.selectPage(page, null);
🧩 4. 条件构造器
✅ MyBatis:
- 条件查询时需要手写 SQL 中的 where 子句
✅ MyBatis-Plus:
-
提供
QueryWrapper
和LambdaQueryWrapper
-
可链式编程、支持条件组合、动态拼接
LambdaQueryWrapper<User> wrapper = new LambdaQueryWrapper<>();
wrapper.eq(User::getAge, 20).like(User::getName, "张");
List<User> users = userMapper.selectList(wrapper);
🧩 5. 代码生成
✅ MyBatis:
- 没有自带代码生成工具,通常需要借助 MyBatis Generator 插件,且配置复杂
✅ MyBatis-Plus:
-
自带
Code Generator
,支持通过数据库自动生成:- 实体类、Mapper 接口、XML、Service、Controller 等
// 快速生成一整套文件,只需配置数据库和模板路径
AutoGenerator generator = new AutoGenerator();
// 配置略...
generator.execute();
🧩 6. 主键策略
✅ MyBatis:
- 插入数据时需要手动指定主键或配置主键返回策略(如 useGeneratedKeys)
✅ MyBatis-Plus:
-
支持多种主键生成方式:
- 自增、UUID、雪花算法(默认使用雪花)
-
只需在实体类中加注解即可
@TableId(type = IdType.ASSIGN_ID) // 使用雪花算法生成主键
private Long id;
🧩 7. 乐观锁
✅ MyBatis:
- 需要手动实现版本字段逻辑和 SQL 拼接
✅ MyBatis-Plus:
- 提供内置插件支持乐观锁,自动对
version
字段进行比较和更新
@Version
private Integer version; // 更新时会自动加入 version=... 的判断
🧩 8. 审计字段(创建时间、修改时间)
✅ MyBatis:
- 需要手动在 insert/update 语句中维护
createTime
,updateTime
✅ MyBatis-Plus:
- 提供自动填充功能,支持插入/更新时自动填充字段
@TableField(fill = FieldFill.INSERT)
private LocalDateTime createTime;@TableField(fill = FieldFill.INSERT_UPDATE)
private LocalDateTime updateTime;
- 需要配置
MetaObjectHandler
,一次性设置全局规则
🧩 9. 性能分析
✅ MyBatis:
- 需要自己接入日志框架或 SQL 监控工具(如 P6Spy)
✅ MyBatis-Plus:
- 内置 SQL 执行分析插件(dev/test 环境下很实用)
// 开启性能分析插件
interceptor.addInnerInterceptor(new PerformanceInterceptor());
🧩 10. 兼容性
✅ MyBatis:
- 灵活度高,自由度大,但需要手动控制 SQL
✅ MyBatis-Plus:
-
100% 兼容原生 MyBatis
-
可以只使用通用功能,特殊需求时照样写 XML、注解 SQL
🚀 使用场景建议:
-
MyBatis:适合 SQL 极度复杂、强定制化的项目,想完全控制 SQL。
-
MyBatis-Plus:适合大多数通用业务,追求开发效率、简洁的项目,尤其适合中后台管理系统。