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 原生方式即可。
相关推荐
侠客行031716 小时前
Mybatis连接池实现及池化模式
java·mybatis·源码阅读
蛇皮划水怪16 小时前
深入浅出LangChain4J
java·langchain·llm
灰子学技术17 小时前
go response.Body.close()导致连接异常处理
开发语言·后端·golang
老毛肚17 小时前
MyBatis体系结构与工作原理 上篇
java·mybatis
风流倜傥唐伯虎18 小时前
Spring Boot Jar包生产级启停脚本
java·运维·spring boot
二十雨辰18 小时前
[python]-AI大模型
开发语言·人工智能·python
Yvonne爱编码18 小时前
JAVA数据结构 DAY6-栈和队列
java·开发语言·数据结构·python
Re.不晚18 小时前
JAVA进阶之路——无奖问答挑战1
java·开发语言
你这个代码我看不懂18 小时前
@ConditionalOnProperty不直接使用松绑定规则
java·开发语言
pas13618 小时前
41-parse的实现原理&有限状态机
开发语言·前端·javascript