MyBatis 与 MyBatis-Plus 的区别

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 接口
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 映射:

<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 方法,因此只需继承即可获得这些功能:

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

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

// 查询单个用户
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.mzph.cn/pingmian/66281.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go语言的基础知识

1, Go 语言介绍 Go 即 Golang,是 Google公司2009年11月正式对外公开的一门编程语言。 根据 Go 语言开发者自述&#xff0c;近10多年&#xff0c;从单机时代的C语言到现在互联网时代的Java,都没有令人满意的开发语言&#xff0c;而C往往给人的感觉是&#xff0c;花了100%的经历…

【UE5 C++课程系列笔记】20——共享指针的简单使用

目录 概念 创建共享指针示例 重设共享指针 共享指针内容转移 共享指针和共享引用的转换 判断共享指针的相等性 共享指针访问成员函数 自定义删除器 概念 共享指针&#xff08;主要以 TSharedPtr 为例&#xff09;&#xff0c;TSharedPtr 基于引用计数机制来工作&#x…

flux中的缓存

1. cache&#xff0c;onBackpressureBuffer。都是缓存。cache可以将hot流的数据缓存起来。onBackpressureBuffer也是缓存&#xff0c;但是当下游消费者的处理速度比上游生产者慢时&#xff0c;上游生产的数据会被暂时存储在缓冲区中&#xff0c;防止丢失。 2. Flux.range 默认…

Ubuntu网络连接问题(笔记本更换wifi后,虚拟机连不上网络)

1、笔记本更换wifi后&#xff0c;虚拟机的IP地址变了&#xff0c;然后就连不上网络了&#xff08;主机笔记本连接wifi正常上网&#xff09; 2、修改子网地址&#xff08;按照ubutun的ip设置子网掩码&#xff09; 3、Ubuntu已经显示网络连接正常了&#xff0c;但是就是无法上网&…

如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库教程

简介 本教程将向你介绍如何在 Ubuntu 22.04 上安装 Cassandra NoSQL 数据库。 Apache Cassandra 是一个分布式的 NoSQL 数据库&#xff0c;旨在处理跨多个普通服务器的大量数据&#xff0c;并提供高可用性&#xff0c;没有单点故障。Apache Cassandra 是一个高度可扩展的分布…

【开发工具】好用的进程管理工具supervisor

supervisor配置与使用 概述配置文件详解其他高级用法相关文献 概述 Supervisor是一个用Python编写的进程管理工具&#xff0c;主要用于在类Unix系统中管理和监控长时间运行的进程。以下是对它的详细介绍&#xff1a; 一、功能特点 进程监控 Supervisor可以自动启动、停止和重启…

C++编程等级认证学习计划

C编程等级认证学习计划 计划目标 在30天内系统学习并掌握C编程等级认证&#xff08;一至八级&#xff09;的知识点&#xff0c;为参加认证考试做好充分准备。 前期准备 学习资料收集 准备涵盖C编程一至八级知识点的专业教材&#xff0c;如《C Primer》等。收集相关的在线教…

Spring MVC实战指南:构建高效Web应用的架构与技巧(三)

响应数据和结果视图(7种) 返回值分类 创建web.xml&#xff08;spring、过滤器解决乱码、配置控制器dispatcherServlet、加载springmvc.xml文件、配置启动加载&#xff09;创建springmvc.xml文件 <!--配置了内容&#xff0c;启动Tomcat服务器的时候&#xff0c;就会被加载--…

Postgresql中clog与xid对应关系计算方法(速查表)

知道xid计算clog文件名 CREATE or REPLACE PROCEDURE get_clog_name(xid bigint) as $$ DECLAREpageno bigint;segno bigint; BEGIN-- 页面号&#xff1a;一个页面8K&#xff0c;一个字节8位能存4个事务的状态。pageno : xid / (8192 * 4);-- 段号&#xff1a;一个段&#xf…

oscp备考 oscp系列——Kioptix Level 1靶场 古老的 Apache Vuln

目录 前言 1. 主机发现 2. 端口扫描 3. 指纹识别 4. 目录扫描 5. 漏洞搜索和利用 前言 oscp备考&#xff0c;oscp系列——Kioptix Level 1靶场 Kioptix Level 1难度为简单靶场&#xff0c;主要考察 nmap的使用已经是否会看输出&#xff0c;以及是否会通过应用查找对应漏…

Linux下编译安装PETSc

本文记录在Linux下编译安装PETSc的流程。 零、环境 操作系统Ubuntu 22.04.4 LTSVS Code1.92.1Git2.34.1GCC11.4.0CMake3.22.1oneAPI2024.2.1 一、安装依赖 1.1 安装oneAPI 参见&#xff1a;Get the Intel oneAPI Base Toolkit , Get the Intel oneAPI HPC Toolkit 1.2 安…

51单片机——蜂鸣器模块

P2.5管脚控制蜂鸣器 #include "reg51.h" typedef unsigned int u16; typedef unsigned char u8;sbit BEEPP2^5; void delay(time){ while(time--); } void main(){ u16 i2000; //脉冲2000次 while(1){ while(i--){ BEEP!BEEP; //…

【HAProxy】如何在Ubuntu下配置HAProxy服务器

HAProxy 是一款免费、开源且强大的反向代理程序&#xff0c;它为 HTTP 和 TCP 基础的应用提供了高可用性、负载均衡以及代理功能&#xff0c;因此对于管理高流量服务器&#xff08;或 Web 应用&#xff09;来说&#xff0c;通过将负载分散到多个节点服务器上&#xff0c;它是一…

深入Android架构(从线程到AIDL)_11 线程之间的通信架构

目录 5、 线程之间的通信架构 认识Looper与Handler对象 主线程丢信息给自己 子线程丢信息给主线程 替子线程诞生Looper与MQ 5、 线程之间的通信架构 认识Looper与Handler对象 当主线程诞生时&#xff0c;就会去执行一个代码循环(Looper)&#xff0c;以便持续监视它的信息…

【中间件】docker+kafka单节点部署---zookeeper模式

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言消息中间件介绍1. KRaft模式2. zookeeper模式2.1. 单节点部署安装验证 前言 最近生产环境上准备部署ELFK日志监控&#xff0c;先在测试环境部署单节点kafka验证…

AI-Talk开发板之超拟人

一、说明 运行duomotai_ap sdk下的LLM_chat例程&#xff0c;实现开发板和超拟人大模型进行语音交互&#xff0c;支持单轮和多轮交互。 二、SDK更新 v2.3.0及以上的SDK版本才支持超拟人&#xff0c;如果当前SDK在v2.3.o以下&#xff0c;需要更新SDK。在SDK目录(duomotai_ap)下…

2024年, Milvus 社区的那些事

随着跨年钟声响起&#xff0c;2024 年告一段落。这一年&#xff0c;Milvus GitHub Stars 正式突破 3 万大关&#xff0c;Docker 下载量突破6700w 次&#xff0c;达到一个新的里程碑&#xff0c;在开源向量数据库领域继续引领前行。在这遥遥领先的数据背后&#xff0c;不妨让我们…

9999999999

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、pandas是什么&#xff1f;二、使用步骤1.引入库2.读入数据 总结 前言 提示&#xff1a;这里可以添加本文要记录的大概内容&#xff1a; 例如&#xff1a;…

docker中使用Volume完成数据共享

情景概述 在一个docker中&#xff0c;部署两个MySQL容器&#xff0c;假如它们的数据都存储在自己容器内部的data目录中。这样的存储方式会有以下问题&#xff1a; 1.无法保证两个MySQL容器中的数据同步。 2.容器删除后&#xff0c;数据就会丢失。 基于以上问题&#xff0c;容…

【期末复习】二、进程管理

1.进程的内存结构🍊 程序加载到内存之后就变成了一个进程,进程在内存当中的一个结构有: 文本段(text section):存放程序代码 栈(stack):存放局部变量和函数返回地址 数据段(data section):存放全局变量和静态变量(static) 堆(heap):程序运行时的动态内存分…