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 原生方式即可。
相关推荐
daidaidaiyu6 小时前
ThingsBoard 集群的核心逻辑源码分析
java
2601_962885726 小时前
如何用 Python 自动识别股票的支撑位与压力位?
开发语言·python
爱吃奥利奥_wen6 小时前
面向对象三板斧:封装、继承、多态,到底在“装“什么、“承“什么、“变“什么?
开发语言·经验分享·c#
我可能是个假开发7 小时前
FTP Unicode 文件名导致 `550` 的问题分析与解决方案
java·开发语言·spring
caoerzhong7 小时前
中小企业上 WMS 该先上哪几块:JeeWMS 开源 Java 仓库管理系统的分批上线清单
java·python·开源
WL学习笔记8 小时前
日期类(C++)
开发语言·c++·日期类实现
【JAVA】玩家8 小时前
Spring核心原理全解析:从零到生产实战
java·后端·spring
Wang's Blog8 小时前
Java框架 SpringCloud 快速入门: 实现 Feign 最佳实践(抽取方式)
java·spring cloud
谢亮_vipxieliang9 小时前
Go map与结构体的正确使用
开发语言·golang·哈希算法
H.莓飛9 小时前
【C++】命名空间、缺省参数、函数重载与引用
linux·开发语言·c++·visual studio