一文读懂JPA及Mybatis的原理和机制(面试经)

导览

  • 前言
  • Q:什么是JPA
    • 1. 简介
    • 2. 原理
  • Q:JPA持久化框架—Mybatis
    • 1. 内部组成与关系
    • 2. 各组件作用域和生命周期
    • 3. 动态SQL
      • 3.1 if语句
      • 3.2 choose-when-otherwise
    • 4. mapper映射XML
      • 4.1 select
      • 4.2 insert
    • 5. $与#的区别
      • 5.1 #{...}
      • 5.2 ${...}
  • 结语
  • 精彩回顾

前言

我们在做应用开发的时候,需要依赖持久层提供数据支撑,比如你要连接MySQL、Oracle、Sqlserver、redis、Mongo等各类DB。为节约资源并提高效率,Java提供了一套持久化API,即JPA。

本文先从这个JPA说起,咱们边走边聊~

在这里插入图片描述

Q:什么是JPA

1. 简介

Java 持久化 API (Java Persistence API)是一个Java应用程序接口规范,描述了使用Java SE和Java EE的应用中的关系数据的管理规范。

持久化的含义包含以下3个:

  • API 本身,定义在 javax.persistence 包内;
  • Java持久化查询语言 (JPQL);
  • 对象/关系 元数据;

在引入EJB 3.0规范之前,通常企业级Java开发人员使用由持久化框架(例如Hibernate)或数据访问对象(DAO)提供的轻量级持久化对象来代替实体bean(EJB的一种)。 这是因为在以前的EJB规范中,实体bean需要太多复杂的代码和繁重的资源占用,并且由于bean和DAO对象或持久化框架之间的源代码中的互连和依赖性,它们只能在Java EE应用程序服务器中使用。 因此,最初在第三方持久性框架中提供的许多功能都被合并到Java Persistence API中,并且从2006年开始,像Hibernate(版本3.2)和TopLink Essentials这样的项目已经实现Java Persistence API规范。

2. 原理

下图是关于JPA的运行机制和原理示意。通过应用程序与JPA进行交互,实现数据的持久化。
在这里插入图片描述
再放大观察,我们可以更清楚的了解JPA到底干了些什么。
在这里插入图片描述

Q:JPA持久化框架—Mybatis

MyBatis 是一款优秀的持久层框架,它支持定制化SQL、存储过程以及高级映射。它避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的繁杂操作。

MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和Java的POJO为数据库中的记录。

1. 内部组成与关系

在这里插入图片描述
这张图说明了Mybatis3各组成部分的交互关系,博主按箭头编号展开分解:
Step1:创建SqlSessionFactoryBuilder;——> 代表(1)
Step2:通过mybatis配置文件生成SqlSessionFactory;——> 代表(2)和(3)
Step3:客户端请求应用程序;——> 代表(4)
Step4:通过SqlSessionFactory初初始化SqlSession并返回到应用程序;——> 代表(5)、(6)、(7)
Step5:应用程序调用Mapper接口;——> 代表(8)
Step6:Mapper接口实现对象调用SqlSession执行SQL;——> 代表(9)
Step7:SqlSession通过配置文件获取sql并执行;——> 代表(10)

2. 各组件作用域和生命周期

  • (1)SqlSessionFactoryBuilder
    这个类可以被实例化、使用和丢弃。一旦创建了 SqlSessionFactory,就不再需要它了。 因此 SqlSessionFactoryBuilder 实例的最佳作用域是方法作用域(也就是局部方法变量)。 你可以重用 SqlSessionFactoryBuilder来创建多个SqlSessionFactory实例,但是最好还是不要让其一直存在,以保证所有的 XML 解析资源可以被释放。
  • (2)SqlSessionFactory
    SqlSessionFactory 一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例。 使用 SqlSessionFactory 的最佳实践是在应用运行期间不要重复创建多次,多次重建 SqlSessionFactory 被视为一种代码“坏味道(bad smell)”。因此 SqlSessionFactory 的最佳作用域是应用作用域。 有很多方法可以做到,最简单的就是使用单例模式或者静态单例模式。
  • (3)SqlSession
    每个线程都应该有它自己的 SqlSession 实例。SqlSession 的实例不是线程安全的,因此是不能被共享的,所以它的最佳的作用域是请求或方法作用域。 绝对不能将 SqlSession 实例的引用放在一个类的静态域,甚至一个类的实例变量也不行。 也绝不能将 SqlSession 实例的引用放在任何类型的托管作用域中,比如 Servlet 框架中的 HttpSession。 如果你现在正在使用一种Web框架,要考虑将 SqlSession 放在一个和 HTTP 请求对象相似的作用域中。 换句话说,每次收到的 HTTP 请求,就可以打开一个 SqlSession,返回一个响应立即关闭它。这个关闭操作是很重要的,应该放到 finally 块中以确保每次都能执行关闭。

下面的示例就是一个确保 SqlSession 关闭的标准模式:

Sqlsession session = sqlsessionFactory.openSession();
try {//TODO 你的应用逻辑代码}finally {session.close();
}
  • (4)映射器实例(Mapper)
    映射器(Mapper)是一些由你创建的、绑定你映射的语句(SQL)的接口。Mapper接口的实例是从SqlSession中获得的。因此从技术层面讲,任何映射器实例的最大作用域是和请求它们的 SqlSession 相同的。尽管如此,映射器实例的最佳作用域是方法作用域。 也就是说,映射器实例应该在调用它们的方法中被请求,用过之后即可丢弃。 并不需要显式地关闭映射器实例,尽管在整个请求作用域保持映射器实例也不会有什么问题,但是你很快会发现,像 SqlSession 一样,在这个作用域上管理太多的资源的话会难于控制。 为了避免这种复杂性,最好把映射器放在方法作用域内。
    下面的示例就展示了这个实践:
Sqlsession session =sqlSessionFactory.openSession();
try {BlogHapper mapper =session.getMapper(BlogMapper.class);//TODO 你的应用逻辑代码}finally {session.close();
}

3. 动态SQL

MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据不同条件拼接 SQL 语句的痛苦。而Mybatis提供了该能力的支持,下面做一个简单的举例。

3.1 if语句

在where语句中添加if语句,提供条件筛选。

<select id="findActivePager" resultType="Pager">SELECT * FRON papers MHERE state='1'<if test="title !=null">AND title like #{title}</if><if test="author !=null and author.name !=null">AND author_name like #{author.name}
</if>
</select>

3.2 choose-when-otherwise

choose类似java中的switch语句一样,写法如下:

<select id="findActivePager" resultType="Pager">
SELECT * FRON papers MHERE state='1'<choose><when test="title !=null"></when>AND title like #{title}<when test="author !=null and author.name !=null">AND author_name like #{author.name}
</when><otherwise>and 1=1 </otherwise></choose>
</select>

4. mapper映射XML

MyBatis 为 SQL 而构建,SQL 映射文件只有很少的几个顶级元素(按照应被定义的顺序列出),具体如下:

元素名称用途说明
cache对给定命名空间的缓存配置。
cache-ref对其他命名空间缓存配置的引用。
resultMap是最复杂也是最强大的元素,用来描述如何从数据库结果集中来加载对象。
parameterMap参数映射(已被废弃
sql可被其他语句引用的可重用语句块。
insert映射插入语句
update映射更新语句
delete映射删除语句
select映射查询语句

4.1 select

<select id="selectPerson" parameterType="int" resultType="hashmap">SELECT * FROM user WHERE ID = #{id}
</select>
  • id
    在命名空间中唯一的标识符,可以被用来引用这条语句。
  • parameterType
    将会传入这条语句的参数类的别名(通常是一个PO路径)。
  • resultMap
    外部resultMap的命名引用。可以使用 resultMap 或 resultType,但不能同时使用。
  • resultType
    从这条语句中返回的期望类型的类的别名(通常是一个DO路径)。 注意如果返回的是集合,那应该设置为集合包含的类型,而不是集合本身。

4.2 insert

insert示例如下:

<insert id="insert" parameterType="com.test.User">INSERT INTO userVALUES(#{id}, #{name}, #{sex}, #{email} )
</insert>

5. $与#的区别

5.1 #{…}

#{…}将被解析为一个 JDBC 预编译语句(prepared statement)的参数标记符,表现为一个占位符。示例如下:

select * from user where id= #{id}

编译后的SQL为

select * from user where id= ?

5.2 ${…}

而${… } 仅仅为一个纯碎的 string 替换,不占位。

select * from user where id= #{id}

编译后的SQL为

select * from user where id= 1

因此,能使用 #{… } 的地方就用 #{ …}。表名作为变量时,必须使用 ${ …}。

结语

本文对JPA及其实践进行了讲解。并且以Mybatis作为案例以增进各位盆友对JPA的理解和学习。Mybatis作为JPA实践的优秀框架,已被用在各种微服务应用中并受广大程序员的喜爱。通过此文相信各位能够对它有更深刻的理解和学习,并期望能够在未来的学习或面试中,可以助你一臂之力。

走过的、路过的盆友们,点点赞,收收藏,并加以指导,以备不时之需哈~

精彩回顾

一文读懂事务及Spring事务的管理(面试经)_下篇
一文读懂事务及Spring事务的管理(面试经)_上篇
一文读懂Spring Security的工作原理和机制(面试经)
一文读懂Spring AOP的工作原理和机制(面试经)
一文读懂Spring IoC的工作原理和机制(面试经)
一文读懂SpringMVC的工作原理
Springboot中基于X509完成SSL检验的原理与实践
基于springboot+enum配置化实践


在这里插入图片描述

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

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

相关文章

明日周刊-第23期

十月已过半&#xff0c;气温也转凉了&#xff0c;大家注意保温哦。冬吃萝卜&#xff0c;夏吃姜&#xff0c;在快要到来的冬季大家可以选择多吃点萝卜。 配图是本周末去商场抓娃娃的时候拍的照片&#xff0c;现在抓娃娃单次普遍都控制在1块钱以下了&#xff0c;还记得多年前的抓…

qt继承结构

一、 继承结构 所有的窗口类均继承自QWidget类&#xff0c;因此QWidget类本身包含窗口的特性。QWidget对象本身既可以作为独立窗口&#xff0c;又可以作为组件&#xff08;子窗口&#xff09;。 通过构造函数可以创建以上两种形态的QWidget&#xff1a; // 参数1&#xff1a;使…

[C#][winform]基于yolov8的道路交通事故检测系统C#源码+onnx模型+评估指标曲线+精美GUI界面

【重要说明】 该系统以opencvsharp作图像处理,onnxruntime做推理引擎&#xff0c;使用CPU进行推理&#xff0c;适合有显卡或者没有显卡windows x64系统均可&#xff0c;不支持macOS和Linux系统&#xff0c;不支持x86的windows操作系统。由于采用CPU推理&#xff0c;要比GPU慢。…

【重学 MySQL】七十一、揭秘数据库魔法——深入探索并引入视图

【重学 MySQL】七十一、揭秘数据库魔法——深入探索并引入视图 视图的定义视图的作用视图的注意事项 在MySQL数据库中&#xff0c;视图&#xff08;View&#xff09;是一种非常强大且灵活的工具&#xff0c;它为用户提供了以更安全、更清晰的方式查看和管理数据的途径。 视图的…

《计算机视觉》—— 换脸

效果如下&#xff1a; 完整代码&#xff1a; import cv2 import dlib import numpy as npJAW_POINTS list(range(0, 17)) RIGHT_BROW_POINTS list(range(17, 22)) LEFT_BROW_POINTS list(range(22, 27)) NOSE_POINTS list(range(27, 35)) RIGHT_EYE_POINTS list(range(36…

【深入解析】ChatGPT各版本在论文写作中的五大表现差异

学境思源&#xff0c;一键生成论文初稿&#xff1a; AcademicIdeas - 学境思源AI论文写作 人工智能在自然语言处理领域已取得了显著进展&#xff0c;尤其是OpenAI的ChatGPT系列在文本生成和理解方面表现突出。然而&#xff0c;不同版本的ChatGPT在论文写作中的表现存在明显差异…

Python 从入门到实战37(进程间通信)

我们的目标是&#xff1a;通过这一套资料学习下来&#xff0c;可以熟练掌握python基础&#xff0c;然后结合经典实例、实践相结合&#xff0c;使我们完全掌握python&#xff0c;并做到独立完成项目开发的能力。 上篇文章我们讨论了通过multiprocessing模块创建进程操作的相关知…

力扣 142.环形链表Ⅱ【详细解释】

一、题目 二、思路 三、代码 /*** Definition for singly-linked list.* class ListNode {* int val;* ListNode next;* ListNode(int x) {* val x;* next null;* }* }*/ public class Solution {public ListNode detectCycle(ListNode hea…

javaWeb项目-ssm+jsp房屋出租管理系统功能介绍

本项目源码&#xff08;点击下方链接下载&#xff09;&#xff1a;java-ssmjsp房屋出租管理系统实现源码(项目源码-说明文档)资源-CSDN文库 项目关键技术 开发工具&#xff1a;IDEA 、Eclipse 编程语言: Java 数据库: MySQL5.7 框架&#xff1a;ssm、Springboot 前端&#xff…

[含文档+PPT+源码等]精品基于springboot实现的原生Andriod大学校园食堂外卖系统App

基于Spring Boot实现的原生Android大学校园食堂外卖系统App的背景可以从以下几个方面进行阐述&#xff1a; 一、项目背景与需求 随着移动互联网技术的快速发展和智能手机的普及&#xff0c;大学生对于便捷、高效的校园生活服务需求日益增长。大学校园食堂作为学生们日常用餐的…

【电商项目】1分布式基础篇

1 项目简介 1.2 项目架构图 1.2.1 项目微服务架构图 1.2.2 微服务划分图 2 分布式基础概念 3 Linux系统环境搭建 查看网络IP和网关 linux网络环境配置 补充P123&#xff08;修改linux网络设置&开启root密码访问&#xff09; 设置主机名和hosts映射 主机名解析过程分析&…

【问题解决】——当出现0xc000007b和缺少mfc140.dll时,该怎么做才能让软件可以打开

目录 事情起因 问题处理 明确定义 填坑之路 最后我是怎么解决的&#xff08;不想看故事直接到这里&#xff09; 事情起因 最近想要重新安装西门子博途来做西门子的一些算法的时候&#xff0c;发现自己软件装的是V15.1的版本&#xff0c;而买的plc1200固件版本要求至少16以…

性能评测第一,阿里开源可商用AI模型Ovis 1.6使用指南,AI多模态大模型首选

什么是 Ovis 1.6 Gemma 2 9B&#xff1f; Ovis 1.6 Gemma 2 9B 是阿里国际AI团队推出的最新多模态大模型&#xff08;Multimodal Large Language Model&#xff0c;MLLM&#xff09;。该模型旨在结构化地对齐视觉和文本嵌入&#xff0c;能够处理和理解多种不同类型的数据输入&…

抑郁症自测量表 API 接口,洞察情绪状态

抑郁症是一种常见的心理疾病&#xff0c;会给患者的生活和工作带来很大的困扰。为了帮助人们更好地了解自己的情绪状态&#xff0c;有一种抑郁症自测量表&#xff08;简称SDS&#xff09;&#xff0c;它是一种能够反映病人主观抑郁症状的自评量表。下面我们将通过调用抑郁症自测…

基于FreeRTOS的LWIP移植

目录 前言一、移植准备工作二、以太网固件库与驱动2.1 固件库文件添加2.2 库文件修改2.3 添加网卡驱动 三、LWIP 数据包和网络接口管理3.1 添加LWIP源文件3.2 Lwip文件修改3.2.1 修改cc.h3.2.2 修改lwipopts.h3.2.3 修改icmp.c3.2.4 修改sys_arch.h和sys_arch.c3.2.5 修改ether…

Linux·文件与IO

1. 回忆文件操作相关知识 我们首先回忆一下关于文件的一些知识。 如果一个文件没有内容&#xff0c;那它到底有没有再磁盘中存在&#xff1f;答案是存在&#xff0c;因为 文件 内容 属性&#xff0c;即使文件内容为空&#xff0c;但属性信息也是要记录的。就像进程的…

硬件产品经理的开店冒险之旅(下篇)

缘起&#xff1a;自己为何想要去寻找职业第二曲线 承接上篇的内容&#xff0c;一名工作13年的普通硬件产品经理将尝试探索第二职业曲线。根本原因不是出于什么高大上的人生追求或者什么职业理想主义&#xff0c;就是限于目前的整体就业形式到了40岁的IT从业人员基本不可能在岗…

【Python】selenium遇到“InvalidArgumentException”的解决方法

在使用try……except 的时候捕获到这个错误&#xff1a; InvalidArgumentException: invalid argument (Session info: chrome112.0.5614.0) 这个错误代表的是&#xff0c;当传入的参数不符合期望时&#xff0c;就会抛出这个异常&#xff1a; InvalidArgumentException: invali…

day-69 使二进制数组全部等于 1 的最少操作次数 II

思路 与3191. 使二进制数组全部等于 1 的最少操作次数 I思路类似&#xff0c;区别在于该题每次将下标i开始一直到数组末尾所有元素反转&#xff0c;所以我们用一个变量可以统计翻转次数 解题过程 从左向右遍历数组的过程中&#xff0c;有两种情况需要进行翻转&#xff1a;1.当…

多媒体(4)

PNG PNG&#xff08;流式网络图像&#xff09;文件采用【无损压缩】算法&#xff0c;压缩比高于GIF文件&#xff0c;支持 图像透明 PNG文件的色彩深度可以是灰度图像的16位&#xff0c;彩色图像的48位&#xff0c;是一种新兴的 网络图像格式 矢量图 矢量图是一组指令集合描述图…