MyBatis的工作流程是怎样的?

news2025/1/18 9:34:03

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

MyBatis的工作流程是怎样的?

MyBatis 的工作流程可以分为几个主要步骤:从配置、映射到执行 SQL,最终获取数据库结果并映射回 Java 对象。下面是 MyBatis 的典型工作流程:

1. 加载配置文件

MyBatis 的核心是 SqlSessionFactory,它负责创建 SqlSession 实例。SqlSessionFactory 通过读取配置文件来初始化 MyBatis。配置文件通常是 mybatis-config.xml,它包含了 MyBatis 的全局配置和一些其他配置信息(例如:数据库连接池、事务管理、缓存设置等)。

  • 步骤
    • 创建 SqlSessionFactoryBuilder
    • 通过 SqlSessionFactoryBuilder.build(inputStream) 加载 mybatis-config.xml 配置文件。
    • SqlSessionFactory 创建后,应用程序可以从中获取 SqlSession 实例。
    • <!-- mybatis-config.xml -->
      <configuration>
          <environments default="development">
              <environment id="development">
                  <transactionManager type="JDBC"/>
                  <dataSource type="POOLED">
                      <property name="driver" value="com.mysql.cj.jdbc.Driver"/>
                      <property name="url" value="jdbc:mysql://localhost:3306/mydb"/>
                      <property name="username" value="root"/>
                      <property name="password" value="password"/>
                  </dataSource>
              </environment>
          </environments>
          <mappers>
              <mapper resource="com/example/mapper/UserMapper.xml"/>
          </mappers>
      </configuration>
      

2. 创建 SqlSession 实例

SqlSession 是 MyBatis 与数据库交互的核心接口,应用程序通过它执行 SQL 语句,获取查询结果,提交事务等。SqlSession 是通过 SqlSessionFactory 创建的。

  • 步骤
    • 调用 SqlSessionFactory.openSession() 创建 SqlSession 对象(可以指定自动提交事务的模式)。
    • 每次使用完 SqlSession 后,要调用 sqlSession.close() 来关闭连接。
    • SqlSession session = sqlSessionFactory.openSession();
      

3. 执行 SQL 语句

MyBatis 通过 SqlSession 来执行 SQL 语句。SQL 语句通常是通过 XML 映射文件(如 UserMapper.xml)与 Java 接口(如 UserMapper.java)映射的。

  • 步骤
    • SqlSession 提供了方法来执行各种 SQL 操作,比如 selectOne()selectList()insert()update()delete() 等。
    • SqlSession 会根据传入的映射 ID 查找对应的 SQL 映射语句,然后执行 SQL。
    • UserMapper mapper = session.getMapper(UserMapper.class);
      User user = mapper.selectUserById(1);
      

在上面的代码中,mapper.selectUserById(1) 会调用 UserMapper.xml 中的 selectUserById 映射方法,执行对应的 SQL 语句。

4. SQL 映射和动态 SQL

在 MyBatis 中,SQL 是通过 XML 映射文件(如 UserMapper.xml)与 Java 接口方法关联的。MyBatis 支持使用动态 SQL,根据传入参数动态生成 SQL 语句。

  • 静态 SQL 映射示例

    <mapper namespace="com.example.mapper.UserMapper">
        <select id="selectUserById" resultType="com.example.domain.User">
            SELECT id, name, email FROM users WHERE id = #{id}
        </select>
    </mapper>
    

  • 动态 SQL 示例

    <select id="selectUsersByCondition" resultType="com.example.domain.User">
        SELECT id, name, email FROM users
        WHERE 1=1
        <if test="name != null">AND name = #{name}</if>
        <if test="email != null">AND email = #{email}</if>
    </select>
    

在上面的例子中,selectUsersByCondition 根据传入的条件动态拼接 SQL 语句。

5. 获取查询结果并映射到 Java 对象

MyBatis 会将从数据库查询到的结果映射到 Java 对象中,过程是通过 resultMap 或简单的 resultType 配置来完成的。

  • 使用 resultType 映射结果:

    如果 SQL 查询的返回结果与 Java 类的字段直接对应,MyBatis 会自动将结果集映射到 Java 对象中。

    <select id="selectUserById" resultType="com.example.domain.User">
        SELECT id, name, email FROM users WHERE id = #{id}
    </select>
    

  • 使用 resultMap 映射复杂的查询结果:

    对于复杂的查询(例如一对多关系),可以使用 resultMap 映射更复杂的对象结构。

    <resultMap id="userResultMap" type="com.example.domain.User">
        <id property="id" column="id"/>
        <result property="name" column="name"/>
        <result property="email" column="email"/>
        <collection property="orders" ofType="com.example.domain.Order" 
                    select="selectOrdersByUserId" column="id"/>
    </resultMap>
    

    这里,selectOrdersByUserId 是一个子查询,用于加载用户的订单信息。

6. 提交事务或回滚

MyBatis 支持事务管理。如果使用 SqlSessionFactory.openSession(true) 方法,SqlSession 会自动提交事务。如果没有启用自动提交,则需要手动提交事务。

  • 步骤
    • 如果执行了更新、插入或删除操作,需要调用 session.commit() 提交事务。
    • 如果操作失败,可以调用 session.rollback() 来回滚事务。
session.commit();  // 提交事务
session.rollback();  // 回滚事务

7. 关闭 SqlSession

使用完 SqlSession 后,必须关闭它,释放数据库连接。否则,可能会造成连接泄漏。

session.close();  // 关闭 SqlSession

总结 MyBatis 工作流程

  1. 加载配置文件:MyBatis 通过 SqlSessionFactoryBuilder 读取 mybatis-config.xml 文件并创建 SqlSessionFactory
  2. 创建 SqlSession:通过 SqlSessionFactory.openSession() 创建 SqlSession 实例,执行 SQL 操作。
  3. 执行 SQL 语句:使用 SqlSession 调用映射的 SQL 语句(如 selectOne()selectList() 等)。
  4. 映射查询结果:MyBatis 将查询结果自动映射为 Java 对象,支持动态 SQL 和复杂映射。
  5. 事务处理:提交或回滚事务。
  6. 关闭 SqlSession:使用完 SqlSession 后,必须关闭它。

这个流程体现了 MyBatis 在执行 SQL 时的高灵活性和控制力,但也要求开发者对 SQL 和映射有更多的掌控。

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

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

相关文章

MYSQL PARTITIONING分区操作和性能测试

PARTITION OR NOT PARTITION IN MYSQl Bill Karwin says “In most circumstances, you’re better off using indexes instead of partitioning as your main method of query optimization.” According to RICK JAMES: “It is so tempting to believe that PARTITIONing wi…

[软件工程]九.可依赖系统(Dependable Systems)

9.1什么是系统的可靠性&#xff08;reliability&#xff09; 系统的可靠性反映了用户对系统的信任程度。它反映了用户对其能够按照预期运行且正常使用中不会失效的信心程度。 9.2什么是可依赖性&#xff08;dependablity&#xff09;的目的 其目的是覆盖系统的可用性&#x…

vue3中使用watchEffect和watch函数时应当防止内存泄漏

官方文档&#xff1a;https://cn.vuejs.org/api/reactivity-core.html#watcheffect 也就是说当使用他们两个时候&#xff0c;使用完成之后要及时停止他们&#xff0c;防止一直在运行&#xff0c;停止他们之后&#xff0c;也可以再次开启。 watchEffect()​ 立即运行一个函数…

Wwise SoundBanks内存优化

1.更换音频格式为Vorbis 2.停用多余的音频&#xff0c;如Random Container的随机脚步声数量降为2个 3.背景音乐勾选“Stream”。这样就让音频从硬盘流送到Wwise&#xff0c;而不是保存在内存当中&#xff0c;也就节省了内存 4.设置最大发声数Max Voice Instances 5.设置音频…

Windows宝塔面板下IIS环境如何部署SSL证书?

Windows宝塔面板下IIS环境如何部署SSL证书&#xff1f; 平时服务器linux宝塔用的较多&#xff0c;所以linux系统宝塔&#xff0c;如何部署SSL证书还是比较熟悉&#xff0c;今天遇到一个windows的部署SSL证书&#xff0c;还是头一次&#xff0c;所以记录一下&#xff0c;以防忘…

【计算机视觉】图像的几何变换

最常见的几何变换有仿射变换和单应性变换两种&#xff0c;最常用的仿射变换有缩放、翻转、旋转、平移。 1. 缩放 将图像放大或缩小会得到新的图像&#xff0c;但是多出的像素点如何实现----插值 1.1 插值方法 最近邻插值 双线性插值 cv2.resize() 是 OpenCV 中用于调整图像…

深入浅出 Go 语言:数组与切片

深入浅出 Go 语言&#xff1a;数组与切片 引言 在 Go 语言中&#xff0c;数组和切片是两种非常重要的数据结构&#xff0c;用于存储和操作一组相同类型的元素。虽然它们看起来相似&#xff0c;但在使用上有很大的区别。理解数组和切片的区别以及如何正确使用它们&#xff0c;…

基于超级电容和电池的新能源汽车能量管理系统simulink建模与仿真

目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 超级电容特性 4.2 电池特性 5.完整工程文件 1.课题概述 基于超级电容和电池的新能源汽车能量管理系统simulink建模与仿真。分析不同车速对应的电池&#xff0c;超级电容充放电变化情况。 2.系统仿…

y3编辑器文档3:物体编辑器

文章目录 一、物体编辑器简介1.1 界面介绍1.2 复用(导入导出)1.3 收藏夹(项目资源管理)1.4 对象池二、单位2.1 数据设置2.2 表现设置2.3 单位势力和掉率设置2.4 技能添加和技能参数修改2.5 商店2.5.1 商店属性设置2.5.2 商店物品设置三、装饰物3.1 属性编辑3.2 碰撞体积四、…

「嵌入式系统设计与实现」书评:学习一个STM32的案例

本文最早发表于电子发烧友论坛&#xff1a;【新提醒】【「嵌入式系统设计与实现」阅读体验】 学习一个STM32的案例 - 发烧友官方/活动 - 电子技术论坛 - 广受欢迎的专业电子论坛!https://bbs.elecfans.com/jishu_2467617_1_1.html 感谢电子发烧友论坛和电子工业出版社的赠书。 …

Qt Designer Ui设计 功能增加

效果展示 输入密码&#xff0c;密码错误&#xff0c;弹出提示 密码正确&#xff0c;弹出提示并且关闭原窗口 代码&#xff08;只提供重要关键主代码&#xff09;lxh_log.py代码&#xff1a; import sysfrom PySide6.QtWidgets import QApplication, QWidget, QPushButtonfrom …

RT Thread Studio新建STM32F407IG工程文件编译提示错误

编译提示错误 原因: RT 源码使用4.0.3的话&#xff0c;请用STM32F4支持包的0.2.2版本&#xff0c;就不会出错了。 如果支持包用0.2.3版本的话&#xff0c;需要用RT内核4.1.0版本。0.2.3 版本更新了一些针对内核4.1.0的驱动代码&#xff0c;这几个定义都是4.1.0里的。

智能制造标准体系建设指南

一、智能制造系统架构总览 智能制造作为当今制造业转型升级的核心&#xff0c;深度整合了新一代信息技术与传统制造工艺&#xff0c;催生出一个横跨产品全生命周期、纵贯多层级组织架构&#xff0c;并彰显多元智能特性的复杂系统。这一架构从生命周期、系统层级、智能特征三个…

DApp开发与APP开发的五大区别

随着比特币与区块链技术的不断发展&#xff0c;DApp应用会逐渐成为主流。与APPAPP相比&#xff0c;DApp有许多不同之处&#xff0c;尤其是在架构、数据存储、用户隐私等方面。本文将通过五大关键点&#xff0c;深入探讨DApp开发与APP开发之间的主要区别。 1. 后端架构&#xff…

XSS(DOM)-HIGH错误总结

HIGH就不从简单的开始。 我们直接闭合HTML标签绕过 ></option></select><img srcx:alert(alt) οnerrοreval(src) altxss> 没有变化 这里应该是后端的问题&#xff0c;试试锚点注入 English#<script>alert(xss)</script> 这里不知道什么…

Mitel MiCollab 企业协作平台 任意文件读取漏洞复现(CVE-2024-41713)

0x01 产品简介 Mitel MiCollab是加拿大Mitel(敏迪)公司推出的一款企业级协作平台,旨在为企业提供统一、高效、安全的通信与协作解决方案。通过该平台,员工可以在任何时间、任何地点,使用任何设备,实现即时通信、语音通话、视频会议、文件共享等功能,从而提升工作效率和…

【PostgreSQL系列】列类型从整数转换为 UUID

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

【原生js案例】webApp实现鼠标移入移出相册放大缩小动画

图片相册这种动画效果也很常见&#xff0c;在我们的网站上。鼠标滑入放大图片&#xff0c;滑出就恢复原来的大小。现在我们使用运动定时器来实现这种滑动效果。 感兴趣的可以关注下我的系列课程【webApp之h5端实战】&#xff0c;里面有大量的css3动画效果制作原生知识分析&…

Java项目实战II基于微信小程序的消防隐患在线举报系统(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、核心代码 五、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着城市化进程的加快&…