mybatis工作原理

2023-11-03

1. 基本原理

首先看一段JDBC代码:

	Class.forName("com.mysql.jdbc.Driver");
	String url = "jdbc:mysql://localhost:3306/localdb";
	Connection con = DriverManager.getConnection(url, "root","password");			
	String sql = "SELECT name FROM t_test_employee WHERE id = ?";
	PreparedStatement ps = con.prepareStatement(sql);
	ps.setString(1, "123");
	ResultSet rs = ps.executeQuery();
	while(rs.next()){
		System.out.println("name=" + rs.getString(1));
	}
	con.close();

大家应该比较熟悉这段代码,典型的jdbc流程: 建立连接->传递sql->传递参数->sql执行->处理结果->关闭连接。ORM框架的本质是抽取共性、封装逻辑。
现在,如果我们来设计一个ORM框架该如何设计? 仔细考虑JDBC流程,可以发现流程中需要用户配置的输入和输出是变化的(如下,括号中部分),而其他部分则是固定不变的逻辑。

建立连接(数据源配置信息)->传递sql(sql语句)->传递参数(sql参数)->sql执行->处理结果(映射关系)->关闭连接

数据源配置信息:配置文件,在启动时从配置文件中读取并建立数据源对象
Sql语句:配置文件(代码),在启动时抽取解析,以<Key,SQL>的形式存储
Sql参数:java bean对象,在执行前从对象中抽取
映射关系:配置文件(代码),根据映射关系读取结果集并创建java bean返回。

不难想象,Mybatis会在启动时”读取配置数据(builder)”,”建立数据源(datasource)”; 然后程序开始执行,传递sql语句的”Key”和java bean; 最后”执行SQL,处理结果(executor)”。 当然,Mybatis也要负责”连接管理(session)”和”事务管理(transaction)”等内容。

2. 工作原理

在这里插入图片描述
mybatis应用程序通过SqlSessionFactoryBuilder从mybatis-config.xml配置文件(也可以用Java文件配置的方式,需要添加@Configuration)中构建出SqlSessionFactory(SqlSessionFactory是线程安全的);

然后,SqlSessionFactory的实例直接开启一个SqlSession,再通过SqlSession实例获得Mapper对象并运行Mapper映射的SQL语句,完成对数据库的CRUD和事务提交,之后关闭SqlSession。

说明:SqlSession是单线程对象,因为它是非线程安全的,是持久化操作的独享对象,类似jdbc中的Connection,底层就封装了jdbc连接。

详细流程如下:

1、加载mybatis全局配置文件(数据源、mapper映射文件等),解析配置文件,MyBatis基于XML配置文件生成Configuration,和一个个MappedStatement(包括了参数映射配置、动态SQL语句、结果映射配置),其对应着<select | update | delete | insert>标签项。

2、SqlSessionFactoryBuilder通过Configuration对象生成SqlSessionFactory,用来开启SqlSession。

3、SqlSession对象完成和数据库的交互:
a、用户程序调用mybatis接口层api(即Mapper接口中的方法)。
b、SqlSession通过调用api的Statement ID找到对应的MappedStatement对象。
c、通过Executor(负责动态SQL的生成和查询缓存的维护)将MappedStatement对象进行解析,sql参数转化、动态sql拼接,生成jdbc Statement对象。
d、JDBC执行sql。
e、借助MappedStatement中的结果映射关系,将返回结果转化成HashMap、JavaBean等存储结构并返回。
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

mybatis工作原理 的相关文章

随机推荐

  • 宽带远端服务器无响应什么意思,宽带远程服务器无响应

    宽带远程服务器无响应 内容精选 换一换 已成功添加目标环境 如果目标环境处于在线状态 只允许修改目标环境名称 如果目标环境处于离线状态 可以输入登录远程服务器的用户名和密码重新部署分析辅助软件 如果目标环境处于在线状态 只允许修改目标环境名
  • 10.12技术沉淀

    cpp 编写程序实现ADT表的定义 及常用操作 1 判断表是否为空 2 获取第i个节点的内容 3 删除 4 插入 include
  • 全局变量/局部变量/静态变量

    1 全局变量 全局变量是在所有函数体的外部定义的 程序的所有部分 其他文件的代码 都可以使用 全局变量不受作用域的影响 全局变量的生命周期一直到程序的结束 全局变量是静态存储方式 如果在一个文件中使用extern关键字来声明另一个文件中存在
  • 论文-- 基于 证据理论 的 不确定信息 度量与融合应用

    摘要 1 工程应用 不确定信息 1 模糊集合 表示的 模糊信息 2 语义上不一致或非特异性 造成的 歧义信息 3 开放世界特性 导致的 非完备信息 1 不确定信息的处理 基于证据理论 2 不确定信息分类 封闭世界 空集的基本概率指派函数值为
  • ConvNeXt网络详解

    ConvNeXt 论文名称 A ConvNet for the 2020s 论文下载链接 https arxiv org abs 2201 03545 论文对应源码链接 https github com facebookresearch C
  • 【论文学习】YOLOv3:An Incremental Improvement

    论文 YOLOv3 源代码 pjreddie com yolo 视频 https youtu be MPU2HistivI 1 Abstract 作者对YOLO进行了进一步的更新 做了一些小设计更改让其表现更好 YOLOv3比YOLOv2相
  • 【OS】IO系统——设备管理

    操作系统的设备管理 IO系统 一 啥是IO系统 操作系统是一种特殊的管理系统 管理与计算机相关的各种资源 往大了说 包括硬件资源和软件资源 细化了说 包括计算资源 内存资源 文件资源 设备资源 本文主要讲解设备管理的相关内容 1 OS管理的
  • 一分钟总结Spring的IOC和DI

    IOC Inverse of control 控制反转 IoC 控制反转 就是将程序中原来 new 对象 交给spring创建 从spring工厂获取对象 使用spring来负责控制对象的生命周期和对象间的关系 Spring所倡导的开发方式
  • 数据库视图的基本概念及作用

    一 视图简介 视图是从一个或几个基本表 或视图 中导出的虚拟的表 在系统的数据字典中仅存放了视图的定义 不存放视图对应的数据 视图是原始数据库数据的一种变换 是查看表中数据的另外一种方式 可以将视图看成是一个移动的窗口 通过它可以看到感兴趣
  • vcruntime140.dll丢失的解决方法

    vcruntime140 dll是vc运行库中的链接库文件 一般它会出现的状况就是系统提示dll丢失 这样的情况一般出现在游戏应用或者软件程序中 且会导致程序无法正常运行 只要下载此补丁 根据下面的步骤进行操作即可解决问题若你的电脑不小心丢
  • 前端常用js加密方法

    这里罗列前端常用的js加密方法 base64加密
  • 计算机网络知识点(网络层)

    文章目录 重要内容 4 1 网络层提供的两种服务 4 2 网际协议IP 4 2 1 虚拟互联网络 4 2 2 分类的IP地址 4 2 3 IP地址与硬件地址 4 2 4 地址解析协议ARP 4 2 5 IP数据报的格式 4 2 6 IP层转
  • 关于Android证书MD5获取

    Android打包证书获取MD5值 最近在学习Android开发 在打包成apk时发现需要一个证书文件 于是就随手生成了一个证书文件 在后期使用百度人脸识别SDK时发现需要用到证书文件的MD5值 按照百度说明文档以及网上大多数查看证书文件的
  • Centos7安装配置nginx

    1 前言 在进行nginx安装前 考虑到本博客针对很多新手朋友我决定还是先介绍一些nginx知识 这样更加有利于各位读者朋友对nginx的理解 对后续学习也有很大帮助 介绍 Nginx engine x 是一个高性能的HTTP和反向代理we
  • Android jni报错No implementation found

    2022 04 18 20 25 52 738 28123 28123 com example insectdetector E AndroidRuntime FATAL EXCEPTION main Process com example
  • JS数组和方法【一】

    冒泡排序 数组排序 冒泡排序 冒泡排序 是一种算法 把一系列的数据按照一定的顺序进行排列显示 从小到大或从大到小 var arr 2 3 4 1 2 for var i 0 i lt arr length i 外层循环管趟数 for var
  • IDEA 无法显示 Services,Run Dashboard 的解决方法

    IDEA 无法显示 Run Dashboard 的解决方法 步骤 1 新版的 idea 把 dashboard 已经整合到 service 里面了 但是操作步骤依然是不变的 步骤 2 如果你连 services 都看不到 双击一下 shif
  • ssh框架基于java的爱心捐助平台源码+论文第三稿+查重报告+代码讲解视频(包安装,已降重)

    项目名称 ssh框架基于java的爱心捐助平台源码 效果视频 ssh框架基于java的爱心捐助平台源码 系统说明 功能模块设计 1 系统登录 主要分为管理员和普通用户 由数据库判断输入的账户信息是那种角色 在判断验证的账号和密码匹配后方可正
  • 孔明六曜星图生图总结

    图生图功能 1 图生图 就是文生图加张参考图 2 绘图 就是图生图加上手绘 3 局部重绘 就是只画图生图中的一部分功能 4 局部重绘 手涂蒙版 就是图生图的一部分功能加上绘图 5 上传蒙版 就是局部重绘加上PS的蒙版处理 规定边界 6 批量
  • mybatis工作原理

    1 基本原理 首先看一段JDBC代码 Class forName com mysql jdbc Driver String url jdbc mysql localhost 3306 localdb Connection con Drive