mybatis和mybatisplus的区别(手把手讲解)

更新时间:

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

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

在 Java 后端开发领域,MyBatis 和 MyBatis-Plus 是两个广受关注的持久层框架。两者均基于 SQL 语句与数据库进行交互,但 MyBatis-Plus 作为 MyBatis 的增强工具,通过封装和扩展,显著提升了开发效率。对于编程初学者和中级开发者而言,理解两者的核心区别,能够帮助开发者在项目选型时做出更合理的选择。本文将从功能定位、开发效率、配置复杂度、数据操作扩展等多个维度展开分析,并通过实际案例对比,帮助读者快速掌握两者的差异。


一、核心功能定位对比

1.1 MyBatis:基础持久层框架

MyBatis 是一个专注于 SQL 语句映射的持久层框架。它的核心功能是将 Java 对象与数据库表字段进行映射,并通过 XML 或注解的方式定义 SQL 语句。开发者需要手动编写 SQL 代码,并处理 SQL 语句与对象之间的转换关系。

功能特点:

  • 灵活性高:支持任意复杂的 SQL 语句,适合需要精细控制的场景。
  • 学习曲线平缓:适合对 SQL 语句有较强掌控力的开发者。
  • 配置繁琐:对于重复性操作(如分页、批量插入)需要手动编写大量代码。

示例代码(MyBatis 基础用法):

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

// Service 层调用  
public User getUserById(Long id) {  
  return userMapper.selectById(id);  
}  

1.2 MyBatis-Plus:MyBatis 的增强工具

MyBatis-Plus 是 MyBatis 的增强工具,通过封装通用 CRUD 操作、提供代码生成器和插件系统,大幅减少了重复性代码的编写。它在保留 MyBatis 灵活性的基础上,提供了开箱即用的高级功能。

功能特点:

  • 核心功能增强:内置通用 Mapper 接口,支持自动填充、乐观锁、逻辑删除等特性。
  • 代码生成器:可自动生成 Entity、Mapper、Service 等代码骨架。
  • 性能优化:通过分页插件、条件构造器等减少 SQL 语句的冗余。

示例代码(MyBatis-Plus 简化 CRUD):

// 继承 BaseMapper 的 UserMapper 接口  
public interface UserMapper extends BaseMapper<User> {}  

// Service 层调用  
public User getUserById(Long id) {  
  return userMapper.selectById(id);  
}  

比喻说明:
如果 MyBatis 是一把基础扳手,开发者需要手动对准每个螺丝进行操作,那么 MyBatis-Plus 就像一个多功能工具箱,内置了针对常见场景的预设工具,能够快速完成标准化操作,同时保留了更换工具头(自定义 SQL)的灵活性。


二、开发效率对比

2.1 MyBatis 的开发流程

在 MyBatis 中,每个数据库操作都需要以下步骤:

  1. 创建对应的 Mapper 接口;
  2. 在 XML 文件中编写 SQL 语句;
  3. 在 Service 层调用 Mapper 方法。

示例:批量插入操作

<!-- MyBatis XML 中的批量插入语句 -->  
<insert id="insertBatch">  
  INSERT INTO user (name, age) VALUES  
  <foreach item="item" collection="list" separator=",">  
    (#{item.name}, #{item.age})  
  </foreach>  
</insert>  

2.2 MyBatis-Plus 的开发流程

MyBatis-Plus 通过内置的 BaseMapper 接口,提供了通用方法,无需手动编写 SQL:

// 直接调用 BaseMapper 的批量插入方法  
public void batchInsert(List<User> users) {  
  userMapper.insertBatchSomeColumn(users);  
}  

效率对比:
| 功能 | MyBatis 手动编写代码量 | MyBatis-Plus 代码量 |
|--------------------|-----------------------|--------------------|
| 单条插入 | 需编写 Mapper 接口 + XML | 1 行代码 |
| 分页查询 | 需编写分页逻辑 | 通过插件自动实现 |
| 条件查询 | 需拼接动态 SQL | 通过 Wrapper 构造条件 |


三、配置复杂度对比

3.1 MyBatis 的配置

MyBatis 需要手动配置以下内容:

  • 数据库连接参数(URL、驱动类等);
  • 映射文件路径(XML 或注解);
  • 日志插件、分页插件等扩展功能。

示例:分页插件的手动配置

@Configuration  
public class MyBatisConfig {  
  @Bean  
  public PaginationInterceptor paginationInterceptor() {  
    return new PaginationInterceptor();  
  }  
}  

3.2 MyBatis-Plus 的配置

MyBatis-Plus 提供了 AutoConfiguration,通过简单的注解即可启用核心功能:

// 通过 Starter 自动配置  
@EnableTransactionManagement  
@EnableMapperScan("com.example.mapper")  
public class Application {  
  // 主程序入口  
}  

配置对比:
| 功能 | MyBatis 配置步骤 | MyBatis-Plus 配置步骤 |
|--------------------|------------------|-----------------------|
| 启用分页插件 | 需手动编写 Bean | 通过注解或属性启用 |
| 逻辑删除功能 | 需自定义 SQL | 通过注解 @TableLogic |


四、数据操作扩展能力对比

4.1 MyBatis 的扩展方式

MyBatis 通过以下方式实现扩展:

  • XML 标签:使用 <foreach><if> 等标签动态生成 SQL;
  • 自定义插件:通过拦截器(Interceptor)修改执行流程。

示例:通过插件实现 SQL 日志打印

@Intercepts({@Signature(type = Executor.class, method = "query", args = {MappedStatement.class, Object.class, RowBounds.class, ResultHandler.class})})  
public class LogInterceptor implements Interceptor {  
  @Override  
  public Object intercept(Invocation invocation) throws Throwable {  
    // 打印 SQL 语句  
    return invocation.proceed();  
  }  
}  

4.2 MyBatis-Plus 的扩展方式

MyBatis-Plus 提供了更便捷的扩展机制:

  • 条件构造器(QueryWrapper):通过链式调用构建复杂查询条件;
  • 自定义全局配置:通过 GlobalConfiguration 设置逻辑删除、驼峰命名等规则。

示例:复杂条件查询

QueryWrapper<User> wrapper = new QueryWrapper<>();  
wrapper.eq("age", 25)  
       .like("name", "张")  
       .orderByDesc("create_time");  
List<User> users = userMapper.selectList(wrapper);  

能力对比:
| 功能 | MyBatis 实现复杂度 | MyBatis-Plus 实现复杂度 |
|--------------------|--------------------|-------------------------|
| 动态条件查询 | 需拼接字符串 | 链式调用 QueryWrapper |
| 逻辑删除 | 需修改所有 SQL | 通过注解自动生效 |


五、性能影响对比

5.1 MyBatis 的性能表现

MyBatis 的性能主要取决于 SQL 语句的优化程度:

  • 手动编写 SQL 时,开发者可针对具体场景进行调优;
  • 但重复代码过多可能导致维护成本增加。

5.2 MyBatis-Plus 的性能表现

MyBatis-Plus 的核心功能(如分页插件、批量操作)经过优化,但在以下场景可能产生性能差异:

  • 复杂查询:对于需要多表联查或复杂计算的场景,MyBatis 的灵活性更占优势;
  • 简单 CRUD:MyBatis-Plus 的通用方法性能与原生 MyBatis 差异可忽略。

性能测试示例(理论值):
| 操作类型 | MyBatis 平均响应时间 | MyBatis-Plus 平均响应时间 |
|------------------|---------------------|---------------------------|
| 单条插入 | 5ms | 4.5ms |
| 千条批量插入 | 800ms | 750ms |


六、适用场景建议

6.1 选择 MyBatis 的场景

  • 需要精细控制 SQL 语句(如复杂的聚合查询、分库分表场景);
  • 团队对 SQL 优化有丰富经验;
  • 项目规模较小,或对灵活性要求高于开发效率。

6.2 选择 MyBatis-Plus 的场景

  • 快速开发需求高,希望减少重复代码;
  • 项目需要标准化的通用功能(如逻辑删除、乐观锁);
  • 团队希望统一开发规范,降低维护成本。

七、总结

通过对比可见,MyBatis 和 MyBatis-Plus 在功能定位、开发效率、配置复杂度等方面存在显著差异。MyBatis 更适合需要高度定制化的场景,而 MyBatis-Plus 则通过封装和扩展,为开发者提供了更高效、便捷的开发体验。对于大多数企业级应用,尤其是中等规模的项目,MyBatis-Plus 的优势更为明显。但若项目涉及复杂的数据库交互逻辑,结合两者的优势(如 MyBatis-Plus 处理通用操作,MyBatis 处理特殊 SQL)可能是更优的选择。

最后建议:

  • 新手开发者可优先学习 MyBatis 的基础操作,再逐步了解 MyBatis-Plus 的增强功能;
  • 中级开发者可根据项目需求灵活选择,或结合两者实现更灵活的解决方案。

最新发布