MyBatis 与 MyBatis-Plus 完整对比讲解

一、MyBatis 原生框架

1. 定位

轻量级持久层 ORM 框架,半自动 ORM,底层封装 JDBC,解决原生 JDBC 繁琐的代码(连接、预编译、结果集手动封装)。

2. 核心特点

  1. SQL 与代码分离 SQL 写在 XML / 注解中,业务 SQL 集中管理,方便 DBA 优化、打印慢 SQL。
  2. 灵活可控 多表联查、复杂统计、存储过程、自定义函数都能手写原生 SQL,无限制。
  3. 半自动 基础增删改查需要自己写 XML SQL;只做映射,不提供内置通用方法。
  4. 层级结构
    • Mapper 接口:定义抽象方法
    • Mapper.xml:绑定接口,编写对应 SQL
    • PO 实体:和数据库表映射

3. 基础使用示例

实体 Order

java

运行

复制代码
public class Order {
    private Long id;
    private String orderNo;
}

Mapper 接口

java

运行

复制代码
public interface OrderMapper {
    Order selectById(Long id);
    int insert(Order order);
}

Mapper.xml(必须手写 SQL)

xml

复制代码
<select id="selectById" resultType="Order">
    select id,order_no from order_info where id = #{id}
</select>
<insert id="insert">
    insert into order_info(id,order_no) values(#{id},#{orderNo})
</insert>

4. MyBatis 优缺点

优点

  1. SQL 完全自主可控,复杂查询无压力;
  2. 轻量、无过多封装,学习成本低;
  3. 支持动态 SQL <if> <where> <foreach>
  4. 兼容性强,所有数据库通用。

缺点

  1. 单表 CRUD 重复工作量大,每张表都要写 insert/select/update/delete;
  2. 分页、条件查询需要自己写 limit、拼接 where;
  3. 没有内置主键生成、逻辑删除、自动填充、分页工具。

二、MyBatis-Plus(简称 MP)

1. 定位

MyBatis 的增强工具,只增强不修改 ,完全兼容原生 MyBatis。 目标:简化单表操作,消除重复 CRUD 代码,复杂多表查询依然复用原生 MyBatis XML。

2. 核心设计思想

  • 单表通用操作:内置封装,一行代码搞定;
  • 复杂多表、统计、自定义 SQL:仍然写 XML,不限制原有能力;
  • 大量内置实用功能,开箱即用。

3. 内置核心能力

(1)通用 Mapper,自带 CRUD,无需写 XML

BaseMapper<T> 内置方法: insertdeleteByIdupdateByIdselectByIdselectListselectCount

java

运行

复制代码
// 继承BaseMapper,不用写任何xml就能使用
public interface OrderMapper extends BaseMapper<Order> {
}

业务层直接调用:

java

运行

复制代码
// 根据id查询,不用写SQL
Order order = orderMapper.selectById(1L);
// 新增
orderMapper.insert(order);

(2)条件构造器 QueryWrapper / LambdaQueryWrapper

不用拼接 SQL,Java 代码组装查询条件,杜绝字符串硬编码、防止字段名写错。

java

运行

复制代码
// 普通
QueryWrapper<Order> wrapper = new QueryWrapper<>();
wrapper.eq("order_no","OD20260710")
       .gt("total_amount",100);

// Lambda 推荐,编译期校验字段,无字符串写错风险
LambdaQueryWrapper<Order> lambda = new LambdaQueryWrapper<>();
lambda.eq(Order::getOrderNo,"OD20260710");
List<Order> list = orderMapper.selectList(lambda);

(3)分页插件

引入插件后一行分页,不用手写 limit

java

运行

复制代码
Page<Order> page = new Page<>(1,10);
Page<Order> result = orderMapper.selectPage(page, wrapper);

(4)自动填充(创建时间、更新时间)

通过注解 @TableField(fill = FieldFill.INSERT) + 元对象处理器,自动赋值,不用每次业务手动 set createTime。

(5)逻辑删除

全局配置后调用 deleteById 执行 UPDATE 软删除,而非物理 DELETE,适配电商业务。

(6)主键策略自动管理

支持自增、雪花算法、UUID,全局统一配置。

(7)代码生成器

一键生成 Controller、Service、Mapper、XML、实体类,大幅提升开发速度。

4. MP 兼容原生 MyBatis

如果遇到多表联查、复杂统计、自定义 SQL,完全可以继续写 Mapper.xml,互不冲突:

java

运行

复制代码
public interface OrderMapper extends BaseMapper<Order> {
    // 自定义多表联查,自己写xml
    List<OrderVO> selectOrderWithProduct();
}

5. MP 优缺点

优点

  1. 单表零 SQL 开发,极大减少重复工作量;
  2. Lambda 构造器避免字段字符串写错;
  3. 分页、逻辑删除、自动填充、主键策略一站式解决方案;
  4. 代码生成器快速搭建 CRUD;
  5. 完全兼容原生 MyBatis,无侵入,随时混用 XML。

缺点

  1. 复杂多表、嵌套统计场景,封装优势失效,还是要手写 SQL;
  2. 过度依赖封装会弱化手写 SQL 能力,排查底层 SQL 时需要了解 MP 执行逻辑;
  3. 版本升级偶尔会出现配置类变动。

三、MyBatis vs MyBatis-Plus 核心对比

表格

对比项 MyBatis 原生 MyBatis-Plus
关系 基础持久层框架 MyBatis 增强工具,基于 MyBatis
单表 CRUD 每张表手写 XML,重复代码多 BaseMapper 内置,零 XML
条件查询 手动拼接 XML 动态 SQL Wrapper 构造器,Java 代码链式调用
分页 手动写 limit,封装工具类 内置分页插件,开箱即用
自动填充时间 自己封装工具赋值 @TableField 自动填充
逻辑删除 自己加标记、修改 SQL 全局配置,delete 自动软删
Lambda 查询 不支持,只能写字段字符串 LambdaQueryWrapper,编译校验
多表联查 原生支持,自由写 XML 兼容原生 XML,复杂查询仍手写
代码生成 需要自己写模板 内置生成器一键全套代码
学习门槛 低,只掌握 XML、动态 SQL 略高,需要额外掌握 Wrapper、插件配置

四、项目选型建议

1. 中小型电商、管理系统(推荐 MyBatis-Plus)

表多、单表操作频繁、简单查询占 80%,MP 节省大量开发时间;复杂订单 / 支付多表查询保留 XML 手写 SQL,两者结合。

2. 大数据、复杂报表、多关联复杂 SQL 项目

纯 MyBatis 更合适,减少中间封装层,SQL 完全自主可控,便于 DBA 深度优化。

五、开发最佳实践(电商项目通用)

  1. 单表简单增删改查:直接使用 MP BaseMapper + LambdaWrapper;
  2. 多表联查、复杂统计、自定义复杂 SQL:新建 XML 手写原生 MyBatis;
  3. 统一开启逻辑删除、自动填充创建 / 更新时间;
  4. 分页统一使用 MP Page 对象,不手动拼接 limit;
  5. 禁止硬编码字段字符串,一律使用 LambdaQueryWrapper;
  6. 代码生成器生成基础模板,减少重复创建文件工作。

六、常见误区澄清

  1. ❌ MyBatis-Plus 替代 MyBatis ✅ MP 只是增强,底层依旧运行 MyBatis,必须引入 mybatis 依赖。
  2. ❌ 使用 MP 后不能写 XML ✅ 完全可以混用,复杂业务强烈建议手写 XML。
  3. ❌ MP 只能做单表查询 ✅ 多表场景交给原生 XML,MP 不限制任何 MyBatis 原生能力。
相关推荐
SQL-First布道者7 小时前
Spring JDBC Ultra 十边型战士
java·spring boot·后端·mysql·spring·mybatis
han_hanker1 天前
sql语法 MyBatis <foreach> 标签详解
windows·sql·mybatis
ByWalker_2 天前
web应用技术—MyBatis入门
java·数据库·mybatis·lombok
ylscode3 天前
Cloudflare Workers Cache 深度解析:边缘缓存如何重塑无服务器性能边界
java·spring·mybatis
risc1234565 天前
Roaring Bitmap
java·开发语言·mybatis
Wang's Blog5 天前
JavaWeb快速入门: MyBatis入门与实战
java·mybatis
前端炒粉6 天前
马克思主义基本原理在MyBatis框架中的指导作用探析
mybatis·马克思主义
.Hypocritical.6 天前
MyBatis-Plus笔记
mybatis·mybatisplus
折哥的程序人生 · 物流技术专研6 天前
Java面试通关⑩:MyBatis核心源码全集
mybatis·校招·java面试·orm框架·源码解析·数据库交互·社招