Mybatis和Mybatis-plus区别

你想了解 MyBatis 和 MyBatis-Plus 的核心区别,本质是要搞清楚 "原生工具" 和 "增强工具" 的定位差异 ------MyBatis 是基础的持久层框架,主打灵活的 SQL 控制;MyBatis-Plus(MP)是基于 MyBatis 的增强工具,在不改变原生用法的前提下,大幅简化 CRUD 操作,新手上手更快。下面从核心维度拆解,结合实战示例帮你理解。

一、核心定位与核心差异(新手必看)

对比维度 MyBatis MyBatis-Plus (MP)
核心定位 半自动 ORM 框架,专注 SQL 灵活控制 MyBatis 增强工具,主打 "无 SQL" 快速 CRUD
CRUD 操作 需手写 XML / 注解 SQL(增删改查全要写) 内置通用 Mapper,一键实现单表 CRUD,无需写 SQL
开发效率 低(需写大量 SQL) 高(单表操作零 SQL,复杂 SQL 仍兼容 MyBatis)
学习成本 高(需掌握 XML / 注解 SQL、动态 SQL) 低(会 MyBatis 基础即可,新增 API 简单)
功能扩展 基础功能(SQL 执行、结果映射),需自己扩展 内置分页、逻辑删除、自动填充、条件构造器等
适用场景 复杂 SQL(多表联查、存储过程、动态 SQL) 单表操作为主,复杂 SQL 仍用 MyBatis 原生方式

二、实战示例:直观感受差异

1. 单表查询(根据 ID 查用户)
MyBatis 实现(需手写 SQL)
  • 第一步:编写 Mapper 接口

java

运行

复制代码
public interface UserMapper extends BaseMapper<User> {
    // 需定义方法
    User selectById(Long id);
}
  • 第二步:编写 XML 映射文件(UserMapper.xml)

xml

复制代码
<mapper namespace="com.example.mapper.UserMapper">
    <select id="selectById" resultType="com.example.entity.User">
        SELECT id, name, age, email FROM user WHERE id = #{id}
    </select>
</mapper>
MyBatis-Plus 实现(零 SQL)
  • 仅需继承 MP 的 BaseMapper,直接调用内置方法:

java

运行

复制代码
// 继承MP的BaseMapper,无需写任何方法和SQL
public interface UserMapper extends BaseMapper<User> {
}

// 业务层直接调用
User user = userMapper.selectById(1L); // 一键查询,无需手写SQL
2. 分页查询(按年龄查用户,分页返回)
MyBatis 实现(需手写分页 SQL + 配置分页插件)

xml

复制代码
<!-- XML中手写分页SQL(以MySQL为例) -->
<select id="selectUserByAge" resultType="com.example.entity.User">
    SELECT id, name, age, email FROM user WHERE age > #{age}
    LIMIT #{pageNum}, #{pageSize}
</select>
MyBatis-Plus 实现(内置分页插件,一行代码)

java

运行

复制代码
// 1. 配置分页插件(全局配置一次即可)
@Configuration
public class MyBatisPlusConfig {
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }
}

// 2. 业务层直接分页查询
Page<User> page = new Page<>(1, 10); // 第1页,每页10条
QueryWrapper<User> wrapper = new QueryWrapper<User>().gt("age", 18); // 年龄>18
IPage<User> userPage = userMapper.selectPage(page, wrapper); // 一键分页,无需手写SQL

三、关键功能对比(MP 新增核心功能)

MP 在 MyBatis 基础上新增的高频实用功能:

  1. 逻辑删除 :无需改 SQL,配置后自动将 delete 操作转为 update(如deleted=1),查询自动过滤已删除数据;
  2. 自动填充:配置创建时间、更新时间、创建人等字段,新增 / 更新时自动赋值,无需手动 set;
  3. 条件构造器(QueryWrapper) :用链式调用拼接动态条件,替代 MyBatis 的<where>``<if>等动态 SQL;
  4. 代码生成器:一键生成 Entity、Mapper、Service、Controller 全套代码,彻底解放重复劳动;
  5. 多租户插件:无需改 SQL,自动给所有查询加租户 ID 条件,适配多租户系统。

四、选型建议(该用哪个?)

  1. 选 MyBatis

    • 项目以复杂 SQL 为主(多表联查、嵌套查询、存储过程);
    • 需极致控制 SQL 执行(如优化性能、自定义 SQL 逻辑);
    • 团队已熟练掌握 MyBatis,无需额外学习 MP。
  2. 选 MyBatis-Plus

    • 单表操作占比高(80% 以上 CRUD 是单表);
    • 追求开发效率,想减少重复 SQL 编写;
    • 新手团队,降低学习成本和出错概率;
    • 需快速实现分页、逻辑删除等通用功能。

注意:MP 完全兼容 MyBatis,可混合使用 ------ 单表用 MP 的无 SQL 方式,复杂 SQL 用 MyBatis 的 XML / 注解方式,兼顾效率和灵活性。


总结

  1. MyBatis 是 "基础款",灵活但需手写大量 SQL,适合复杂场景;
  2. MyBatis-Plus 是 "增强款",基于 MyBatis 封装,单表 CRUD 零 SQL,开发效率翻倍,且不丢失灵活性;
  3. 实际开发中,90% 的业务场景(尤其是中小型项目)优先选 MP,复杂 SQL 仍用 MyBatis 原生方式即可。
相关推荐
NE_STOP15 分钟前
MyBatis-mybatis入门与增删改查
java
孟陬3 小时前
国外技术周刊 #1:Paul Graham 重新分享最受欢迎的文章《创作者的品味》、本周被划线最多 YouTube《如何在 19 分钟内学会 AI》、为何我不
java·前端·后端
想用offer打牌4 小时前
一站式了解四种限流算法
java·后端·go
华仔啊4 小时前
Java 开发千万别给布尔变量加 is 前缀!很容易背锅
java
也些宝5 小时前
Java单例模式:饿汉、懒汉、DCL三种实现及最佳实践
java
Nyarlathotep01135 小时前
SpringBoot Starter的用法以及原理
java·spring boot
wuwen55 小时前
WebFlux + Lettuce Reactive 中 SkyWalking 链路上下文丢失的修复实践
java
SimonKing6 小时前
GitHub 10万星的OpenCode,正在悄悄改变我们的工作流
java·后端·程序员
Seven977 小时前
虚拟线程深度解析:轻量并发编程的未来趋势
java