当前位置: 首页 > news >正文

MyBatis-Plus:简化 CRUD 操作的艺术

一、关于MyBatis-Plus

1.1 简介

MyBatis-Plus 是一个基于 MyBatis 的增强工具,它旨在简化 MyBatis 的使用,提高开发效率。

9e920e5e-2e5b-4031-b546-1088ec5fa2e3

image

关于Mybatis

简介

MyBatis 是一款流行的 Java 持久层框架,旨在简化 Java 应用程序与数据库之间的交互。与传统的 ORM(对象关系映射)框架不同,MyBatis 提供了更大的灵活性,允许开发者自定义 SQL 语句。

91619c90-d7c3-4bd6-964d-0303af8ff2da

发展

初始阶段 - iBatis

  • 2001年:iBatis 项目由 Clinton Begin 发起,最初是一个开源项目,主要用于密码软件的开发,后来演变成一个基于 Java 的持久层框架。
  • 2004年:Clinton Begin 将 iBatis 的名字和源代码捐赠给了 Apache 软件基金会(ASF),成为 Apache 孵化器中的一个项目。在此期间,iBatis 成为了一个成熟的框架,被广泛应用于各种 Java 应用程序中。

转型期 - 从 iBatis 到 MyBatis

  • 2010年6月:iBatis 项目的核心开发团队决定将项目从 ASF 迁移到 Google Code,并将项目名改为 MyBatis。这次迁移标志着 iBatis 项目的重生,并引入了一些新的特性和改进。
  • 2013年11月:随着 Google Code 的服务逐步关闭,MyBatis 项目迁移至 GitHub,继续其开发和维护。

现代化与持续发展

  • 自从迁移到 GitHub 后,MyBatis 社区继续活跃,项目得到了持续的更新和完善。MyBatis 通过提供更好的 API 设计、更丰富的功能以及更高的灵活性,成为了许多 Java 开发者的首选持久层解决方案。
  • MyBatis 的设计使其能够很好地与其他 Java 框架(如 Spring)集成,同时也支持多种数据库管理系统(DBMS),这使得它成为一个非常灵活的选择。

特点
  1. SQL 语句映射:MyBatis 允许开发者通过 XML 或注解方式定义 SQL 语句,并将这些 SQL 语句与 Java 方法进行映射。
  2. 灵活性:与 ORM 框架相比,MyBatis 提供了更高的 SQL 自定义能力,开发者可以手动编写复杂的 SQL 语句,以满足具体的业务需求。
  3. 支持多种数据库:MyBatis 支持多种关系型数据库,便于在不同的环境中使用。
  4. 对象关系映射:虽然 MyBatis 不像 Hibernate 那样全面支持 ORM,但它提供了基本的对象映射功能,可以将数据库表中的记录映射为 Java 对象。
  5. 动态 SQL:MyBatis 支持动态 SQL,可以根据条件生成不同的 SQL 语句,提高了查询的灵活性。
  6. 缓存机制:MyBatis 提供了一级和二级缓存,能够提高数据库访问的性能,减少重复的数据库操作。
  7. 事务管理:MyBatis 支持与 Spring 等框架集成,方便管理数据库事务。

1.2 发展

MyBatis-Plus(简称 MP)是在 MyBatis 的基础上进行功能增强和扩展的一个开源项目,旨在进一步简化基于 MyBatis 的数据访问层(DAO)开发。以下是 MyBatis-Plus 的主要发展历程:

  1. 2016 年初

    • MyBatis-Plus 项目初始创建,最初由 baomidou (苞米豆)团队发起,旨在解决 MyBatis 使用过程中的繁琐代码和重复性工作,提供更便捷的 CRUD 操作和通用的查询功能。MyBatis-Plus 的名称直接表明了它与 MyBatis 的关系,即在 MyBatis 的基础上做了增强,而不是替代或改变 MyBatis 的原有功能。
  2. 功能逐步扩展

    • 初始阶段,MyBatis-Plus 主要集中在通用 CRUD 方法的封装和简化,以及一些便捷的查询功能,比如条件构造器等。
  3. 2017 年

    • MyBatis-Plus 在社区的支持下,逐步增加了更多实用的功能模块,如代码生成器、分页插件、性能分析插件等,使得开发者能够更高效地进行开发工作。
  4. 2018 年

    • MyBatis-Plus 发布了一系列更新版本,加强了对 Lambda 表达式的支持,使得在条件构造时可以更加简洁和直观,同时提高了查询的类型安全性。
  5. 2019 年

    • MyBatis-Plus 继续扩展其功能,引入了更多的增强特性和插件,如全局拦截器、SQL 注入器等,进一步增强了其在复杂应用场景下的灵活性和扩展性。
  6. 2020 年以后

    • MyBatis-Plus 持续稳定更新,解决了社区反馈的 bug 和安全问题,同时继续优化和增强现有功能,保持与最新技术的兼容性和整合性。

1.3 特性

  1. 无侵入设计:MyBatis-Plus 对 MyBatis 的核心功能进行了增强,使用时不需要对原有的 MyBatis 代码做过多改动。
  2. CRUD 操作的简化:提供了通用 Mapper 和通用 Service,开发者只需继承相应的接口即可实现基本的 CRUD 操作,减少了重复代码。
  3. 条件构造器:MyBatis-Plus 提供了 Lambda 形式的条件构造器,便于进行复杂的查询条件构造,提高了代码的可读性和维护性。
  4. 分页插件:内置分页功能,开发者可以轻松实现数据的分页查询,无需手动编写 SQL。
  5. 性能分析:提供 SQL 性能分析功能,可以查看执行的 SQL 语句及其性能,便于优化。
  6. 代码生成器:内置代码生成器,可以根据数据库表自动生成对应的实体类、Mapper 接口等,进一步提高开发效率。
  7. 多种扩展功能:支持乐观锁、逻辑删除、代码生成、注解驱动等功能,增强了应用的灵活性。

1.4 支持数据库

image

二、架构原理

image

2.1 核心组件

  1. AutoMapper:这是 MyBatis-Plus 中一个重要的抽象,它负责自动生成 CRUD 操作的 SQL 语句。开发者可以通过继承 BaseMapper<T>​ 接口来实现自己的 Mapper 接口。
  2. ServiceImpl:这是 MyBatis-Plus 提供的服务实现类,它继承自 ServiceImpl<T, IId>​,为 Service 层提供了一系列常用的方法。
  3. Entity:这是 MyBatis-Plus 中用于表示数据库表的实体类,通常继承自 BaseEntity​,以便利用一些通用属性和方法。
  4. Configuration:配置 MyBatis-Plus 的各种行为,如分页、日志记录等。
  5. Interceptor:拦截器,可以用来拦截 SQL 语句,例如分页插件、性能分析插件等。

2.2 主要模块

  1. CRUD 操作:提供了诸如 insert()​, updateById()​, deleteById()​ 等方法,简化了 CRUD 操作。
  2. Lambda 表达式:允许使用 Java 8 的 Lambda 表达式来构建查询条件,提高了代码的可读性和安全性。
  3. 分页插件:内置的分页功能,通过简单的配置即可启用。
  4. 代码生成器:提供了一个命令行工具,可以快速生成基础的 Mapper、Model、Service、Controller 层代码。
  5. 全局拦截器:可以全局拦截 SQL 语句,进行一些额外的操作,比如记录日志、SQL 分析等。

2.3 工作原理

初始化阶段

  1. SqlSessionFactoryBuilder:MyBatis-Plus 使用 MyBatis 的 SqlSessionFactoryBuilder​ 来构建 SqlSessionFactory​,这是 MyBatis-Plus 应用程序启动的第一步。
  2. SqlSessionFactorySqlSessionFactory​ 创建 SqlSession​,SqlSession​ 负责执行 SQL 语句,并将结果映射到 Java 对象。
  3. Configuration:配置文件被解析,配置 MyBatis-Plus 的各种行为,如分页插件的配置等。

执行阶段

  1. Mapper 接口调用:开发者通过调用 Mapper 接口中定义的方法来触发 SQL 操作。
  2. SQL 语句生成:根据传入的参数,MyBatis-Plus 自动生成相应的 SQL 语句。例如,使用 lambdaQuery()​ 方法可以生成带有条件的 SQL。
  3. SQL 执行:SQL 语句通过 SqlSession​ 执行,结果被映射到对应的 Java 对象。
  4. 结果返回:执行结果被封装后返回给调用方。

特殊功能实现

  1. 分页功能:通过全局拦截器自动添加分页信息到 SQL 语句中,实现分页查询。
  2. 性能分析:同样通过全局拦截器记录 SQL 执行时间和慢查询,帮助优化数据库访问。
  3. Lambda 表达式支持:利用 Java 8 的 Lambda 表达式来构建查询条件,提高了代码的可读性和可维护性。

MyBatis-Plus 通过一系列的设计模式和插件机制,极大地简化了基于 MyBatis 的应用程序开发。它通过自动化的 CRUD 操作、Lambda 表达式支持、内置分页插件等功能,降低了开发者的负担,并提高了开发效率。同时,它还提供了代码生成器,进一步加快了开发速度。这些特性使得 MyBatis-Plus 成为一个非常受欢迎的 MyBatis 扩展工具。

相关文章:

MyBatis-Plus:简化 CRUD 操作的艺术

一、关于MyBatis-Plus 1.1 简介 MyBatis-Plus 是一个基于 MyBatis 的增强工具&#xff0c;它旨在简化 MyBatis 的使用&#xff0c;提高开发效率。 ​ ‍ ‍ ‍ ​ ‍ 关于Mybatis 简介 MyBatis 是一款流行的 Java 持久层框架&#xff0c;旨在简化 Java 应用程序与数…...

Windows on ARM编译安装openBLAS

Windows on ARM编译安装openBLAS 要求下载源码OpenBLAS可以使用LLVM工具链(clang-cl和flang)从源代码为Windows on ARM(WoA)进行构建。v0.3.24版本(预构建包)的构建和测试已通过。 要求 LLVM:版本需大于等于17.0.4 LLVM版本16及以下会生成冲突的符号(如_QQ*等)。 LL…...

FPGA编程语言VHDL与Verilog的比较分析!!!

VHDL&#xff08;VHSIC硬件描述语言&#xff09;和Verilog都是用于硬件描述和FPGA编程的工业标准语言。它们在语法和设计理念上存在一些差异&#xff0c;以下是两者的比较分析&#xff1a; 1. 历史背景 VHDL&#xff1a; 开发于1980年代初期&#xff0c;最初用于美国国防部的…...

C语言——八股文(笔试面试题)

1、 什么是数组指针&#xff0c;什么是指针数组&#xff1f; 数组指针&#xff1a;指向数组的指针 指针数组&#xff1a;数组中的元素都是指针 2、 什么是位段&#xff0c;什么是联合体 位段&#xff08;Bit Field&#xff09;&#xff1a;在C语言中&#xff0c;允许在一个整数…...

解决 Oracle 数据库错误 ORA-12516:监听器无法找到匹配协议栈的处理程序

在使用 Oracle 数据库时&#xff0c;有时会遇到错误 ORA-12516&#xff0c;这个错误表明 Oracle 数据库的监听器无法为新的连接请求找到一个可用的处理程序&#xff0c;这通常是因为达到了连接数上限、配置问题或资源限制。本文将详细介绍如何解决这个问题。 一、错误描述 当…...

Flarum:简洁而强大的开源论坛软件

Flarum简介 Flarum是一款开源论坛软件&#xff0c;以其简洁、快速和易用性而闻名。它继承了esoTalk和FluxBB的优良传统&#xff0c;旨在提供一个不复杂、不臃肿的论坛体验。Flarum的核心优势在于&#xff1a; 快速、简单&#xff1a; Flarum使用PHP构建&#xff0c;易于部署&…...

方法+数组

1. 方法 1. 什么是方法 方法定义&#xff1a; // []表示可写可不写[public] [static] type name ( [type formal , type formal , ...]){方法体&#xff1b;[return value ;] }[修饰符] 返回值类型 方法名称([参数类型 形参 , 参数类型 形参 ...]){方法体代码;[return 返回值…...

驱动-----adc

在key1.c的基础上进行对adc1.c进行编写 首先将文件里面的key全部改为adc 再修改一下设备号 按键和adc的区别是什么,按键只需要按一下就触发了,并且不需要返回一个值出来, adc要初始化,启动,返回值 以下是裸机adc的代码: #include <s3c2440.h> #include "ad…...

js实现点击图片,使图片跟随鼠标移动(把注释打开是图片随机位置)

代码&#xff1a; <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8" /><meta name"viewport" content"widthdevice-width, initial-scale1.0" /><title>Document</title>&l…...

MacOS的powermetrics命令查看macbook笔记本的耗能情况,附带查看ANE的工作情况

什么是 powermetrics&#xff1f; powermetrics 是 macOS 系统自带的一个命令行工具&#xff0c;用于收集和分析系统能源消耗数据。通过它&#xff0c;我们可以深入了解 Mac 的硬件性能、软件行为以及能源使用情况&#xff0c;从而优化系统配置&#xff0c;提高电池续航时间。…...

字符串函数

大家好&#xff0c;今天我们来了解几个字符串函数 1.strcpy函数 这个函数是一个字符串复制函数&#xff0c;其全称为string copy&#xff0c;它可以将一个源字符数组的内容复制到目标字符数组中&#xff0c;我们需要关注几个问题&#xff0c;首先源字符串必须以&#xff3c;0…...

Java数组的地址和元素访问 C语言空指针与野指针

1. public static void main(String[] args) {int []arr{1,2,3,4,5};int numarr[0];System.out.println(num);System.out.println(arr[1]);System.out.println(arr);//[I610f87f48//[表示地址 I表示数据类型 表示间隔符号&#xff08;固定格式&#xff09;//10f87f48表示地址…...

如何在Linux系统中使用SSH进行安全连接

如何在Linux系统中使用SSH进行安全连接 SSH简介 安装SSH 在Debian/Ubuntu系统中安装 在CentOS/RHEL系统中安装 启动SSH服务 验证SSH是否安装成功 SSH配置 配置监听端口 配置登录方式 SSH客户端 安装SSH客户端 使用SSH客户端 SSH密钥认证 生成SSH密钥对 复制公钥到远程服务器…...

Pandas 数据可视化指南:从散点图到面积图的全面展示

Pandas 数据可视化指南&#xff1a;从散点图到面积图的全面展示 本文介绍了使用 Pandas 进行数据可视化的多种方法&#xff0c;包括散点图、折线图、条形图、直方图、饼图和面积图等&#xff0c;涵盖了常见的图表类型及其实现方式。通过提供详细的代码示例&#xff0c;展示了如…...

Flink + Kafka 实现通用流式数据处理详解

Flink Kafka 实现通用流式数据处理详解 在大数据时代&#xff0c;实时数据处理和分析成为企业快速响应市场变化、提高业务效率和优化决策的关键技术。Apache Flink和Apache Kafka作为两个重要的开源项目&#xff0c;在数据流处理领域具有广泛的应用。本文将深入探讨Flink和Ka…...

Docker常用命令汇总

一、Docker基础命令 启动docker&#xff1a;systemctl start docker关闭docker&#xff1a;systemctl stop docker重启docker&#xff1a;systemctl restart dockerdocker设置随服务启动而自启动&#xff1a;systemctl enable docker查看docker 运行状态&#xff1a;systemctl…...

【Java笔记】0-为什么学习Java

呃&#xff0c;当然是为了找个Java的开发工作 当然是由于Java使用的人多和它天生自带的优点了~ 主要优点有以下几点&#xff1a; 简单性 C语法纯净版&#xff0c;没有头文件、指针运算、不用分配内存 面向对象 重点放在对象与其接口上&#xff0c;接近人的逻辑 可移植性 …...

海外云手机是什么?对外贸电商有什么帮助?

在外贸电商领域&#xff0c;流量引流已成为卖家们关注的核心问题。越来越多的卖家开始利用海外云手机&#xff0c;通过TikTok等社交平台吸引流量&#xff0c;以推动商品在海外市场的销售。那么&#xff0c;海外云手机到底是什么&#xff1f;它又能为外贸电商卖家提供哪些支持呢…...

【找到了】有人知道怎么在本地用记事本方式打开Linux文本文件吗?

就类似这种&#xff0c;我输入一个什么命令打开文件&#xff0c;就能在命令窗口上弹出一个编辑器来编辑文件。只记得好像有参数-e啥的。 命令行里面如何打开文本编辑器&#xff1f; &#xff08;&#xff09; 在linux命令行terminal上使用gedit直接就可以打开文本文件 那么在…...

docker 安装postgresql

前提&#xff1a;准备好postgresql镜像&#xff0c;如&#xff1a;镜像地址/postgres:15.8 使用docker安装posgresql&#xff1a; 1.docker pull 镜像地址/postgres:15.8 2.docker run -d --namepostgres -p 5432:5432 -v postgres-volume:/var/lib/postgresql/data -e PO…...

后进先出(LIFO)详解

LIFO 是 Last In, First Out 的缩写&#xff0c;中文译为后进先出。这是一种数据结构的工作原则&#xff0c;类似于一摞盘子或一叠书本&#xff1a; 最后放进去的元素最先出来 -想象往筒状容器里放盘子&#xff1a; &#xff08;1&#xff09;你放进的最后一个盘子&#xff08…...

SkyWalking 10.2.0 SWCK 配置过程

SkyWalking 10.2.0 & SWCK 配置过程 skywalking oap-server & ui 使用Docker安装在K8S集群以外&#xff0c;K8S集群中的微服务使用initContainer按命名空间将skywalking-java-agent注入到业务容器中。 SWCK有整套的解决方案&#xff0c;全安装在K8S群集中。 具体可参…...

Qt/C++开发监控GB28181系统/取流协议/同时支持udp/tcp被动/tcp主动

一、前言说明 在2011版本的gb28181协议中&#xff0c;拉取视频流只要求udp方式&#xff0c;从2016开始要求新增支持tcp被动和tcp主动两种方式&#xff0c;udp理论上会丢包的&#xff0c;所以实际使用过程可能会出现画面花屏的情况&#xff0c;而tcp肯定不丢包&#xff0c;起码…...

FFmpeg 低延迟同屏方案

引言 在实时互动需求激增的当下&#xff0c;无论是在线教育中的师生同屏演示、远程办公的屏幕共享协作&#xff0c;还是游戏直播的画面实时传输&#xff0c;低延迟同屏已成为保障用户体验的核心指标。FFmpeg 作为一款功能强大的多媒体框架&#xff0c;凭借其灵活的编解码、数据…...

Objective-C常用命名规范总结

【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名&#xff08;Class Name)2.协议名&#xff08;Protocol Name)3.方法名&#xff08;Method Name)4.属性名&#xff08;Property Name&#xff09;5.局部变量/实例变量&#xff08;Local / Instance Variables&…...

macOS多出来了:Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用

文章目录 问题现象问题原因解决办法 问题现象 macOS启动台&#xff08;Launchpad&#xff09;多出来了&#xff1a;Google云端硬盘、YouTube、表格、幻灯片、Gmail、Google文档等应用。 问题原因 很明显&#xff0c;都是Google家的办公全家桶。这些应用并不是通过独立安装的…...

OkHttp 中实现断点续传 demo

在 OkHttp 中实现断点续传主要通过以下步骤完成&#xff0c;核心是利用 HTTP 协议的 Range 请求头指定下载范围&#xff1a; 实现原理 Range 请求头&#xff1a;向服务器请求文件的特定字节范围&#xff08;如 Range: bytes1024-&#xff09; 本地文件记录&#xff1a;保存已…...

学习STC51单片机31(芯片为STC89C52RCRC)OLED显示屏1

每日一言 生活的美好&#xff0c;总是藏在那些你咬牙坚持的日子里。 硬件&#xff1a;OLED 以后要用到OLED的时候找到这个文件 OLED的设备地址 SSD1306"SSD" 是品牌缩写&#xff0c;"1306" 是产品编号。 驱动 OLED 屏幕的 IIC 总线数据传输格式 示意图 …...

Python爬虫(一):爬虫伪装

一、网站防爬机制概述 在当今互联网环境中&#xff0c;具有一定规模或盈利性质的网站几乎都实施了各种防爬措施。这些措施主要分为两大类&#xff1a; 身份验证机制&#xff1a;直接将未经授权的爬虫阻挡在外反爬技术体系&#xff1a;通过各种技术手段增加爬虫获取数据的难度…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...