一、MyBatis 原生框架
1. 定位
轻量级持久层 ORM 框架,半自动 ORM,底层封装 JDBC,解决原生 JDBC 繁琐的代码(连接、预编译、结果集手动封装)。
2. 核心特点
- SQL 与代码分离 SQL 写在 XML / 注解中,业务 SQL 集中管理,方便 DBA 优化、打印慢 SQL。
- 灵活可控 多表联查、复杂统计、存储过程、自定义函数都能手写原生 SQL,无限制。
- 半自动 基础增删改查需要自己写 XML SQL;只做映射,不提供内置通用方法。
- 层级结构
- 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 优缺点
优点
- SQL 完全自主可控,复杂查询无压力;
- 轻量、无过多封装,学习成本低;
- 支持动态 SQL
<if> <where> <foreach>; - 兼容性强,所有数据库通用。
缺点
- 单表 CRUD 重复工作量大,每张表都要写 insert/select/update/delete;
- 分页、条件查询需要自己写 limit、拼接 where;
- 没有内置主键生成、逻辑删除、自动填充、分页工具。
二、MyBatis-Plus(简称 MP)
1. 定位
MyBatis 的增强工具,只增强不修改 ,完全兼容原生 MyBatis。 目标:简化单表操作,消除重复 CRUD 代码,复杂多表查询依然复用原生 MyBatis XML。
2. 核心设计思想
- 单表通用操作:内置封装,一行代码搞定;
- 复杂多表、统计、自定义 SQL:仍然写 XML,不限制原有能力;
- 大量内置实用功能,开箱即用。
3. 内置核心能力
(1)通用 Mapper,自带 CRUD,无需写 XML
BaseMapper<T> 内置方法: insert、deleteById、updateById、selectById、selectList、selectCount 等
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 优缺点
优点
- 单表零 SQL 开发,极大减少重复工作量;
- Lambda 构造器避免字段字符串写错;
- 分页、逻辑删除、自动填充、主键策略一站式解决方案;
- 代码生成器快速搭建 CRUD;
- 完全兼容原生 MyBatis,无侵入,随时混用 XML。
缺点
- 复杂多表、嵌套统计场景,封装优势失效,还是要手写 SQL;
- 过度依赖封装会弱化手写 SQL 能力,排查底层 SQL 时需要了解 MP 执行逻辑;
- 版本升级偶尔会出现配置类变动。
三、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 深度优化。
五、开发最佳实践(电商项目通用)
- 单表简单增删改查:直接使用 MP BaseMapper + LambdaWrapper;
- 多表联查、复杂统计、自定义复杂 SQL:新建 XML 手写原生 MyBatis;
- 统一开启逻辑删除、自动填充创建 / 更新时间;
- 分页统一使用 MP Page 对象,不手动拼接 limit;
- 禁止硬编码字段字符串,一律使用 LambdaQueryWrapper;
- 代码生成器生成基础模板,减少重复创建文件工作。
六、常见误区澄清
- ❌ MyBatis-Plus 替代 MyBatis ✅ MP 只是增强,底层依旧运行 MyBatis,必须引入 mybatis 依赖。
- ❌ 使用 MP 后不能写 XML ✅ 完全可以混用,复杂业务强烈建议手写 XML。
- ❌ MP 只能做单表查询 ✅ 多表场景交给原生 XML,MP 不限制任何 MyBatis 原生能力。