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

news2024/11/16 6:31:51

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

大数据篇正在更新!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 提供了更灵活的迁移路径。

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

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

相关文章

C语言第13节:指针(3)

1. 回调函数 回调函数的基本思想是,将函数指针作为参数传递给另一个函数,并在需要时通过这个函数指针调用对应的函数。这种方式允许一个函数对执行的内容进行控制,而不需要知道具体的实现细节。 回调函数在以下场景中尤为有用: …

Tensorflow基本概念

简介:本文从Graph讲到Session,同时讲解了tf.constant创建tensor的用法和variable需要初始化的知识点,可以给你打好一个学习Tensorflow的基础。本文都是基于TensorFlow1.14.0的版本下运行。 本专栏将会系统的讲解TensorFlow在1.14.0版本下的各…

【包教包会】CocosCreator3.x框架——带翻页特效的场景切换

一、效果演示 二、如何获取 1、https://gitee.com/szrpf/TurnPage 2 2、解压,导入cocos creator(版本3.8.2),可以直接运行Demo演示 三、算法思路 1、单场景 页面预制体 通过loadScene来切换页面,无法实现页面特效…

【MySQL 保姆级教学】事务的自动提交和手动提交(重点)--上(13)

目录 1. 什么是事务?2. 事务的版本支持3. 事务提交的方式3.1 事务提交方式的分类3.2 演示的准备的工作3.2.1 创建表3.2.2 MySQL的服务端和客户端3.2.3 调低事务的隔离级别 4. 手动提交4.1 手动提交的命令说明4.2 示例一4.3 示例二4.4 示例三4.5 示例四 5. 自动提交5…

几何合理的分片段感知的3D分子生成 FragGen - 评测

FragGen 来源于 2024 年 3 月 25 日 预印本的文章,文章题目是 Deep Geometry Handling and Fragment-wise Molecular 3D Graph Generation, 作者是 Odin Zhang,侯廷军,浙江大学药学院。FragGen 是一个基于分子片段的 3D 分子生成模…

数据结构笔记(其八)--一般树的存储及其遍历

1.知识总览 一般的树会有多个孩子,所以存储结构也会与二叉树略有不同。 一般树的遍历。 2.双亲表示法 双亲表示法,也是父亲表示法,即每个节点中都存储了其父节点的地址信息。 特性:可以轻易地找到父节点,但寻找孩子节…

Linux系统Centos设置开机默认root用户

目录 一. 教程 二. 部分第三方工具配置也无效 一. 教程 使用 Linux 安装Centos系统的小伙伴大概都知道,我们进入系统后,通常都是自己设置的普通用户身份,而不是 root 超级管理员用户,导致我们在操作文件夹时往往爆出没有权限&am…

医院信息化与智能化系统(21)

医院信息化与智能化系统(21) 这里只描述对应过程,和可能遇到的问题及解决办法以及对应的参考链接,并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图,可以试试PlantUML,告诉GPT你的文件结构,让他给你对应…

【论文阅读】利用SEM二维图像表征黏土矿物三维结构

导言 在油气储层研究中,黏土矿物对流体流动的影响需要在微观尺度上理解,但传统的二维SEM图像难以完整地表征三维孔隙结构。常规的三维成像技术如FIB-SEM(聚焦离子束扫描电子显微镜)虽然可以获取高精度的3D图像,但成本…

Yocto - 使用Yocto开发嵌入式Linux系统_13 创建定制层

Creating Custom Layers 除了使用社区或供应商提供的现有图层外,我们还将在本章中学习如何为我们的产品创建图层。此外,我们还将了解如何创建机器定义和分布,并从中获益,从而更好地组织我们的源代码。 In addition to using exist…

每日八股——JVM组成

直接上图 JVM(Java虚拟机)是运行Java字节码的虚拟机。它主要由以下几个部分组成: 1. 类加载器(ClassLoader) 负责加载class文件到内存中,并生成对应的Class对象。类加载器分为启动类加载器、扩展类加载器…

JavaScript 中的 undefined 、null 与 NaN :概念解析与对比

文章目录 💯前言💯undefined1. 什么是 undefined2. undefined 的使用场景3. undefined 的特性 💯null1. 什么是 null2. null 的使用场景3. null 的特性 💯NaN1. 什么是 NaN2. NaN 的使用场景3. NaN 的特性 💯三者的区别…

计算机网络学习笔记-3.3以太网和局域网

以太网 以太网(Ethernet)是一种用于计算机网络的技术规范,广泛应用于局域网(LAN)的构建。它定义了如何在网络设备之间传输数据,并确保这些数据能够被可靠传送。以太网是目前最常见和最广泛使用的局域网技术…

Linux篇(用户管理命令)

目录 一、用户与用户组 1. 为什么要做用户与用户组管理 2. Linux的用户及用户组 2.1. Linux的多用户多任务 2.2. 什么是用户 2.3. 什么是用户组 2.4. 用户和用户组的关系 二、用户和用户组管理 1. 用户组管理 1.1. 用户组添加 /etc/group文件结构 1.2. 用户组修改 …

2024-11-15 Element-ui的tab切换中table自适应宽度无法立即100%的问题

前言 今天在写一个统计图表的时候,将所有的table表格和echarts图表放到一个页面中,这样会在纵向上出现滚动条,上下滑动对用户体验不好,于是改成tab切换的形式 遇到的问题 正如标题所述,elementui在tab中使用table时&…

使用Git工具在GitHub的仓库中上传文件夹(超详细)

如何使用Git工具在GitHub的仓库中上传文件夹? 如果觉得博主写的还可以,点赞收藏关注噢~ 第一步:拥有一个本地的仓库 可以fork别人的仓库或者自己新创建 fork别人的仓库 或者自己创建一个仓库 按照要求填写完成后,点击按钮创建…

设计模式-Facade(门面模式)GO语言版本

前言 个人理解Facade模式其实日常生活中已经不知不觉就在使用了,基本核心内容就是暴露一些简单操作的接口,实现上将一些内容封装起来。 如上图,外界使用内部子系统时,只需要通过调用facade接口层面的功能,不需要了解子…

【隐私计算】隐私计算的应用场景探索(大模型隐私计算、隐私数据存储计算、Web3、隐私物联网等)

1. 背景分析 隐私计算作为一种实现“原始数据不出域,可用不可见”的数据流通价值的关键技术,经历了2020-2023年的高光时刻,却在2024年骤然走向低谷。从各种渠道了解到一些业内曾经风光无两的隐私计算公司都有不同程度的裁员。几乎一夜之间&am…

【提高篇】3.4 GPIO(四,工作模式详解 下)

四,模拟输入输出 上下拉电阻断开,施密特触发器关闭,双 MOS 管也关闭。该模式用于 ADC 采集或者 DAC 输出,或者低功耗下省电。但要注意的是 GPIO本身并不具备模拟输出输入的功能。 4.1 模拟输入 STM32内置ADC(模数转换器),可以将模拟信号转换为数字信号。GPIO引脚可以…

【青牛科技】D4147漏电保护电路介绍及应用

1、标题: D4147漏电保护电路 2、简介: 我司代理电源管理芯片,产品具有失效率低、可靠性高等特点。 3、具体应用: 相关产品介绍: 4、D4147 应用框图: D4147 方案介绍: 接地零线故障引起的接地…