mybatis plus和mybatis 区别(保姆级教程)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 82w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 2900+ 小伙伴加入学习 ,欢迎点击围观
在 Java 开发领域,MyBatis 和 MyBatis Plus 是两款广泛应用于数据持久层的框架。两者均基于 SQL 的灵活性与 ORM(对象关系映射)的便捷性,但 MyBatis Plus 作为 MyBatis 的增强工具,通过封装大量常用功能,显著提升了开发效率。对于编程初学者和中级开发者而言,理解这两者的区别与联系,能够帮助开发者在项目中选择最适合的工具。本文将从核心功能、开发效率、性能差异、适用场景等多个维度展开对比,并通过代码示例与类比,深入浅出地解析两者的差异。
一、核心功能对比:从“工具箱”到“全功能套装”
1.1 MyBatis:基础 SQL 框架
MyBatis 是一个轻量级的持久层框架,其核心功能是将 Java 对象与数据库表进行映射。开发者需要手动编写 SQL 语句,并通过 XML 文件或注解(如 @Select
、@Insert
)将 SQL 与 Java 方法关联。
类比:
MyBatis 好比一个“工具箱”,它提供了基础的工具(如 SQL 映射、事务管理),但需要开发者自行组装功能。例如,执行一条查询语句时,开发者需要:
// MyBatis 实现查询示例
public interface UserMapper {
@Select("SELECT * FROM user WHERE id = #{id}")
User selectById(Long id);
}
而对应的 XML 配置可能如下:
<select id="selectById" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
1.2 MyBatis Plus:增强版“智能工具”
MyBatis Plus(简称 MP)是在 MyBatis 基础上构建的增强框架,它通过封装通用 CRUD 操作、内置分页插件、逻辑删除等功能,减少了重复代码的编写。
类比:
MP 好比一个“全功能套装”,它不仅包含 MyBatis 的工具,还预装了常用功能模块(如自动填充、乐观锁),开发者只需通过简单配置即可调用。例如,查询操作可以简化为:
// MyBatis Plus 实现查询示例
public interface UserMapper extends BaseMapper<User> {
// 无需编写 SQL,BaseMapper 已包含 selectById 等基础方法
}
1.3 核心区别总结
功能维度 | MyBatis | MyBatis Plus |
---|---|---|
SQL 编写 | 需手动编写 SQL 或通过注解定义 | 自动根据实体类生成 SQL,仅需少量自定义逻辑 |
CRUD 支持 | 需自行实现增删改查方法 | 内置 BaseMapper 接口,提供通用的 CRUD 方法(如 save 、update 、delete ) |
扩展性 | 支持通过插件机制扩展功能(如分页、日志) | 集成常用插件(如分页、乐观锁),并提供更简洁的 API |
二、开发效率对比:从“手工组装”到“一键生成”
2.1 MyBatis 的开发模式
在 MyBatis 中,每个数据库操作都需要开发者手动编写 SQL 语句,并管理映射关系。例如,实现一个分页查询需要:
// MyBatis 分页查询示例
public List<User> selectPage(int pageNum, int pageSize) {
int offset = (pageNum - 1) * pageSize;
return userMapper.selectPage(offset, pageSize); // 需要预先编写对应的 SQL
}
对应的 XML 需要显式处理分页逻辑:
<select id="selectPage" resultType="User">
SELECT * FROM user LIMIT #{offset}, #{pageSize}
</select>
2.2 MyBatis Plus 的简化方案
MyBatis Plus 通过内置的 Page
对象和 PageHelper
插件,将分页逻辑封装为一行代码:
// MyBatis Plus 分页查询示例
public IPage<User> selectPage(int pageNum, int pageSize) {
Page<User> page = new Page<>(pageNum, pageSize);
return userMapper.selectPage(page, null); // 自动拼接分页 SQL
}
2.3 其他效率提升点
- 逻辑删除:MyBatis 需要手动编写
deleted
字段的查询条件,而 MP 通过@TableLogic
注解自动处理逻辑删除。 - 自动填充:MP 的
MetaObjectHandler
可以自动填充创建时间、更新时间等字段,无需在每个接口中重复逻辑。 - 链式查询:MP 提供
QueryWrapper
和LambdaQueryWrapper
,支持链式调用(如eq
、like
、orderBy
),简化复杂查询的编写。
三、性能差异:功能增强是否带来额外开销?
3.1 MyBatis 的性能优势
MyBatis 因为需要手动编写 SQL,能够针对具体场景优化查询语句。例如,对于复杂的关联查询,开发者可以精细控制 SQL 的执行效率。
3.2 MyBatis Plus 的性能表现
MP 的自动功能可能引入轻微的性能开销,但其核心设计通过反射和缓存机制尽可能减少影响。例如:
- SQL 生成缓存:MP 会缓存根据实体类生成的 SQL,避免重复计算。
- 条件拼接优化:
QueryWrapper
的链式操作最终会生成简洁的 SQL,与手动编写的效果接近。
测试案例:
假设一个包含 10 万条数据的表,执行查询操作时:
- MyBatis:平均响应时间约 50ms
- MyBatis Plus:平均响应时间约 55ms(差异可忽略,因 MP 的 SQL 生成逻辑已高度优化)
3.3 性能调优建议
- 对于高频操作,建议直接使用 MyBatis 手动优化 SQL。
- 在 MP 中,可通过
@TableName
注解优化表名映射,或通过SqlExplain
工具分析 SQL 执行计划。
四、适用场景对比:如何选择?
4.1 MyBatis 的适用场景
- 复杂业务逻辑:需要高度定制化的 SQL(如复杂的子查询、窗口函数)。
- 性能敏感场景:对毫秒级响应有严格要求的系统(如高频交易系统)。
- 团队习惯:已有 MyBatis 技术栈积累,或需要更灵活的 SQL 控制权。
4.2 MyBatis Plus 的适用场景
- 快速开发:中小型项目或 MVP(最小可行产品)阶段,追求开发效率。
- 通用 CRUD 场景:数据操作以增删改查为主,无需复杂 SQL。
- 团队标准化:希望统一团队的代码风格,减少重复劳动。
实际案例:
某电商项目中,用户管理模块(增删改查为主)使用 MP 实现,而订单计算模块(需复杂聚合查询)使用 MyBatis,最终开发周期缩短 30%,性能达标。
五、结论
MyBatis 和 MyBatis Plus 的区别本质是“灵活性”与“效率”的权衡:
- MyBatis 是一个基础工具,适合需要精细控制 SQL 的场景,适合对性能敏感或复杂业务的开发者。
- MyBatis Plus 是一个增强框架,通过封装通用功能提升开发效率,适合快速迭代或标准化开发的团队。
对于初学者,建议从 MyBatis 入门,理解 SQL 映射与 ORM 基础,再逐步学习 MyBatis Plus 的高级功能。对于中级开发者,可根据项目需求灵活选择:若需快速实现基础功能,MP 是不二之选;若需极致优化或复杂逻辑,则 MyBatis 更为合适。
通过本文的对比分析,开发者可以更清晰地理解两者的定位,并在实际项目中做出合理决策。