MyBatis-Plus 对比传统 MyBatis 的优势(对比分析)

 更新时间:2025年12月19日 10:22:05   作者:drebander  
MyBatis-Plus是MyBatis的一个增强框架,提供了通用CRUD操作、条件构造器、分页查询、乐观锁和自动代码生成等功能,本文将对比 MyBatis 和 MyBatis-Plus,并详细分析 MyBatis-Plus 提供的增强功能、性能优化以及它如何提升开发效率,感兴趣的朋友一起看看吧

在现代的 Java 开发中,MyBatisMyBatis-Plus 都是流行的持久层框架。MyBatis 是一个轻量级的 ORM 框架,帮助开发者通过映射文件或注解方式来执行 SQL 操作。MyBatis-Plus 是在 MyBatis 基础上进行的增强,提供了许多简化和优化功能,使得开发者在使用时能更加高效。

本文将对比 MyBatisMyBatis-Plus,并详细分析 MyBatis-Plus 提供的增强功能、性能优化以及它如何提升开发效率。

1. MyBatis 与 MyBatis-Plus 的差异

1.1 MyBatis 的基本特点

  • 灵活性:MyBatis 允许开发者通过 XML 配置文件或注解方式编写 SQL 查询,具有较高的灵活性。
  • 手动编写 SQL:开发者需要手动编写 SQL 语句,包括增、删、改、查等操作的实现。
  • 支持动态 SQL:MyBatis 支持动态 SQL,可以根据条件构造不同的 SQL 查询。
  • 需要大量配置:在 MyBatis 中,开发者需要自己编写 XML 映射文件,配置映射关系,手动配置 SqlSessionFactorySqlSession 等对象。

1.2 MyBatis-Plus 的增强功能

MyBatis-Plus 是对 MyBatis 的扩展,提供了更高效的配置和操作方式,尤其在减少了大量重复代码的编写。以下是 MyBatis-Plus 的一些关键优势:

  1. 通用 CRUD 操作:MyBatis-Plus 提供了内置的通用 CRUD 方法(如 saveremoveupdateByIdselectById 等),不需要开发者手动编写 SQL。
  2. 条件构造器(QueryWrapper 和 UpdateWrapper):MyBatis-Plus 提供了 QueryWrapperUpdateWrapper,使得动态 SQL 构建更加简洁。
  3. 分页查询:MyBatis-Plus 内置了分页插件,可以非常简单地进行分页查询。
  4. 乐观锁支持:内置乐观锁插件,支持并发操作时的数据一致性保障。
  5. 代码生成器:MyBatis-Plus 提供了代码生成器,能够自动生成实体类、Mapper 接口、Service 层代码。
  6. 自动填充:支持字段自动填充,避免了手动设置字段值。

1.3 对比总结

特性MyBatisMyBatis-Plus
开发速度需要手动编写 SQL 和映射文件,开发速度较慢内置通用 CRUD 操作,减少了代码量,开发速度更快
灵活性灵活,支持复杂的动态 SQL灵活性略低,但提供了简化常见操作的封装
代码量需要编写大量的 XML 或注解提供通用方法,减少了重复代码和 XML 配置
分页支持需要手动编写分页查询 SQL内置分页插件,自动实现分页功能
自动化功能提供自动代码生成、自动填充、乐观锁等功能

2. MyBatis-Plus 提供的增强功能

2.1 通用 CRUD 操作

MyBatis-Plus 提供了内置的通用 CRUD 方法,使得开发者不需要手动编写增、删、改、查的 SQL 语句。

public interface UserMapper extends BaseMapper<User> {
    // 继承 BaseMapper 后,自动获得常见的增、删、改、查方法
}

这些方法包括:

  • insert(T entity):插入一条记录。
  • deleteById(Serializable id):根据主键删除记录。
  • updateById(T entity):根据主键更新记录。
  • selectById(Serializable id):根据主键查询记录。
  • selectList(QueryWrapper<T> queryWrapper):根据条件查询多条记录。

2.2 条件构造器(QueryWrapper 和 UpdateWrapper)

QueryWrapperUpdateWrapper 提供了丰富的条件构造方法,可以简化 SQL 的构建。

QueryWrapper 示例:

QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("age", 25);  // 查询年龄为 25 的用户
List<User> users = userMapper.selectList(queryWrapper);

UpdateWrapper 示例:

UpdateWrapper<User> updateWrapper = new UpdateWrapper<>();
updateWrapper.eq("id", 1).set("age", 30);  // 将 ID 为 1 的用户年龄更新为 30
userMapper.update(null, updateWrapper);

2.3 分页查询

MyBatis-Plus 内置了分页插件,通过配置非常容易实现分页查询,免去了手动写分页 SQL 的麻烦。

分页查询示例:

Page<User> page = new Page<>(1, 10);  // 第 1 页,每页 10 条记录
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.gt("age", 18);  // 查询年龄大于 18 的用户
IPage<User> userPage = userMapper.selectPage(page, queryWrapper);
System.out.println(userPage.getRecords());  // 获取查询结果
System.out.println(userPage.getTotal());  // 获取总记录数

2.4 乐观锁插件

MyBatis-Plus 提供了 乐观锁插件,通过在实体类中标记 @Version 注解来启用乐观锁,自动管理版本字段,避免并发冲突。

乐观锁示例:

@Data
@TableName("user")
public class User {
    @TableId
    private Long id;
    private String name;
    private Integer age;
    private String email;
    @Version  // 乐观锁字段
    private Integer version;
}

MyBatis-Plus 会自动管理版本字段,确保在并发情况下,只有一个事务能够成功修改数据,避免数据不一致。

3. 开发效率的提升

3.1 自动代码生成

MyBatis-Plus 提供了 代码生成器,可以根据数据库表自动生成实体类、Mapper 接口、Service 层代码,减少手动编写代码的时间。

自动生成代码示例:

public class CodeGenerator {
    public static void main(String[] args) {
        AutoGenerator mpg = new AutoGenerator();
        // 全局配置
        GlobalConfig gc = new GlobalConfig();
        gc.setOutputDir("D://code");  // 输出目录
        gc.setAuthor("developer");  // 作者
        gc.setOpen(false);
        mpg.setGlobalConfig(gc);
        // 数据源配置
        DataSourceConfig dsc = new DataSourceConfig();
        dsc.setUrl("jdbc:mysql://localhost:3306/testdb");
        dsc.setDriverName("com.mysql.cj.jdbc.Driver");
        dsc.setUsername("root");
        dsc.setPassword("password");
        mpg.setDataSource(dsc);
        // 包配置
        PackageConfig pc = new PackageConfig();
        pc.setModuleName("user");
        mpg.setPackageInfo(pc);
        // 执行生成
        mpg.execute();
    }
}

通过这个代码生成器,你只需要配置数据库连接和包路径,就可以自动生成数据库表对应的实体类、Mapper、Service 等代码。

3.2 减少重复代码

由于 MyBatis-Plus 提供了丰富的 通用方法,开发者不再需要编写重复的 SQL 查询和数据库操作代码。通用的 selectByIdinsertupdate 等方法可以直接使用,极大地提升了开发效率。

4. 性能优化的关键

4.1 内存和 CPU 性能

  • 避免全表查询:尽量避免不加条件的全表查询,尤其是在数据量大的情况下。使用 QueryWrapper 设置查询条件,避免全表扫描。
  • 使用分页查询:对于需要展示大量数据的场景,使用分页查询 selectPage 来限制每次查询的数据量,减小内存负载。

4.2 SQL 执行效率

  • 批量操作:对于大量的插入、更新或删除操作,可以使用 executeBatch 方法进行批量操作,减少数据库连接的开销和网络传输的延迟。
  • 缓存机制:MyBatis-Plus 可以与 MyBatis 缓存机制结合使用,减少重复查询,提高性能。

4.3 使用索引

确保数据库表中常用的查询字段(如主键、外键)有合适的索引,这样能够大大提高查询效率。

5. 总结

  • MyBatis-Plus 提供了大量的增强功能,使得开发者能够更加高效地进行数据库操作。它减少了手动编写 SQL 和冗余代码的工作,提高了开发效率。
  • 通用 CRUD 操作条件构造器分页查询乐观锁自动代码生成 等功能极大简化了数据库访问层的开发。
  • 性能优化 方面,MyBatis-Plus 提供了批量操作、SQL 查询优化和缓存等机制,能够有效提升数据库操作的效率。

通过合理使用 MyBatis-Plus,开发者能够提高数据库操作的效率,减少冗余代码,并提升应用的整体性能。 🚀

到此这篇关于MyBatis-Plus 对比传统 MyBatis 的优势的文章就介绍到这了,更多相关MyBatis-Plus与MyBatis对比内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Java多线程(单例模式,堵塞队列,定时器)详解

    Java多线程(单例模式,堵塞队列,定时器)详解

    这篇文章主要介绍了java多线程的(单例模式,堵塞队列,定时器),具有一定参考价值,加深多线程编程的理解还是很有帮助的,需要的朋友可以参考下
    2021-08-08
  • 详解Spring Kafka中关于Kafka的配置参数

    详解Spring Kafka中关于Kafka的配置参数

    这篇文章主要介绍了详解Spring Kafka中关于Kafka的配置参数,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Java获取精确到秒的时间戳方法

    Java获取精确到秒的时间戳方法

    这篇文章主要为大家详细介绍了Java获取精确到秒的时间戳方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-12-12
  • 基于jdbc处理Clob的使用介绍

    基于jdbc处理Clob的使用介绍

    本篇文章是对jdbc处理Clob的使用进行了分析介绍,需要的朋友参考下
    2013-05-05
  • Java毕业设计实战之校园一卡通系统的实现

    Java毕业设计实战之校园一卡通系统的实现

    这是一个使用了java+Springboot+Maven+mybatis+Vue+mysql+wd开发的校园一卡通系统,是一个毕业设计的实战练习,具有校园一卡通系统该有的所有功能,感兴趣的朋友快来看看吧
    2022-01-01
  • 一文详解如何查看jdk版本及安装路径

    一文详解如何查看jdk版本及安装路径

    这篇文章主要给大家介绍了关于如何查看jdk版本及安装路径的相关资料,JDK是Java语言的软件开发工具包,主要用于移动设备、嵌入式设备上的java应用程序,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2023-10-10
  • Java Hibernate中使用HQL语句进行数据库查询的要点解析

    Java Hibernate中使用HQL语句进行数据库查询的要点解析

    HQL是Hibernate框架中提供的关系型数据库操作脚本,当然我们也可以使用原生的SQL语句,这里我们来看一下在Java Hibernate中使用HQL语句进行数据库查询的要点解析:
    2016-06-06
  • Spring Security+JWT实现认证与授权的实现

    Spring Security+JWT实现认证与授权的实现

    本文主要介绍了Spring Security+JWT实现认证与授权的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • 如何基于java实现解压ZIP TAR等文件

    如何基于java实现解压ZIP TAR等文件

    这篇文章主要介绍了如何基于java实现解压ZIP TAR等文件,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • SpringBoot中排查内存泄漏的方法小结

    SpringBoot中排查内存泄漏的方法小结

    内存泄漏是项目开发中常见且棘手的问题,它会导致应用性能下降、响应变慢,严重时甚至会引发OutOfMemoryError异常导致应用崩溃,下面我们就来看看SpringBoot排查内存泄漏的常用方法吧
    2025-06-06

最新评论