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 原生方式即可。
相关推荐
企业对冲系统官2 小时前
期货与期权一体化平台风险收益评估方法与模型实现
运维·服务器·开发语言·数据库·python·自动化
lkbhua莱克瓦242 小时前
JavaWeb技术概述
java·javaweb·web
爬山算法2 小时前
Hibernate(46) Hibernate的配置文件如何加载?
java·后端·hibernate
风景的人生2 小时前
springboot项目用maven插件打包时候报错
java·spring boot·maven
二哈喇子!2 小时前
基于SSM框架的网上商城购物系统的设计与实现(开源项目——实现CRUD功能整体流程超详细)
java·spring·mybatis·ssm
容沁风2 小时前
pycharm启动报错incompatible with Text-specific LCD
java·pycharm
ceclar1232 小时前
C++使用numeric
开发语言·c++
zh_xuan2 小时前
kotlin函数的一些用法
开发语言·kotlin
馨谙2 小时前
面试题----用户,组,su,su-,sudo,sudo-,nologin shell
java·前端·数据库