MyBatis 与 MyBatis-Plus 的区别

devtools/2025/1/7 20:27:13/

MyBatis 和 MyBatis-Plus 都是用于简化 Java 应用程序与数据库交互的持久层框架,但它们在功能、易用性和性能优化方面存在显著差异。下面将详细介绍两者之间的区别,并通过具体的代码示例进行对比。


概述
  • MyBatis:作为一款经典的持久层框架,MyBatis 提供了灵活的手动映射方式,允许开发者完全控制 SQL 语句和结果映射过程。
  • MyBatis-Plus:它是基于 MyBatis 的增强工具集,旨在减少开发者的重复性工作,提供了更多的自动化功能和便捷的操作方法。

主要区别
功能扩展
  • MyBatis
    • 主要关注于提供基础的 ORM(对象关系映射)能力,要求开发者自行编写 SQL 语句、配置 XML 映射文件或使用注解。
  • MyBatis-Plus
    • 在 MyBatis 基础上增加了诸如自动分页、条件构造器、代码生成器等功能,极大地方便了 CRUD 操作和其他常用业务逻辑的实现。
开发效率
  • MyBatis
    • 需要较多的手动编码来定义映射关系和 SQL 语句,对于简单的 CRUD 操作可能显得冗长且容易出错。
  • MyBatis-Plus
    • 提供了丰富的内置接口和简便的方法调用,减少了大量重复代码,提高了开发速度和维护性。
性能优化
  • MyBatis
    • 性能取决于开发者编写的 SQL 质量以及如何利用缓存等特性。
  • MyBatis-Plus
    • 内置了一些性能优化措施,如智能查询优化、批量插入/更新支持等,默认情况下能够更好地处理大数据集。
社区支持与文档
  • MyBatis
    • 拥有庞大的用户群体和活跃的社区,官方文档详尽,有大量的第三方资源可供参考。
  • MyBatis-Plus
    • 相对年轻,但在国内开发者中迅速崛起,拥有良好的中文文档和支持论坛。

代码示例对比

假设我们有一个名为 User 的实体类及其对应的数据库表 users,接下来展示如何使用 MyBatis 和 MyBatis-Plus 分别实现基本的 CRUD 操作。

1. 使用 MyBatis 实现
①创建 Mapper 接口
java">public interface UserMapper {@Select("SELECT * FROM users WHERE id = #{id}")User selectById(Long id);@Insert("INSERT INTO users(name, age) VALUES(#{name}, #{age})")int insert(User user);@Update("UPDATE users SET name=#{name}, age=#{age} WHERE id=#{id}")int update(User user);@Delete("DELETE FROM users WHERE id=#{id}")int deleteById(Long id);
}
②配置 XML 文件(可选)

如果选择不使用注解,则需要创建相应的 XML 文件来进行 SQL 映射:

java"><mapper namespace="com.example.mapper.UserMapper"><select id="selectById" resultType="com.example.model.User">SELECT * FROM users WHERE id = #{id}</select><!-- 其他 CRUD 方法省略 -->
</mapper>
2.  使用 MyBatis-Plus 实现
①继承 BaseMapper 接口

MyBatis-Plus 提供了一个 BaseMapper 接口,它已经包含了所有常用的 CRUD 方法,因此只需继承即可获得这些功能:

java">import com.baomidou.mybatisplus.core.mapper.BaseMapper;public interface UserMapper extends BaseMapper<User> {// 自定义方法可以在此添加
}
②使用 Wrapper 条件构造器

MyBatis-Plus 提供了 QueryWrapperUpdateWrapper 等工具类来简化查询条件的构建:

java">// 查询单个用户
User user = userMapper.selectById(id);// 更新用户信息
userMapper.update(new UpdateWrapper<User>().eq("id", id).set("name", "newName").set("age", 25));// 删除用户
userMapper.deleteById(id);// 批量操作
List<User> userList = ...; // 用户列表
userMapper.insertBatch(userList); // 批量插入
userMapper.deleteBatchIds(Arrays.asList(1L, 2L, 3L)); // 批量删除
代码生成器
  • MyBatis:需要手动编写或借助其他插件生成代码。
  • MyBatis-Plus:自带强大的代码生成器,可以根据数据库表结构自动生成实体类、Mapper 接口及相关 XML 文件。

总结

从上述分析可以看出,MyBatis 和 MyBatis-Plus 各有优势:

  • 如果你追求极致的灵活性和对 SQL 的完全掌控,那么 MyBatis 可能更适合你。
  • 对于希望快速开发并减少重复劳动的应用场景,MyBatis-Plus 提供了更多开箱即用的功能,降低了开发成本,提升了生产力。

选择哪一个框架取决于项目的需求和个人偏好。无论选用哪个框架,理解其核心概念和技术细节都是成功应用的关键。


http://www.ppmy.cn/devtools/148396.html

相关文章

OpenCV相机标定与3D重建(41)从 3D 物点和它们对应的 2D 图像点估算初始相机内参矩阵函数initCameraMatrix2D()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 从3D-2D点对应关系中找到一个初始的相机内参矩阵。 cv::initCameraMatrix2D 是 OpenCV 库中的一个函数&#xff0c;用于从 3D 物点和它们对应的…

Jmeter-性能测试工具的安装教程

一、Jmeter是什么&#xff1f; JMeter是一个开源的Java应用程序&#xff0c;由Apache软件基金会开发和维护&#xff0c;可用于性能测试、压力测试、接口测试等。 性能测试的定义 性能测试是通过自动化工具模拟多种负载条件&#xff08;包括正常、峰值和异常负载&#xff09;&am…

kafka使用常见问题

连接不上kafka,报下边的错 org.apache.kafka.common.KafkaException: Producer is closed forcefully.at org.apache.kafka.clients.producer.internals.RecordAccumulator.abortBatches(RecordAccumulator.java:760) [kafka-clients-3.0.2.jar:na]at org.apache.kafka.client…

Ubuntu创建python虚拟环境

1、安装Python 1&#xff09;打开终端。 2&#xff09;添加deadsnakes PPA到你的系统&#xff08;如果尚未添加&#xff09;&#xff1a; sudo add-apt-repository ppa:deadsnakes/ppa 系统更新&#xff1a; sudo apt-get update 安装Python 3.9&#xff1a; sudo apt-ge…

青少年编程与数学 02-006 前端开发框架VUE 01课题、VUE简介

青少年编程与数学 02-006 前端开发框架VUE 01课题、VUE简介 一、前端开发一、前端框架二、Vue.js三、应用场景四、区别五、学习资源六、应用示例说明&#xff1a; 课题摘要:本文介绍了前端开发框架Vue.js的基本概念和特性。Vue.js是一个渐进式JavaScript框架&#xff0c;用于构…

Serializable接口

最近写项目的时候&#xff0c;发现有一些类要实现Serializable接口&#xff0c;一开始只是粗略的知道实现了Serializable接口&#xff0c;这个类的对象可以被序列化&#xff0c;但我比较轴&#xff0c;想知道这个接口到底有什么作用。 我点开这个接口发现什么方法都没有实现&am…

深入理解 PyTorch 的 Dataset 和 DataLoader:构建高效数据管道

文章目录 简介PyTorch 的 DatasetDataset 的基本概念自定义 Dataset实现 __init__ 方法示例&#xff1a;从 CSV 文件加载数据 实现 __len__ 方法实现 __getitem__ 方法另一种示例&#xff1a;直接传递列表训练集和验证集的定义 1. 单个 Dataset 类 数据分割2. 分别定义两个 Da…

第十八周:Faster R-CNN论文阅读

Faster R-CNN论文阅读 摘要Abstract文章简介1. 引言2. Faster R-CNN 框架2.1 RPN2.2 损失函数2.3 RPN的训练细节 3. Faster R-CNN的训练4. 优缺点分析总结 摘要 本篇博客介绍了 Faster R-CNN&#xff0c;这是一种双阶段的目标检测网络&#xff0c;是对 Fast R-CNN 的改进。为了…