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 核心区别总结

功能维度MyBatisMyBatis Plus
SQL 编写需手动编写 SQL 或通过注解定义自动根据实体类生成 SQL,仅需少量自定义逻辑
CRUD 支持需自行实现增删改查方法内置 BaseMapper 接口,提供通用的 CRUD 方法(如 saveupdatedelete
扩展性支持通过插件机制扩展功能(如分页、日志)集成常用插件(如分页、乐观锁),并提供更简洁的 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 提供 QueryWrapperLambdaQueryWrapper,支持链式调用(如 eqlikeorderBy),简化复杂查询的编写。

三、性能差异:功能增强是否带来额外开销?

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 更为合适。

通过本文的对比分析,开发者可以更清晰地理解两者的定位,并在实际项目中做出合理决策。

最新发布