【Java后端】MyBatis 和 MyBatis-Plus (MP) 的区别

MyBatisMyBatis-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(传统写法):

java 复制代码
// 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);
}

调用:

java 复制代码
User user = userMapper.selectById(1L);

MyBatis-Plus(简化后):

java 复制代码
// UserMapper.java
@Mapper
public interface UserMapper extends BaseMapper<User> {
    // 继承 BaseMapper 即可,基本的 CRUD 都不用写了
}

调用:

java 复制代码
User user = userMapper.selectById(1L);
userMapper.insert(new User("Tom", 18));

四、总结建议

  • 如果项目里 业务 SQL 较复杂 (比如几十个表关联、大量存储过程),建议用 MyBatis,保持 SQL 的灵活性和可控性。

  • 如果项目里 CRUD 居多、迭代快 ,尤其是中后台管理系统,建议用 MyBatis-Plus,大幅减少重复代码,提高开发效率。

  • 实际上很多团队会 混用:复杂 SQL 用 MyBatis 手写,简单表就交给 MP 的内置方法。


相关推荐
小短腿的代码世界21 小时前
Qt序列化与持久化深度解析:从QDataStream到自定义二进制协议
开发语言·数据库·qt
秋921 小时前
一键安装mysql8.4.9(附脚本)
数据库
weisian15121 小时前
Java并发编程--51-详解RocketMQ:高可靠消息中间件的核心特性与生产实践
java·rocketmq·java-rocketmq·事务消息
zjy2777721 小时前
Go语言怎么用GitHub Actions_Go语言GitHub Actions教程【基础】
jvm·数据库·python
2301_7820404521 小时前
如何实现SQL用户行为追踪_通过触发器记录操作明细
jvm·数据库·python
Gh0st_Lx1 天前
【5】深度解构:JVM 垃圾回收机制
java·jvm
dFObBIMmai1 天前
golang如何实现数据导入进度跟踪_golang数据导入进度跟踪实现教程
jvm·数据库·python
步辞1 天前
golang如何实现即时通讯IM系统_golang即时通讯IM系统实现方案
jvm·数据库·python
Jul1en_1 天前
【Redis】持久化策略
java·数据库·redis
fox_lht1 天前
onPaint函数流程图
java·eclipse·流程图