Mybatis核心问题总结

对MyBatis源码的理解

ORM框架:CRUD操作

1。SQL解析:

映射文件、注解--》映射器解析 XMLMapperBuilder MapperAnnotationBuilder

2。SQL执行:

SqlSession 接口--》Executor --》 SimpleExecutor ReuseExecutor 【Statement--JDBC】

3。结果映射:

ResultSetHandler

4。插件机制:

Interceptor

5。缓存机制--》

工作中 二级缓存 --》Redis做缓存

谈谈你对MyBatis中缓存的理解

缓存的作用:

不加缓存  1。查询的效率降低  2。增大了数据库的压力

一级缓存:会话级别的

二级缓存:进程级别的

1。项目中要使用缓存  全局配置文件中 settings 我们需要打开, 在对应的映射文件中 <cache>

2。一级缓存是默认使用的。二级缓存我们需要自己开启:源码中是如何设计的?

一级和二级缓存的执行的先后顺序:先查二级缓存。二级缓存没有再看一级缓存。一级缓存如果还是没有那么走数据库查询

作用域:一级缓存的作用域是session级别的,命中率很低

数据同步:DML操作的时候会清空缓存的数据

现在都是分布式环境,MyBatis如何实现三级缓存?

1。我们工作用到了三级缓存。通过Redis。怎么实现呢? 

三级缓存的自定义实现。重写Cache接口的读写方法

一级缓存是 MyBatis 默认开启的,它存在于 SqlSession 级别,对同一个 SqlSession 内的查询结果进行缓存。

二级缓存是基于 namespace 级别的缓存,可以在多个 SqlSession 之间共享。它需要在配置文件中进行开启和配置。

要实现三级缓存,你可以考虑以下几种方法:

  1. 使用分布式缓存:可以将二级缓存的数据存储到分布式缓存系统中,如 Redis 或 Memcached。这样,不同的应用实例或服务器可以共享缓存数据,实现三级缓存的效果。
  2. 自定义缓存实现:你可以自己开发一个缓存组件,并将其集成到 MyBatis 中。这个缓存组件可以在应用级别或系统级别进行管理,提供更高级别的缓存功能。
  3. 结合其他缓存框架:除了 MyBatis 的缓存,还可以使用其他专门的缓存框架,如 Spring Cache 等。通过将 MyBatis 的查询结果与这些缓存框架集成,可以实现更复杂的缓存策略和多级缓存。

谈谈你对日志模块的理解

日志模块使用到了适配器模式,对于MyBatis中的数据库的相关操作通过代理模式实现了日志的监控

谈谈你对SqlSessionFactory的理解

SqlSessionFactory:工厂模式:负责SqlSession对象的管理

全局的。我们应该对SqlSessionFactory做单例处理;

完成全局配置文件和映射文件的加载解析--》Configuration对象

谈谈你对SqlSession的理解

SqlSession具体处理每个CRUD操作

1。生命周期:需要做数据库操作的时候会创建。不需要操作数据库就关闭

2。作用:完成数据库的操作

3。线程安全:SqlSession是线程不安全的 --》 单纯的MyBatis的应用。我们就不能把SqlSession作用成员变量来使用 在Spring环境中怎么处理的  SqlSessionTemplate

谈谈你对MyBatis中的Executor的源码理解

Executor:执行器。具体执行SQL操作

Executor:Simple Reuse Batch

CachingExecutor:缓存的装饰

MyBatis中是如何对占位符进行赋值的?

SQL解析 # $ ==> ParameterHandler

  1. 定义占位符:在 SQL 语句中使用占位符,通常以#{}的形式表示。例如:SELECT * FROM table WHERE id = #{id}
  2. 设置参数:在执行 SQL 语句之前,需要通过 MyBatis 的接口或方法设置相应的参数值。这可以通过传递参数对象或使用参数映射来完成。
  3. 参数绑定:MyBatis 会将设置的参数与占位符进行绑定。它会根据参数的类型和名称,将实际的值替换到占位符的位置。
  4. 执行 SQL 语句:当执行带有占位符的 SQL 语句时,MyBatis 会将绑定后的参数值代入 SQL 中,并执行该语句。

Spring中是如何解决MySQL的SqlSession的线程安全问题的?

  1. 使用 SqlSessionFactory:Spring 会配置一个 SqlSessionFactory,它负责创建和管理 SqlSession 对象。SqlSessionFactory 是线程安全的,可以在多个线程中共享使用。
  2. 依赖注入 SqlSession:通过 Spring 的依赖注入机制,将 SqlSession 注入到需要使用数据库操作的类中。这样,每个类在使用 SqlSession 时都可以获得一个独立的实例。
  3. 控制 SqlSession 的生命周期:Spring 可以管理 SqlSession 的创建和关闭,确保在合适的时机创建和释放 SqlSession,避免资源泄漏。
  4. 线程隔离:每个使用 SqlSession 的线程都会获得自己独立的 SqlSession 实例,从而避免了线程之间的竞争和数据不一致性问题。

通过以上方式,Spring 能够有效地管理 SqlSession 的线程安全问题,使得在多线程环境下使用 MyBatis 进行数据库操作更加可靠和安全。

你对MyBatis中的Configuration的源码的理解

  1. 配置信息存储Configuration 类中包含了众多属性,用于存储各种配置项,如数据库连接信息、映射文件路径、插件配置等。这些配置信息通常通过 XML 配置文件或 Java 代码进行设置。
  2. 映射解析Configuration 负责解析映射文件(如 XML 格式的 mapper 文件),将其中的 SQL 语句、结果映射等信息加载到内存中,以便后续执行。
  3. 对象工厂和类型别名:它管理对象工厂,用于创建 MyBatis 中的各种对象,如 SqlSession。此外,还定义了类型别名,方便在配置中使用简洁的名称来引用 Java 类型。
  4. 插件管理Configuration 支持插件机制,允许开发者注册自定义插件来扩展 MyBatis 的功能。插件可以在执行过程中的特定点进行拦截和处理。
  5. 环境配置:包含了对数据库环境的配置,如数据源、事务管理器等。可以根据不同的环境设置不同的配置。
  6. 缓存管理:管理 MyBatis 的缓存机制,包括一级缓存和二级缓存的配置。
  7. SQL 语句构建和执行:根据配置信息和映射文件,构建 SQL 语句,并通过执行器执行这些语句,返回结果。

Configuration:全局配置。映射文件解析的内容都保存在Configuration中


谈谈MyBatis中的插件原理

&emsp;1。插件的作用: 分页  SQL检查

2。插件的原理

  1. 拦截器接口:MyBatis 定义了一些拦截器接口,例如 Interceptor 接口。插件需要实现这些接口,以便在特定的执行点进行拦截。
  2. 插件注册:在 MyBatis 的配置文件中,可以注册插件。通过配置插件的相关信息,告诉 MyBatis 在哪些执行点应用插件。
  3. 执行点拦截:当 MyBatis 执行特定的操作时,如执行 SQL 语句、参数设置、结果映射等,会触发相应的拦截器。插件可以在这些执行点之前或之后执行自定义的逻辑。
  4. 上下文传递:MyBatis 会将执行上下文传递给插件,插件可以通过这个上下文获取相关的信息,如 SQL 语句、参数、结果等,并根据需要进行处理。
  5. 修改执行行为:插件可以根据自己的逻辑修改执行行为。例如,可以修改 SQL 语句、添加额外的参数、处理结果集等。
  6. 返回结果:插件执行完自定义逻辑后,可以选择返回修改后的结果,或者将控制权交回给 MyBatis 继续执行。

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

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

相关文章

Go语言---Json

JSON (JavaScript Object Notation)是一种比XML 更轻量级的数据交换格式&#xff0c;在易于人们阅读和编写的同时&#xff0c;也易于程序解析和生成。尽管JSON是 JavaScript的一个子集&#xff0c;但 JSON采用完全独立于编程语言的文本格式&#xff0c;且表现为键/值对集合的文…

【大模型LLM面试合集】大语言模型架构_layer_normalization

2.layer_normalization 1.Normalization 1.1 Batch Norm 为什么要进行BN呢&#xff1f; 在深度神经网络训练的过程中&#xff0c;通常以输入网络的每一个mini-batch进行训练&#xff0c;这样每个batch具有不同的分布&#xff0c;使模型训练起来特别困难。Internal Covariat…

【C++高阶】高效数据存储:理解并模拟实现红黑树Map与Set

&#x1f4dd;个人主页&#x1f339;&#xff1a;Eternity._ ⏩收录专栏⏪&#xff1a;C “ 登神长阶 ” &#x1f921;往期回顾&#x1f921;&#xff1a;了解 红黑树 &#x1f339;&#x1f339;期待您的关注 &#x1f339;&#x1f339; ❀模拟实现Map与Set &#x1f4d2;1.…

js ES6 part1

听了介绍感觉就是把js在oop的使用 作用域 作用域&#xff08;scope&#xff09;规定了变量能够被访问的“范围”&#xff0c;离开了这个“范围”变量便不能被访问&#xff0c; 作用域分为&#xff1a; 局部作用域、 全局作用域 1. 函数作用域&#xff1a; 在函数内部声明的…

爬取天气数据,利用Pyecharts作轮播图

爬取网站链接&#xff1a;https://lishi.tianqi.com/xiamen/202312.html 爬取了厦门市2023年一整年的天气数据&#xff0c;包括最高温&#xff0c;最低温&#xff0c;天气&#xff0c;风力风向等 爬虫代码&#xff1a; import requests import pandas as pd import csv from…

UML建模案例分析-时序图和类图的对应关系

概念 简单地说&#xff0c;类图定义了系统中的对象&#xff0c;时序图定义了对象之间的交互。 例子 一个电子商务系统&#xff0c;会员可通过电子商务系统购买零件。具体功能需求如下&#xff1a; 会员请求结账时&#xff0c;系统验证会员的账户是否处于登录状态&#xff1…

极狐GitLab 17.0 重磅发布,100+ DevSecOps功能更新来啦~【三】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

【基础篇】1.8 C语言基础(二)

2.9 预处理指令和宏定义 在STM32开发中,预处理和宏定义常用于配置硬件参数、启用或禁用特定功能、以及优化代码以适应不同的硬件配置或应用场景。通过合理地使用预处理和宏定义,我们可以编写更加灵活、可配置和高效的代码。 预处理指令如#include、#define等在C语言编程中起…

防火墙图形化界面策略和用户认证(华为)

目录 策略概要认证概要实验拓扑图题目要求一要求二要求三要求四要求五要求六 策略概要 安全策略概要&#xff1a; 安全策略&#xff08;Security Policy&#xff09;在安全领域具有双重含义。宏观上&#xff0c;安全策略指的是一个组织为保证其信息安全而建立的一套安全需求、…

uniapp 微信小程序接入MQTT

MQTT安装 前期准备 由于微信小程序需要wss&#xff0c;所以要有域名SSL证书 新建目录/srv/mosquitto/config&#xff0c;/srv/mosquitto/config/cert 目录/srv/mosquitto/config中新建配置文件mosquitto.conf&#xff0c;文件内容 persistence true persistence_location /m…

深入探索Apache Flink:流处理的艺术与实践

在当今的大数据时代&#xff0c;流处理已成为处理实时数据的关键技术。Apache Flink&#xff0c;作为一个开源的流处理框架&#xff0c;以其高吞吐量、低延迟和精确一次&#xff08;exactly-once&#xff09;的语义处理能力&#xff0c;在众多流处理框架中脱颖而出。本文将深入…

在树莓派设备上导出系统镜像

镜像导出 前提条件&#xff1a; 已获取可以正常使用的设备。已获取鼠标、键盘和电源适配器。已将设备接入可正常使用的网络。 操作步骤&#xff1a; 连接适配器给设备上电&#xff0c;正常启动设备&#xff0c;连接鼠标和键盘。在终端命令窗格执行如下命令&#xff0c;安装…

数据模型-ER图在数据模型设计中的应用

ER图在数据模型设计中的应用 1. ER图概述&#xff1a;起源与发展​ 实体-关系图&#xff08;Entity Relationship Diagram&#xff0c;简称ER图&#xff09;起源于1970年代&#xff0c;由Peter Chen首次提出&#xff0c;作为描述数据和信息间关系的图形化语言。随着数据库技术…

[PM]流程与结构设计

流程图 流程就是为了达到特定目标, 进行的一系列有逻辑性的操作步骤, 由两个及已上的步骤, 完成一个完整的行为过程, 即可称为流程, 流程图就是对这个过程的图形化展示 分类 业务流程图 概念: 描述业务流程的一种图, 通过特定符号和连线表示具体某个业务的处理步骤和过程作…

MyBatis与JDBC相比,有哪些优势

MyBatis与JDBC&#xff08;Java Database Connectivity&#xff09;相比&#xff0c;在多个方面展现出显著的优势。这些优势使得MyBatis在现代软件开发中成为一个非常受欢迎的选择&#xff0c;特别是在处理数据库交互时。以下是MyBatis相比JDBC的主要优势&#xff1a; 1. 简化…

极狐GitLab亮相世界人工智能大会,开启开源大模型赋能软件研发新时代

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…

285个地级市-胡焕庸线数据

全国285个地级市-胡焕庸线数据.zip资源-CSDN文库 胡焕庸线&#xff1a;中国人口与生态的分界线 胡焕庸线&#xff0c;一条在中国地理学界具有划时代意义的分界线&#xff0c;由著名地理学家胡焕庸于1935年提出。这条线从黑龙江省的瑷珲&#xff08;现黑河市&#xff09;延伸至…

json-server总结

Json-server 是一个专门用于模拟 RESTful API 的工具&#xff0c;它允许前端开发人员在不依赖后端 API 的情况下进行开发&#xff0c;通过本地搭建一个 JSON 服务来快速生成 REST API 风格的后端服务。 一、主要特点与功能 快速搭建&#xff1a;Json-server 使用 JSON 文件作…

HippoRAG如何从大脑获取线索以改进LLM检索

知识存储和检索正在成为大型语言模型(LLM)应用的重要组成部分。虽然检索增强生成(RAG)在该领域取得了巨大进步&#xff0c;但一些局限性仍然没有克服。 俄亥俄州立大学和斯坦福大学的研究团队推出了HippoRAG&#xff0c;这是一种创新性的检索框架&#xff0c;其设计理念源于人类…

数学建模美赛论文文档

目录 1. 摘要&#xff1a;1.1 阅读并理解题目1.2 背景介绍1.3 问题提出 2. 目录&#xff1a;2.1 引言&#xff08;Introduction&#xff09;2.2 假设与合理性说明&#xff08;Assumptions and Justifications&#xff09;2.3 符号说明&#xff08;Notations&#xff09;2.4 模型…