你想了解 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 基础上新增的高频实用功能:
- 逻辑删除 :无需改 SQL,配置后自动将 delete 操作转为 update(如
deleted=1),查询自动过滤已删除数据; - 自动填充:配置创建时间、更新时间、创建人等字段,新增 / 更新时自动赋值,无需手动 set;
- 条件构造器(QueryWrapper) :用链式调用拼接动态条件,替代 MyBatis 的
<where>``<if>等动态 SQL; - 代码生成器:一键生成 Entity、Mapper、Service、Controller 全套代码,彻底解放重复劳动;
- 多租户插件:无需改 SQL,自动给所有查询加租户 ID 条件,适配多租户系统。
四、选型建议(该用哪个?)
-
选 MyBatis:
- 项目以复杂 SQL 为主(多表联查、嵌套查询、存储过程);
- 需极致控制 SQL 执行(如优化性能、自定义 SQL 逻辑);
- 团队已熟练掌握 MyBatis,无需额外学习 MP。
-
选 MyBatis-Plus:
- 单表操作占比高(80% 以上 CRUD 是单表);
- 追求开发效率,想减少重复 SQL 编写;
- 新手团队,降低学习成本和出错概率;
- 需快速实现分页、逻辑删除等通用功能。
注意:MP 完全兼容 MyBatis,可混合使用 ------ 单表用 MP 的无 SQL 方式,复杂 SQL 用 MyBatis 的 XML / 注解方式,兼顾效率和灵活性。
总结
- MyBatis 是 "基础款",灵活但需手写大量 SQL,适合复杂场景;
- MyBatis-Plus 是 "增强款",基于 MyBatis 封装,单表 CRUD 零 SQL,开发效率翻倍,且不丢失灵活性;
- 实际开发中,90% 的业务场景(尤其是中小型项目)优先选 MP,复杂 SQL 仍用 MyBatis 原生方式即可。