【Java后端】MyBatis 和 MyBatis-Plus (MP) 的区别
MyBatis 和 MyBatis-Plus (MP) 的区别
一、定位不同
MyBatis:
一款优秀的 ORM 框架,主要提供 SQL 映射 功能,需要开发者手写 SQL,并在 XML 或注解中维护映射关系。它强调 SQL 可控,灵活度高,但需要写很多重复的代码。MyBatis-Plus (MP):
基于 MyBatis 开发的 增强工具,在保持 MyBatis 特性的同时,提供了 大量的 CRUD 封装、分页、代码生成器、条件构造器等功能,减少了模板化的 SQL 编写,提升开发效率。
二、主要区别点
对比点 | MyBatis | MyBatis-Plus |
---|---|---|
定位 | 持久层框架 | MyBatis 的增强工具 |
SQL | 手写为主,全部需要自己维护 | 内置通用 CRUD,大部分场景不用写 SQL |
DAO 层 | Mapper 接口必须写增删改查方法 | 提供 BaseMapper,继承后自动拥有 CRUD 方法 |
分页功能 | 需要自己写分页逻辑或插件 | 内置分页插件,开箱即用 |
代码生成 | 官方无支持 | 内置代码生成器,可快速生成 Entity、Mapper、Service、Controller |
条件构造 | 需要写动态 SQL 或使用 OGNL | 提供 Wrapper 条件构造器,链式调用,简洁优雅 |
学习曲线 | 灵活但代码量大,SQL 掌控度高 | 上手简单,适合快速开发 |
适用场景 | 复杂 SQL、多表关联、性能调优 | 中小型项目、快速迭代、CRUD 占多数场景 |
三、代码对比示例
MyBatis(传统写法):
// UserMapper.java
@Mapper
public interface UserMapper {@Select("SELECT * FROM user WHERE id = #{id}")User selectById(Long id);@Insert("INSERT INTO user(name, age) VALUES(#{name}, #{age})")int insert(User user);
}
调用:
User user = userMapper.selectById(1L);
MyBatis-Plus(简化后):
// UserMapper.java
@Mapper
public interface UserMapper extends BaseMapper<User> {// 继承 BaseMapper 即可,基本的 CRUD 都不用写了
}
调用:
User user = userMapper.selectById(1L);
userMapper.insert(new User("Tom", 18));
四、总结建议
如果项目里 业务 SQL 较复杂(比如几十个表关联、大量存储过程),建议用 MyBatis,保持 SQL 的灵活性和可控性。
如果项目里 CRUD 居多、迭代快,尤其是中后台管理系统,建议用 MyBatis-Plus,大幅减少重复代码,提高开发效率。
实际上很多团队会 混用:复杂 SQL 用 MyBatis 手写,简单表就交给 MP 的内置方法。