Mybatis, plus 区别

MyBatis 和 MyBatis-Plus(简称 MP)是 Java 生态中针对关系型数据库的持久层框架,MyBatis-Plus 是 MyBatis 的增强工具,完全兼容 MyBatis 且不做侵入式修改,核心差异体现在功能封装、开发效率、使用方式上。以下是详细对比:

一、核心定位与设计理念

 

 

维度MyBatisMyBatis-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. 其他增强功能

功能MyBatisMyBatis-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>

五、总结:核心差异一句话

特性MyBatisMyBatis-Plus
开发效率 低(手动写 SQL) 高(通用 CRUD 无 SQL)
SQL 灵活性 极高(完全自定义) 高(兼容手写 SQL + 封装通用逻辑)
学习成本 低(核心是 SQL 映射) 略高(需掌握 MP 特有 API)
适用场景 复杂 SQL、多表联查 单表 CRUD、快速开发、中小型项目

最终建议

  1. 优先选 MyBatis-Plus:只要不是极致追求 SQL 手写控制,MP 能大幅减少重复工作,且完全兼容 MyBatis,复杂场景可随时切换到手写 SQL;
  2. 混用最佳实践:基础单表操作(增删改查、分页)用 MP 的 BaseMapper/IService,多表联查、复杂统计用 MyBatis 手写 XML / 注解 SQL;
  3. 避免过度依赖 MP:MP 仅增强单表,复杂业务仍需掌握 MyBatis 核心(SQL 编写、映射规则、插件开发)。
 -------------------
 
 
posted @ 2025-12-23 13:59  野鹤闲人  阅读(4)  评论(0)    收藏  举报