MyBatis的工作流程是怎样的?

大家好,我是锋哥。今天分享关于【MyBatis的工作流程是怎样的?】面试题。希望对大家有帮助;

MyBatis的工作流程是怎样的?

1000道 互联网大厂Java工程师 精选面试题-Java资源分享网

MyBatis 的工作流程可以分为几个主要的步骤,下面是一个概括性的流程:

1. 配置文件加载与初始化

MyBatis 的工作首先从加载配置文件开始。主要配置文件有:

  • mybatis-config.xml:这个配置文件包含 MyBatis 的核心配置,如数据库连接池、日志、插件等。
  • Mapper XML 文件:这些文件包含 SQL 语句和 Java 对象的映射关系。

加载配置文件时,MyBatis 创建一个 SqlSessionFactory 实例,它是 MyBatis 的核心对象,用于创建 SqlSessionSqlSession 是执行 SQL 语句的接口。

详细步骤:
  • MyBatis 加载 mybatis-config.xml 配置文件。
  • 创建 SqlSessionFactoryBuilder,然后加载配置文件,创建 SqlSessionFactory
  • 如果使用了注解方式,SqlSessionFactory 会扫描相关的 Mapper 接口并注册。

2. 获取 SqlSession 对象

一旦 SqlSessionFactory 创建完成,应用程序可以通过它获取 SqlSessionSqlSession 是 MyBatis 与数据库交互的核心对象,它用于执行 SQL 语句、获取映射的对象等。

  • SqlSession 是线程不安全的,因此它通常在每个线程中使用,且每个操作结束后需要关闭。
SqlSession session = sqlSessionFactory.openSession();

3. 执行映射操作

SqlSession 中,开发者通过调用 selectOne()selectList()insert()update()delete() 等方法来执行相应的 SQL 操作。这些方法会查找与之对应的 SQL 语句,然后将 SQL 执行并返回结果。

  • 对于 查询操作,MyBatis 会将查询结果映射为 Java 对象(POJO)。
  • 对于 增删改操作,MyBatis 会根据映射的 SQL 语句执行数据库操作。
查询(select)操作示例:
User user = session.selectOne("com.example.mapper.UserMapper.selectUser", 1);

在这个例子中,MyBatis 会根据提供的 UserMapper.selectUser 映射 SQL 来执行查询操作。

  • MyBatis 会根据 Mapper XML 文件中的 SQL 配置,将 SQL 和参数传递给数据库执行。

4. 映射结果集到 Java 对象

MyBatis 会将查询结果(通常是一个 ResultSet)自动映射到 Java 对象。它使用映射规则,将数据库中的列名与 Java 对象的属性进行匹配。

  • 如果是一个查询操作(select),MyBatis 会将查询到的每一行数据封装成一个 Java 对象(如 User)。
  • 如果查询返回多行数据,MyBatis 会将每一行数据映射成一个对象,并将它们封装在一个 List 或其他集合中。

5. 提交事务(可选)

如果 SqlSession 是在手动提交模式下创建的(openSession(false)),在执行完增删改操作后,需要显式提交事务:

session.commit();

这对于修改数据(insertupdatedelete)时是必需的。如果事务不提交,数据库中的修改操作不会生效。

6. 关闭 SqlSession

一旦数据库操作完成,应该关闭 SqlSession,以释放资源:

session.close();

通常,SqlSession 会在 try-with-resources 语句块中使用,以确保其正确关闭。

7. 使用缓存(可选)

MyBatis 支持缓存机制,可以缓存查询结果,从而提高性能。缓存有两种形式:

  • 一级缓存SqlSession 级别的缓存。对于同一个 SqlSession 中相同的查询,MyBatis 会缓存结果,避免重复查询。
  • 二级缓存SqlSessionFactory 级别的缓存。跨 SqlSession 共享的缓存,通常用来缓存一些查询结果,减少对数据库的访问。

8. 插件和拦截器(可选)

MyBatis 允许开发者通过插件来扩展其功能。例如,可以实现自定义的拦截器来监控 SQL 执行、日志记录、性能优化等。

总结 MyBatis 工作流程:

  1. 加载配置文件,创建 SqlSessionFactory
  2. 获取 SqlSession,通过它来执行数据库操作。
  3. 执行 SQL 操作,MyBatis 将 SQL 语句映射到 Java 对象。
  4. 处理查询结果,将数据库结果集映射成 Java 对象。
  5. 提交事务(如果有),对于增删改操作,事务需要提交才能生效。
  6. 关闭 SqlSession,释放资源。
  7. 使用缓存(如果配置),提高性能。

通过这样的流程,MyBatis 将 SQL 操作与 Java 对象的映射与执行分开,提供了灵活的数据库操作能力,同时保持了较高的性能和可定制性。

如果你有任何问题或者需要进一步的解释,随时告诉我!

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

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

相关文章

carbon 加入 GitCode:Golang 时间处理的 “瑞士军刀”

在 Golang 的开发生态中,时间处理领域长期存在着诸多挑战。高效、精准的时间处理对于各类软件应用的稳定运行与功能拓展至关重要。近日,carbon 正式加入 GitCode,为 Golang 开发者带来一款强大且便捷的时间处理利器,助力项目开发迈…

【力扣】148.排序链表

AC截图 题目 思路 基本情况处理: 如果链表为空 (head NULL) 或者链表仅有一个节点 (head->next NULL),则链表已经是有序的,直接返回头节点 head。 分割链表: 使用快慢指针法找到链表的中间节点。slow 指针每次前进一格&…

新数据结构(7)——Object

Object类是所有类的父类,也就是说所有类都是object类的子类可以使用Object里的方法。 equals()和hashCode()是Object包含的方法 和equals的区别和联系 和equals()都是用于判断是否相等 基本数据类型只能用判断其是否相等,引用数据类型用判断的是其指…

保研考研机试攻略:python笔记(4)

🐨🐨🐨15各类查找 🐼🐼二分法 在我们写程序之前,我们要定义好边界,主要是考虑区间边界的闭开问题。 🐶1、左闭右闭 # 左闭右闭 def search(li, target): h = len(li) - 1l = 0#因为都是闭区间,h和l都可以取到并且相等while h >= l:mid = l + (h - l) // 2…

doris集群

开发doris的团队厉害,这个百度工程师确实也干了一些实事,不像领导层只会跑火车。 1 参数配置 1.1 文件句柄数 vim /etc/security/limits.conf * soft nofile 655350 * hard nofile 6553501.2 关闭透明大页 echo never > /sys/kernel/mm/transpare…

STM32的HAL库开发---高级定时器---互补输出带死区实验

一、互补输出简介 互补输出:OCx输出高电平,则互补通道OCxN输出低电平。OCx输出低电平,则互补通道OCxN输出高电平。 带死区控制的互补输出:OCx输出高电平时,则互补通道OCxN过一会再输出输出低电平。这个时间里输出的电…

京东广告生成式召回基于 NVIDIA TensorRT-LLM 的推理加速实践

0000 生成式推荐系统优势介绍 推荐系统的主要任务是根据用户的历史行为预测其兴趣点,并向其推荐相应的商品。传统的推荐系统在处理用户请求时,会触发多个召回模块(包括热门商品召回、个性化召回、深度召回等),以召回大…

3.React 组件化开发

react:版本 18.2.0node: 版本18.19.1脚手架:版本 5.0.1 一、类组件 (一) 一个干净的脚手架 【1】使用已经被废弃的 CRA (create-react-app) create-react-app 已经被废弃,且目前使用会报错,官方已经不推荐使用&…

51单片机(国信长天)矩阵键盘的基本操作

在CT107D单片机综合训练平台上,首先将J5处的跳帽接到1~2引脚,使按键S4~S19按键组成4X4的矩阵键盘。在扫描按键的过程中,发现有按键触发信号后(不做去抖动),待按键松开后,在数码管的第一位显示相应的数字:从左至右&…

【AI赋能】蓝耘智算平台实战指南:3步构建企业级DeepSeek智能助手

蓝耘智算平台实战指南:3步构建企业级DeepSeek智能助手 引言:AI大模型时代的算力革命 在2025年全球AI技术峰会上,DeepSeek-R1凭借其开源架构与实时推理能力,成为首个通过图灵测试的中文大模型。该模型在语言理解、跨模态交互等维…

机器学习 - 词袋模型(Bag of Words)实现文本情感分类的详细示例

为了简单直观的理解模型训练,我这里搜集了两个简单的实现文本情感分类的例子,第一个例子基于朴素贝叶斯分类器,第二个例子基于逻辑回归,通过这两个例子,掌握词袋模型(Bag of Words)实现文本情感…

没有服务器和显卡电脑如何本地化使用deepseek|如何通过API使用满血版deepseek

目录 一、前言二、使用siliconflow硅基流动 API密钥1、注册硅基流动2、创建API密钥3、下载AI客户端4、使用API密钥5、效果演示 三、使用deepseek官方API密钥1、创建API密钥2、使用API密钥3、效果演示 四、总结 一、前言 上篇文章我介绍了如何通过云服务器或者显卡电脑来本地化…

算法学习笔记之贪心算法

导引(硕鼠的交易) 硕鼠准备了M磅猫粮与看守仓库的猫交易奶酪。 仓库有N个房间,第i个房间有 J[i] 磅奶酪并需要 F[i] 磅猫粮交换,硕鼠可以按比例来交换,不必交换所有的奶酪 计算硕鼠最多能得到多少磅奶酪。 输入M和…

oracle执行grant授权sql被阻塞问题处理

一 问题描述 执行普通的grant授权sql(grant select,update on 表名 to 用户名)好几分钟都没反应,跟被阻塞了似的。 二 问题排查 #排查是否有阻塞 用OEM可以看到阻塞信息: 点‘性能’-‘阻塞会话’: 下面那个会话2958是我执行grant sql的…

SSM仓库物品管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.用户登录代码:2.保存物品信息代码:3.删除仓库信息代码: 一、项目演示 项目演示地址: 视频地址 二、项目介绍 项目描述:这是一个基于SSM框架开发的仓库…

Deepseek 接入Word处理对话框(隐藏密钥)

硅基流动邀请码:1zNe93Cp 邀请链接:网页链接 亲测deepseek接入word,自由调用对话,看截图有兴趣的复用代码(当然也可以自己向deepseek提问,帮助你完成接入,但是提问逻辑不一样给出的答案是千差万…

Docker Compose介绍及安装使用MongoDB数据库详解

在现代容器化应用部署中,Docker Compose是一种非常实用的工具,它允许我们通过一个docker-compose.yml文件来定义和运行多容器应用程序。然而,除了Docker之外,Podman也提供了类似的工具——Podman Compose,它允许我们在…

IntelliJ IDEA Console控制台输出成json的配置方式

【IntelliJ IDEA Console控制台输出成json的配置方式】 1.帮助->查找操作 2.搜索注册表 3.ctrlf 搜索pty 控制台右键 结果

基础入门-HTTP数据包红蓝队研判自定义构造请求方法请求头修改状态码判断

知识点: 1、请求头&返回包-方法&头修改&状态码等 2、数据包分析-红队攻击工具&蓝队流量研判 3、数据包构造-Reqable自定义添加修改请求 一、演示案例-请求头&返回包-方法&头修改&状态码等 数据包 客户端请求Request 请求方法 …

react redux用法学习

参考资料: https://www.bilibili.com/video/BV1ZB4y1Z7o8 https://cn.redux.js.org/tutorials/essentials/part-5-async-logic AI工具:deepseek,通义灵码 第一天 安装相关依赖: 使用redux的中间件: npm i react-redu…