Java-01 深入浅出 MyBatis - MyBatis 概念 ORM映射关系 常见ORM 详细发展历史

点一下关注吧!!!非常感谢!!持续更新!!!

大数据篇正在更新!https://blog.csdn.net/w776341482/category_12713819.html

在这里插入图片描述

目前已经更新到了:

  • MyBatis(正在更新)

请添加图片描述

对象/关系映射 ORM

ORM 全称 Object/Relation Mapping:表示对象-关系映射的缩写
ORM 完成面向对象的编程语言 DAO 关系数据库的映射,当 ORM 框架完成映射后,程序员既可以利用面向对象程序设计语言的简易易用性,又可以利用关系数据库的技术优势。
ORM 把关系数据库包装成面向对象的模型,ORM 框架是面向对象设计语言与关系数据库发展不同步的中间解决方案。采用 ORM框架后,应用程序不再直接访问底层数据库,而是以面向对象的方式来操作持久化对象,而 ORM框架则将这些面向对象的操作转换成底层 SQL。
ORM 框架实现的效果:把对持久化对象的保存、修改、删除等操作转换为对数据库的操作。

对象/关系映射(ORM,Object-Relational Mapping)是一种技术,它通过在对象导向编程语言(如Java、Python、C#等)与关系型数据库之间提供一个“映射”层,简化了数据库操作。ORM的主要目标是使开发人员可以通过操作对象,而不必直接操作SQL语句,从而更容易地进行数据库交互。

对象和关系型数据库的差异

  • 对象:在面向对象编程中,对象通常包含属性和方法,表示现实世界中的事物(例如:一个Person对象,包含姓名、年龄等属性)。
  • 关系型数据库:数据库中的数据通常存储在表格中,每个表格由多个行和列组成,行代表数据的记录,列代表属性。

ORM的基本工作原理

ORM通过映射机制将对象的字段和关系型数据库表的字段相对应,并将对象的操作转换为SQL语句的执行。通常,ORM会执行以下操作:

  • 增(Create):将一个对象插入到数据库表中。
  • 查(Read):根据条件查询数据库,返回对应的对象。
  • 改(Update):修改对象的属性,并更新数据库中对应的记录。
  • 删(Delete):删除对象,并从数据库中移除对应的记录。

ORM的映射关系

ORM将对象模型映射到数据库中的表结构,常见的映射关系有:

  • 一对一(One-to-One):一个对象对应一个数据库表中的一行。例如:每个用户对应一个账户。
  • 一对多(One-to-Many):一个对象对应多行数据库记录。例如:一个作者可以写多本书。
  • 多对多(Many-to-Many):多个对象之间可以有多重关系,通常需要一个中间表来进行关联。例如:学生与课程之间的关系。

常见的ORM框架

ORM框架为开发人员提供了简化数据库操作的工具,以下是一些流行的ORM框架:

  • Hibernate:Java生态系统中非常流行的ORM框架,支持复杂的映射和事务管理。
  • JPA(Java Persistence API):是Java EE标准中定义的ORM规范,常与Hibernate一起使用。
  • MyBatis:与Hibernate不同,MyBatis并不完全采用对象关系映射的方式,而是允许开发者编写SQL语句,使用映射文件来进行对象映射。
  • Entity Framework:.NET框架中的ORM工具,支持LINQ查询。
  • Django ORM:Python中Django框架的ORM,使用Python对象与数据库表进行映射。
  • SQLAlchemy:Python中最受欢迎的ORM框架,提供了丰富的数据库操作功能。

MyBatis 简介

MyBatis 是一款优秀的 基于 ORM 的半自动轻量级持久层框架,它支持定制化的 SQL、存储过程以及高级映射,MyBatis 避免了几乎所有 JDBC 代码和手动设置参数以及获取结果集。
MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库记录。

MyBatis 历史

原来是一个 Apache 的一个开源项目 iBatis,2010 年 6 月这个项目由 Apache Software Foundation 迁移到了 Google Code,随着开发团队转移到了 Google 下,iBatis3.x 正式修改为 MyBatis,代码于 2013 年 11 月迁移到了 GitHub。
iBatis 一词来源于“Internet abatis”的结合,是一个基于 Java 的持久层框架,iBatis 提供的持久层框架包括 SQL Maps 和 Data Access Objects(DAO)。
在这里插入图片描述请添加图片描述

起源与早期历史(2002年 - 2010年)

iBatis 项目的起源

MyBatis 最早源自一个名为 iBatis 的项目。iBatis 项目的起始可以追溯到 2002年,它由 Clinton Begin 和其他一些开发者发起,最初是作为一个轻量级的 JDBC 框架,用来简化 Java 程序与数据库之间的交互。

iBatis 的目标是提供一种简单的方式,将 SQL 查询与 Java 对象进行映射,减少繁琐的 JDBC 代码,并提供更加灵活的数据库操作方式。iBatis 采用了 XML 配置文件来描述 SQL 查询,并通过映射器(Mapper)将查询结果映射到 Java 对象。iBatis 成为许多 Java 开发者进行数据库操作的首选工具,特别是在那些需要使用原生 SQL 查询的场景中。

iBatis 1.x 和 2.x 的发展

在 2000 年代初,iBatis 逐渐发展成了一个相对成熟的框架,版本也逐步更新。iBatis 2.x 提供了更为灵活的 SQL 映射功能,并引入了新的特性,如动态 SQL 支持和更强大的查询功能。iBatis 2.x 可以说是对 SQL 语句的封装和映射做出了进一步的优化。

重命名与 MyBatis 的诞生(2010年)

iBatis 3.x 的推出与重命名

到了 2010年,iBatis 的开发者决定对项目进行一次大幅度的重构,并进行品牌重塑。iBatis 项目经历了数个版本后,开发团队认为框架的功能已经发展得非常成熟,但同时也面临着与其他类似工具的竞争(如 Hibernate 和 JPA)。因此,他们决定对 iBatis 进行一次全面的改进,并在这个过程中为其重新命名为 MyBatis。

MyBatis 的名字由“My”(代表开发者的自由和灵活)和“Batis”(代表 SQL 语句映射)组成,体现了框架对于灵活性和原生 SQL 支持的特点。

MyBatis 3.x 的发布

在 2010 年,MyBatis 3.x 发布,并带来了一些关键的新特性和改进:

  • 支持注解:MyBatis 3 引入了基于注解的配置方式,使得开发人员能够通过注解方式定义 SQL 映射,而不再完全依赖于 XML 配置文件。这使得 MyBatis 更加灵活和简洁。
  • 增强的动态 SQL 功能:MyBatis 提供了更加强大的动态 SQL 功能,允许开发者根据条件动态生成 SQL 语句。
  • 更好的插件支持:MyBatis 3.x 提供了更加开放的插件机制,允许开发者通过插件扩展 MyBatis 的功能。

MyBatis 的流行与成熟(2011年 - 现在)

快速流行

在 MyBatis 3.x 发布之后,由于它简化了 Java 与数据库的交互,同时允许开发人员编写原生 SQL,MyBatis 在 Java 开发者中迅速流行开来。相比于其他全自动 ORM 框架(如 Hibernate),MyBatis 提供了更多的控制权和灵活性,特别适用于那些复杂 SQL 查询或对性能要求较高的场景。

MyBatis 的易用性和灵活性使其在企业级应用、微服务架构以及大数据应用中得到了广泛应用。开发者可以在 MyBatis 中自由使用 SQL 查询,同时利用其强大的映射功能将结果映射到 Java 对象,从而实现高效的数据库操作。

MyBatis 和 Spring 结合

MyBatis 也与 Spring 框架紧密集成,成为 Spring 开发中常用的数据持久层框架之一。Spring 提供了对 MyBatis 的支持,使得 MyBatis 可以和 Spring 的事务管理、数据源管理等功能无缝集成。通过 SqlSessionFactoryBean 和 MapperScannerConfigurer 等工具,开发者可以在 Spring 环境下轻松配置和使用 MyBatis。

MyBatis 的社区支持

MyBatis 逐渐发展成一个开源项目,由 Apache 软件基金会管理。MyBatis 社区提供了大量的文档、教程和支持,帮助开发人员更好地理解和使用 MyBatis。此外,MyBatis 还得到了许多企业和开发者的支持,随着时间的推移,它已经成为 Java 开发中最受欢迎的数据库框架之一。

MyBatis 4.x 和未来(2015年 - 至今)

MyBatis 4.x 和持续改进

随着 Java 技术的不断发展,MyBatis 也持续更新迭代。虽然在名称上没有新的大版本发布,但 MyBatis 在性能优化、功能扩展和与现代开发框架的兼容性方面不断进行改进。例如:

  • 支持 Java 8:MyBatis 开始全面支持 Java 8 特性,如 Lambda 表达式和新的时间日期 API。
  • 更加灵活的映射:MyBatis 继续增强对复杂映射的支持,能够更方便地处理嵌套映射、联表查询等复杂场景。
  • 集成更多工具:MyBatis 与其他技术栈(如 Spring Boot)有了更好的集成,简化了配置和使用。

MyBatis Generator 和 MyBatis Plus

  • MyBatis Generator:是 MyBatis 官方提供的一款工具,可以根据数据库表自动生成 Java 对象及其映射文件,从而加速开发流程。
  • MyBatis Plus:是社区开发的一个增强版 MyBatis,提供了更多的便捷功能,如自动 CRUD 操作、分页查询等,减少了重复的代码编写。

请添加图片描述

MyBatis 优势

MyBatis 是一个半自动化的持久层框架,对开发人员来说,核心 SQL还是需要自己进行优化,SQL 和 Java 编码进行分离,功能边界清晰,一个专注业务,一个专注数据。
在这里插入图片描述

灵活性高,支持原生 SQL

MyBatis 允许开发者在映射文件中编写原生 SQL,而不像 ORM 框架那样完全封装 SQL 生成。这意味着开发人员可以在保持高度灵活性的同时,控制 SQL 查询的执行逻辑,适应复杂的查询需求。
对于复杂的联接查询、条件查询、分页查询等,MyBatis 提供了更多定制化的空间。对于性能要求较高的应用,开发者可以在 SQL 级别进行优化,避免 ORM 框架的查询抽象可能带来的性能瓶颈。

避免了 ORM 的性能开销

ORM 框架(如 Hibernate)通过对对象进行映射、缓存和管理,通常会引入一定的性能开销,尤其是在大规模数据查询时。而 MyBatis 提供了对 SQL 的手写控制,开发者可以更细粒度地优化查询,减少无效的查询和多余的数据加载。
MyBatis 支持 懒加载 和 缓存机制,但相比 ORM 框架,它的开销更小,可以更精细地控制数据的加载时机和缓存策略。

支持动态 SQL

MyBatis 提供了非常强大的动态 SQL 功能,能够根据条件动态地生成 SQL 语句。通过 、、、 等标签,可以在 XML 配置文件中灵活地构建 SQL,避免了代码中写大量的 if-else 逻辑。
动态 SQL 对于复杂的查询构造非常有用,尤其是需要根据用户输入条件来动态生成查询语句时。

简洁的映射机制

MyBatis 提供了简洁的映射方式,开发者只需通过 XML 或注解将 SQL 查询与 Java 方法绑定,无需使用复杂的映射类。它使用 ResultMap 来映射查询结果和 Java 对象,简单且直观。
如果你只需要基本的 CRUD 操作,并且对 SQL 有较高的控制要求,MyBatis 提供了简洁的方式来实现,无需强制使用对象模型或关系映射。

支持复杂的查询

MyBatis 能够轻松支持非常复杂的 SQL 查询,包括多表联接、子查询、嵌套查询等。对于一些需要特别高效的查询,MyBatis 提供了灵活的扩展机制,避免了 ORM 框架中复杂查询时的性能损失。
如果有特殊的数据库逻辑,MyBatis 允许开发者直接编写 SQL 语句,而不依赖框架生成 SQL,从而实现更精确的控制。

简化了数据库事务管理

MyBatis 提供了内建的事务管理支持,结合 Spring 等框架的事务管理,能够轻松实现对数据库事务的控制。开发者无需手动管理事务,MyBatis 和 Spring 结合使用时可以自动开启、提交和回滚事务,确保数据一致性和可靠性。

跨数据库支持

MyBatis 提供了广泛的数据库支持,能够与大多数关系型数据库兼容(如 MySQL、PostgreSQL、Oracle、SQL Server 等)。这对于需要迁移数据库的应用非常有帮助,因为 MyBatis 使得 SQL 查询与数据库种类解耦。
你可以在同一个项目中使用不同的数据库,只要修改数据库连接配置和 SQL 语句即可,MyBatis 提供了更灵活的迁移路径。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/918711.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

nodejs和npm在gitbash中提示Not Found情况的解决办法

很多小伙伴学习了node以后,在cmd命令行中可以正常的获取node版本和npm版本,但是我们经常使用gitbash来管理git,这时候下载完gitbash后,在gitbash中输入node -v和npm -v会提示Not Found。这种情况如何处理??…

Linux:调试器-gdb/cgdb

文章目录 一、编译成debug1、-g 选项 二、gdb调试命令1、在CentOS系统下检查安装gdb2、进入gdb模式3、quit 退出gdb4、list (简写 l)显示文件内容5、b 打断点6、 r / run运行程序7、c 让程序直接运行完 三、cgdb1、info b查看打的所有断点2、d 删除断点3…

数据结构 -- 二叉搜索树

二叉搜索树 概念 二叉搜索树又称为二叉排序树,它或为空树,或为具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于等于根节点的值。若它的右子树不为空,则右子树上所有节点的值都大于等于根节…

VScode使用Batch Runner插件在终端运行bat文件

搜索并安装插件Batch Runner 创建测试文件 echo off echo "Hello world"按F5运行

4.STM32之通信接口《精讲》之USART通信---实验串口发送程序

本节将进行实战,基础了解请查看第1,2,3节(Whappy) 开始背!! USART ---》全双工 异步/同步 点对点 C语言基础printf用法,这节将用到printf的重定向,来打印到串口助手上…

特征融合篇 | CARAFE:轻量级通用上采样算子,可提高目标检测性能

前言:Hello大家好,我是小哥谈。CARAFE算子的主要特点是在保持轻量级功能的同时,能够提供比其他上采样算子更好的性能。它通过少量的参数和计算量来实现高效的图像上采样。CARAFE算子能够根据像素之间的关系进行自适应的上采样,从而更好地保留图像的细节和语义信息。🌈 …

游戏引擎学习第18天

clang-format 相关的配置可以参考下面 .clang-format 是用来配置代码格式化规则的文件,主要用于 Clang-Format 工具。以下是 .clang-format 文件中的一些常用设置: 1. 基础设置 Language: Cpp # 指定语言 (C, C, Java, JavaScript, etc…

递归(3)----力扣40组合数2,力扣473火柴拼正方形

给定一个候选人编号的集合 candidates 和一个目标数 target ,找出 candidates 中所有可以使数字和为 target 的组合。 candidates 中的每个数字在每个组合中只能使用 一次 。 注意:解集不能包含重复的组合。 示例 1: 输入: candidates [10,1,2,7,6,1…

SpringBoot Data Redis连接Redis-Cluster集群

使用SpringBoot Data Redis无法连接Redis-Cluster集群 最近在研究系统高并发下的缓存架构,因此自己在自己买的云服务器上搭建好Redis 5.0 版本的集群后,使用springboot的 RedisTemplate连接是发现总是访问不到集群节点。上网百度了发现没有好的解决办法&…

【插件】重复执行 pytest-repeat

安装 pip3 install pytest-repeat 用法 1.命令行 pytest --count num pytest --count 32.装饰器 pytest.mark.repeat(num) #num运行次数 pytest.mark.repeat(5)#执行结果如下:

强制放大缩小(适用于所有ctrl-,ctrl+)

以下操作: 使用资源管理器打开启动文件夹: 按下 Win R 键打开“运行”对话框。输入 shell:startup,然后按下 Enter。这应该会打开启动文件夹。 手动定位启动文件夹: 打开资源管理器并导航到以下路径: C:\Users\admin…

web前端开发网页--css样式的使用

1、css层叠性 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>css层叠性</title><style type"text/css">p{font-size: 12px;font-family: "微软雅黑";}.special{font-size: 24px;}#one{c…

idea 通过git撤销commit但未push的操作

1、undo commit 适用情况&#xff1a;代码修改完了&#xff0c;已经Commit了&#xff0c;但是还未push&#xff0c;然后发现还有地方需要修改不想提交本次记录了。这时可以进行Undo Commit&#xff0c;修改后再重新Commit。注意&#xff1a;如果已经进行了Push&#xff0c;线上…

『VUE』30. 生命周期的介绍(详细图文注释)

目录 生命周期生命周期的8阶段生命周期小例子总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 生命周期 每个 Vue 组件实例在创建时都需要经历一系列的初始化步骤&#xff0c;比如设置好数据侦听&#xff0c;编译模板&#xf…

远程jupyter lab的配置

打开虚拟环境 conda activate test 在环境下安装ipykernel软件包&#xff0c;这个软件包允许jupyter notebookl使用特定环境的python版本。 conda install ipykernel 将该环境添加到Jupyter Notebook中 python -m ipykernel install --user --nametest --display-name&quo…

C指针之舞——指针探秘之旅

❤博客主页&#xff1a;折枝寄北-CSDN博客 ❤专栏内容&#xff1a;C语言学习专栏https://blog.csdn.net/2303_80170533/category_12794764.html?spm1001.2014.3001.5482 指针基础学习 在之前的博客文章中&#xff0c;简单总结了指针的基础概念 我们知道了指针的概念&#xf…

MATLAB绘制克莱因瓶

MATLAB绘制克莱因瓶 clc;close all;clear all;warning off;% clear all rand(seed, 100); randn(seed, 100); format long g;% Parameters u_range linspace(0, 2*pi, 100); v_range linspace(0, pi, 50); [U, V] meshgrid(u_range, v_range);% Parametric equations for t…

Spring Cloud微服务下如何配置I8n

什么是I8n 国际化&#xff08;I18n&#xff09;指的是设计和开发产品的过程&#xff0c;使得它们能够适应多种语言和文化环境&#xff0c;而不需要进行大量的代码更改。这通常涉及到创建一个基础版本的产品&#xff0c;然后通过配置和资源文件来添加对不同语言和地区的支持。 这…

将分割标签数据从JSON格式转换为YOLOv8的TXT格式

AnyLabeling是一款突破性的开源图像标注工具。 一、主要功能与特点 融合传统标注工具优点&#xff1a;AnyLabeling结合了LabelImg和Labelme等传统标注软件的优点&#xff0c;提供了多边形、矩形、圆形、线条和点等多种标注形式&#xff0c;满足不同场景的需求。强大的AI自动标…

【graphics】图形绘制 C++

众所周知&#xff0c;周知所众&#xff0c;图形绘制对于竞赛学僧毫无用处&#xff0c;所以这个文章&#xff0c;专门对相关人员教学&#xff08;成长中的码农、高中僧、大学僧&#xff09;。 他人经验教学参考https://blog.csdn.net/qq_46107892/article/details/133386358?o…