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 原生能力。
相关推荐
momo1 天前
Java+WebAI黑马知识点
java·spring boot·mybatis
snow@li1 天前
MyBatis:动态 SQL 全景梳理
数据库·sql·mybatis
就改了1 天前
Mybatis快速入门大全(详细版)
java·spring boot·mybatis
qq_171538852 天前
深入浅出 MyBatis XML:从入门到精通
xml·java·mybatis
万亿少女的梦1682 天前
基于SSM、JSP与MySQL的秦皇岛旅游服务管理系统设计与实现
mysql·mybatis·ssm·jsp·spring mvc
jaysee-sjc2 天前
【JavaWeb】JDBC与Mybatis零基础入门详解
java·开发语言·前端·mybatis
dear_bi_MyOnly2 天前
【MyBatis 操作数据库】
java·数据库·学习·mybatis·学习方法
用户3126874877202 天前
分页插件到底怎么拦截 SQL?MyBatis-Plus 插件机制原理一次讲透
mybatis
马优晨3 天前
pring Boot + MyBatis + Redis 项目分层架构详解 —— 各层职责、关系与工作流程
架构·mybatis·spring项目分层架构详解·spring项目架构详解·spring各层职责·spring关系与工作流程
Listen·Rain3 天前
用AI开发出一个AI
java·人工智能·spring boot·tomcat·intellij-idea·mybatis·visual studio