Mybatis, plus 区别
MyBatis 和 MyBatis-Plus(简称 MP)是 Java 生态中针对关系型数据库的持久层框架,MyBatis-Plus 是 MyBatis 的增强工具,完全兼容 MyBatis 且不做侵入式修改,核心差异体现在功能封装、开发效率、使用方式上。以下是详细对比:
一、核心定位与设计理念
| 维度 | MyBatis | MyBatis-Plus |
|---|---|---|
| 定位 | 半自动 ORM 框架(专注 SQL 灵活控制) | MyBatis 增强工具(主打 “无 SQL 快速开发”) |
| 设计理念 | 手写 SQL 为主,框架仅做映射和执行 | 封装通用 CRUD,减少重复 SQL,保留 MyBatis 灵活性 |
| 对 MyBatis 的兼容性 | 原生框架,无依赖 | 100% 兼容 MyBatis,可无缝集成、混用 |
二、核心功能差异
1. 通用 CRUD 操作(最核心区别)
-
MyBatis:无内置通用 CRUD,所有增删改查都需手动编写 SQL(XML 或注解),例如:xml
<!-- MyBatis 手动写查询 SQL --> <select id="getById" resultType="User"> SELECT id, name, age FROM user WHERE id = #{id} </select>即使是简单的单表查询,也需逐行编写 SQL,重复工作量大。 -
MyBatis-Plus:内置
BaseMapper接口和IService服务层,封装了单表所有通用 CRUD(增删改查、分页、排序、条件查询等),无需编写任何 SQL 即可实现基础操作:java// 继承 BaseMapper 即可使用通用 CRUD public interface UserMapper extends BaseMapper<User> {} // 业务层直接调用,无 SQL User user = userMapper.selectById(1L); // 根据 ID 查询 List<User> list = userMapper.selectList(null); // 查询全部 userMapper.insert(new User("张三", 20)); // 新增
2. 条件构造器(QueryWrapper/LambdaQueryWrapper)
-
MyBatis:复杂条件查询需手动拼接 SQL,容易出现语法错误或 SQL 注入风险,例如:xml
<select id="listByCondition" resultType="User"> SELECT * FROM user WHERE age > #{age} <if test="name != null">AND name LIKE CONCAT('%', #{name}, '%')</if> </select> -
MyBatis-Plus:提供
QueryWrapper(普通条件)和LambdaQueryWrapper(类型安全),通过链式调用拼接条件,无需手写 SQL,且自动防 SQL 注入:java// Lambda 方式(推荐,避免硬编码字段名) List<User> list = userMapper.selectList( LambdaQueryWrapper<User>() .gt(User::getAge, 18) // age > 18 .like(User::getName, "张") // name LIKE '%张%' .orderByDesc(User::getCreateTime) );
3. 分页功能
-
MyBatis:无内置分页,需手动编写分页 SQL(如 MySQL 的
LIMIT、Oracle 的ROWNUM),或集成第三方插件(如 PageHelper),配置和使用较繁琐。 -
MyBatis-Plus:内置分页插件
MybatisPlusInterceptor,仅需简单配置,即可实现自动分页,无需手动拼接分页 SQL:java// 配置分页插件(Spring Boot 配置类) @Bean public MybatisPlusInterceptor mybatisPlusInterceptor() { MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor(); interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL)); return interceptor; } // 分页查询 Page<User> page = new Page<>(1, 10); // 第1页,每页10条 Page<User> result = userMapper.selectPage(page, null); List<User> records = result.getRecords(); // 分页数据 long total = result.getTotal(); // 总条数
4. 代码生成器
-
MyBatis:无内置代码生成工具,需借助第三方插件(如 MyBatis Generator),配置复杂,生成的代码仅包含基础 Mapper 和实体类。
-
MyBatis-Plus:提供强大的代码生成器(AutoGenerator),可一键生成实体类、Mapper、Service、Controller 全套代码,支持自定义模板,大幅减少重复编码工作。
5. 其他增强功能
| 功能 | MyBatis | MyBatis-Plus |
|---|---|---|
| 主键生成策略 | 需手动配置(如 UUID、自增) | 内置多种主键策略(雪花算法、自增、UUID 等),支持注解 @TableId 一键配置 |
| 逻辑删除 | 需手动写 SQL 处理(标记删除) | 内置逻辑删除功能,注解 @TableLogic 自动处理,无需修改 SQL |
| 乐观锁 | 无内置支持,需手动实现 | 注解 @Version 一键开启乐观锁,自动处理版本号 |
| 字段自动填充 | 需手动编写拦截器 | 注解 @TableField(fill = FieldFill.INSERT) + 填充处理器,自动填充创建时间 / 更新时间等 |
三、使用场景与开发效率对比
| 场景 | 推荐使用 | 原因 |
|---|---|---|
| 单表简单 CRUD 为主 | MyBatis-Plus | 无需写 SQL,开发效率提升 80% 以上 |
| 复杂多表联查 / 自定义 SQL | MyBatis(或 MP 混用) | MP 仅封装单表,多表联查仍需手写 SQL,MP 可兼容 MyBatis 手写 SQL 逻辑 |
| 对 SQL 精细控制 | MyBatis(或 MP 混用) | 需优化 SQL 性能、自定义复杂逻辑时,MyBatis 更灵活 |
| 快速开发 / 小型项目 | MyBatis-Plus | 减少重复代码,降低上手成本 |
| 大型 / 复杂项目 | MyBatis + MP 混用 | 基础 CRUD 用 MP,复杂逻辑用 MyBatis 手写 SQL,兼顾效率与灵活性 |
四、核心依赖与集成方式
-
MyBatis:核心依赖仅需
mybatis-spring-boot-starter(Spring Boot 场景):xml<dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-boot-starter</artifactId> <version>2.3.0</version> </dependency> -
MyBatis-Plus:需引入 MP 专属 starter,自动集成 MyBatis 核心依赖:xml
<dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>3.5.4.1</version> </dependency>
五、总结:核心差异一句话
| 特性 | MyBatis | MyBatis-Plus |
|---|---|---|
| 开发效率 | 低(手动写 SQL) | 高(通用 CRUD 无 SQL) |
| SQL 灵活性 | 极高(完全自定义) | 高(兼容手写 SQL + 封装通用逻辑) |
| 学习成本 | 低(核心是 SQL 映射) | 略高(需掌握 MP 特有 API) |
| 适用场景 | 复杂 SQL、多表联查 | 单表 CRUD、快速开发、中小型项目 |
最终建议
- 优先选 MyBatis-Plus:只要不是极致追求 SQL 手写控制,MP 能大幅减少重复工作,且完全兼容 MyBatis,复杂场景可随时切换到手写 SQL;
- 混用最佳实践:基础单表操作(增删改查、分页)用 MP 的
BaseMapper/IService,多表联查、复杂统计用 MyBatis 手写 XML / 注解 SQL; - 避免过度依赖 MP:MP 仅增强单表,复杂业务仍需掌握 MyBatis 核心(SQL 编写、映射规则、插件开发)。
-------------------
*
备注:公众号清汤袭人能找到我,那是随笔的地方
备注:公众号清汤袭人能找到我,那是随笔的地方

浙公网安备 33010602011771号