mybatis和mybatis_plus的区别(超详细)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 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 后端开发中,持久层框架的选择直接影响着开发效率与代码质量。MyBatisMyBatis-Plus 是当前最流行的 ORM(对象关系映射)框架之一,两者都基于 MyBatis 进行了扩展,但设计理念和使用场景存在显著差异。本文将从核心功能、代码实践、性能优化等维度,对比分析两者的区别,帮助开发者根据项目需求做出合理选择。


一、核心功能与设计理念对比

1.1 MyBatis 的基础特性

MyBatis 是一款专注于 SQL 手动编写与映射的框架,其核心设计理念是灵活性优先。开发者需要通过 XML 文件或注解定义 SQL 语句,并手动管理 SQL 参数和结果的映射关系。这种设计使得 MyBatis 在复杂查询场景下具有极高的可控性,但对开发者编写和维护 SQL 的能力要求较高。

比喻:如果将 MyBatis 比作一辆手动挡汽车,开发者需要手动控制每个齿轮的切换(SQL 的编写与映射),虽然操作复杂,但能精确掌控每一刻的驾驶状态。

1.2 MyBatis-Plus 的增强特性

MyBatis-Plus 是 MyBatis 的增强工具包,其核心目标是简化开发。它基于 MyBatis 提供了大量开箱即用的功能,如 CRUD 操作的自动实现、Lambda 表达式支持、分页插件集成等。通过减少重复代码,MyBatis-Plus 显著提升了开发效率,同时保留了 MyBatis 的核心优势。

比喻:MyBatis-Plus 则像一辆自动挡汽车,它接管了大部分繁琐的操作(如 SQL 生成、参数绑定),开发者只需关注业务逻辑,即可实现“一键启动”。


二、代码实践对比:从简单到复杂场景

2.1 基础 CRUD 操作

MyBatis 的实现方式

在 MyBatis 中,开发者需要为每个 CRUD 操作编写对应的 SQL 语句,并通过 XML 或注解关联 Mapper 接口。例如,实现一个简单的用户查询:

// UserMapper.xml
<select id="selectById" resultType="com.example.User">
  SELECT * FROM user WHERE id = #{id}
</select>

// UserMapper.java
public interface UserMapper {
    User selectById(Long id);
}

MyBatis-Plus 的实现方式

MyBatis-Plus 提供了 BaseMapper 接口,内置了通用的 CRUD 方法。开发者只需继承 BaseMapper,即可直接调用 selectById 等方法:

// UserMapper.java
public interface UserMapper extends BaseMapper<User> {}

// 使用示例
User user = userMapper.selectById(1L);

对比结论:MyBatis-Plus 在基础操作上减少了 50% 以上的代码量,且无需手动编写 SQL。


2.2 复杂查询与条件构造

MyBatis 的条件组合

在 MyBatis 中,若需动态拼接 SQL(如多条件查询),通常需要通过 <if> 标签或 @Param 注解实现:

<!-- UserMapper.xml -->
<select id="selectByCondition" resultType="User">
  SELECT * FROM user 
  WHERE 1=1
  <if test="name != null">
    AND name LIKE CONCAT('%', #{name}, '%')
  </if>
  <if test="age != null">
    AND age >= #{age}
  </if>
</select>

MyBatis-Plus 的 QueryWrapper

MyBatis-Plus 提供了 QueryWrapper 类,允许通过链式调用构建动态条件:

QueryWrapper<User> wrapper = new QueryWrapper<>();
if (name != null) {
    wrapper.like("name", name);
}
if (age != null) {
    wrapper.ge("age", age);
}
List<User> users = userMapper.selectList(wrapper);

对比结论:MyBatis-Plus 的条件构造方式更直观,且避免了 XML 的冗余配置。


2.3 分页功能

MyBatis 的分页实现

MyBatis 本身不提供分页功能,需依赖第三方插件(如 PageHelper)或手动拼接 LIMIT 子句。例如:

// 使用 PageHelper 插件
PageHelper.startPage(pageNum, pageSize);
List<User> users = userMapper.selectAll();
PageInfo<User> pageInfo = new PageInfo<>(users);

MyBatis-Plus 的内置分页

MyBatis-Plus 内置了分页插件,只需在配置中启用,即可通过 Page 对象实现分页:

// 启用分页插件(配置阶段)
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

// 使用分页
Page<User> page = new Page<>(pageNum, pageSize);
userMapper.selectPage(page, new QueryWrapper<>());

对比结论:MyBatis-Plus 的分页功能更集成化,减少了插件依赖和配置复杂度。


三、性能与扩展性分析

3.1 SQL 执行性能

  • MyBatis:由于 SQL 语句完全由开发者控制,其性能表现取决于手写 SQL 的优化程度。例如,合理使用索引、避免全表扫描等。
  • MyBatis-Plus:虽然其自动生成的 SQL 能满足大多数场景,但在复杂查询(如多表关联、子查询)中,可能因默认 SQL 的简单性导致性能损耗。

比喻:MyBatis 是一位经验丰富的机械师,能精确调整每个零件以达到最佳性能;而 MyBatis-Plus 更像一辆出厂设置良好的汽车,虽能稳定运行,但极端场景可能需手动干预。

3.2 插件与扩展能力

  • MyBatis:提供了丰富的插件接口(如 Interceptor),允许开发者自定义 SQL 解析、参数绑定等逻辑。例如,通过拦截器实现日志记录或权限控制。
  • MyBatis-Plus:虽然也支持插件,但其核心功能已高度封装,部分底层细节对开发者不透明。例如,若需修改 SQL 生成规则,需深入理解其源码逻辑。

四、适用场景与选型建议

4.1 MyBatis 的优势场景

  • 复杂业务逻辑:当项目需要高度定制化的 SQL(如复杂的存储过程、数据库特定语法)时,MyBatis 的灵活性更占优势。
  • 小型项目:团队规模较小或开发周期紧张时,直接使用 MyBatis 可避免学习新框架的成本。

4.2 MyBatis-Plus 的优势场景

  • 快速开发需求:在中大型项目中,MyBatis-Plus 的代码生成器(mp 工具)可自动生成实体类、Mapper 接口及 CRUD 代码,显著提升效率。
  • 团队协作规范:其标准化的 API 设计能减少团队成员间的代码风格差异,降低维护成本。

4.3 选型建议

  • 初级开发者:优先选择 MyBatis-Plus,通过其简化功能快速上手,逐步学习 MyBatis 的底层原理。
  • 复杂项目:若需极致的 SQL 控制权,或需与特定数据库功能(如 Oracle 分区表)深度集成,MyBatis 更为合适。

五、总结

MyBatis 和 MyBatis-Plus 的区别 核心体现在开发效率与控制权的平衡上。MyBatis 是一款“纯粹”的持久层框架,适合需要精细控制 SQL 的场景;而 MyBatis-Plus 通过封装通用功能,将开发者从重复劳动中解放出来,更适合追求高效开发的团队。

在实际项目中,两者并非完全对立:MyBatis-Plus 可无缝集成到 MyBatis 项目中,开发者可根据需求灵活组合使用。例如,使用 MyBatis-Plus 处理基础 CRUD,同时通过 MyBatis 的 XML 实现复杂查询,既能提升效率,又保留了灵活性。

选择合适的工具,才能让代码更优雅,让开发更高效。

最新发布