MyBatis源码分析--02:SqlSession建立过程

我们再来看看MyBatis使用流程:


InputStream inputStream = Resources.getResourceAsStream("myBatis_config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();
 
User user = new User();
user.setUser_name("abd");
user.setUser_id(99);
user.setPassword("12345");
 
UserDao userDao = session.getMapper(UserDao.class);

上一篇我们搞清楚了MyBatis通过动态代理创建Dao接口的实现类,关注点在后面一句代码,动态代理底层是调用SqlSession的方法实现数据库操作。那么SqlSession是怎么创建的呢?

接下来我们来解决这个问题。

将目光放在这几句代码上:

InputStream inputStream = Resources.getResourceAsStream("myBatis_config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();

第一句代码非常明显:通过IO方式打开输入流读取myBatis_config.xml和Mapper.xml文件。

那么读取到虚拟机之后是怎么处理xml文件的呢,还是通过标签和字符串的形式展现的吗?一定不是的。一切皆对象!MyBatis将这些标签形式的信息封装成对象进行保存。这个将xml文件映射成对象的过程叫做OXM(Obiect XML Mapping)。

第二行代码就是执行这个过程:具体来说SqlSessionFactoryBuilder().build(inputStream);有俩个作用:

  1. 读取xml文件:将myBatis的xml文件解析映射成Configuration对象;将Mapper.xml文件映射成MappedStatement对象同时放入Configuration对象。
  2. 创建SqlSesisonFactory。

接下来我们来研究这个过程:

SqlSessionFactoryBuilder().build()方法探究

XML文件封装成对象的过程

整个过程有专门的技术实现:XML解析。主要有三种方式:DOM,SAX,XPath。MyBatis通过XPath进行实现。具体来说封装了XNode和XPathParser来进行实现

import org.apache.ibatis.parsing.XNode;
import org.apache.ibatis.parsing.XPathParser;

接下来我们将使用这俩个类来将一个XML文件映射成一个对象:

自定义映射一个XML文件

要解析的XML文件:

<users>
    <user>
        <name>sy</name>
        <password>123</password>
    </user>
    <user>
        <name>curry</name>
        <password>30</password>
    </user>
</users>

要映射的对象的实体类:

package com.example.spring_suns.XPathParser;

/**
 * @ClassName User
 * @Description 测试MyBatis XML解析的实体类
 * @Author 86153
 * @Date 2024/5/31 11:08
 * @Version 1.0
 **/
public class User {
    private String name;
    private String password;

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

具体映射过程:

/**
 * @ClassName XMLParserTest
 * @Description OXM过程
 * @Author 86153
 * @Date 2024/5/31 11:04
 * @Version 1.0
 **/
public class XMLParserTest {
    @Test
    void xpathParsertest() throws IOException {
        InputStream inputStream = Resources.getResourceAsStream("users.xml");
        XPathParser xPathParser = new XPathParser(inputStream);
        //  /users是目标xml文件的根标签,/*表示根标签下的所有子标签
        List<XNode> xNodes = xPathParser.evalNodes("/users/*");

        List<User> users = new ArrayList<>();
        for(XNode xNode : xNodes) {
            List<XNode> children = xNode.getChildren();
            User user = new User();
            user.setName(children.get(0).getStringBody());
            user.setPassword(children.get(1).getStringBody());
            users.add(user);
        }
        for (User user : users) {
            System.out.println(user);
        }

    }
}

MyBatis将MyBatis的XML配置文件映射成Configuration对象的过程

SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream)

SqlSessionFactory的build方法将XML配置文件解析封装成对象:

我们一步一步进行往下调试:

将Mapper.xml映射成MapperedStatement过程:

上面在读取标签MyBatis配置文件标签时读取了一个“mappers”标签,这是Mapper.xml文件的注册信息,由此读取Mapper.xml文件

创建SqlSessionFactory:

我们刚才关注的是build方法里的parse方法,现在来关注创建SqlSessionFactory的build方法

可以发现,最后通过Configuration对象创建了DefaultSqlSesisonFactory

SqlSession创建

接下来终于到我们最终的目的:创建SqlSession:

 SqlSession session = sqlSessionFactory.openSession();

注意上面创建SqlSession时有一个参数Executor,这个类是SqlSession执行数据库操作的实现类

由此和我们上一篇内容连起来了,MyBatis通过jdk动态代理创建Dao接口实现类,代理调用SqlSession的数据库操作,而SqlSession操作数据库的具体实现类就是Executor

总结:

本篇文章实际上就是围绕三行代码:

InputStream inputStream = Resources.getResourceAsStream("myBatis_config.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession session = sqlSessionFactory.openSession();

第一行代码:通过IO方式打开输入流读取myBatis_config.xml和Mapper.xml文件。

第二行代码:

        1.OXM。将MyBatis的xml配置文件映射成Configuration对象,将Mapper.xml文件映射成MapperedStatement对象同时封装在Configuration对象中。

        2.通过Configuration对象创建SqlSessionFactory。

第三行代码:创建SqlSession。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI编程新手快速体验SpringCloud Alibaba 集成AI功能

上周六写了一篇文章 震撼发布&#xff01;Spring AI 框架重磅上线&#xff0c;Java 集成 AI 轻松搞定&#xff01; 部分同学可能没有科学上网的条件&#xff0c;本地ollama 集成又比较笨重。趁着周六&#xff0c;写一篇基于SpringCloud Alibaba 集成AI的文章。 先简单介绍…

浅析R16移动性增强那些事儿(DAPS/CHO/MRO)

R16移动性增强相关技术总结 Dual Active Protocol Handover Dual Active Protocol Handover意为双激活协议栈切换&#xff0c;下文简称DAPS切换&#xff0c;DAPS切换的核心思想是切换过程中&#xff0c;在UE成功连接到目标基站前继续保持和源基站的连接和数据传输&#xff0c;…

MinIO 使用

MinIO自建对象存储 1、dock-compose 使用dock-compose拉取 minio:image: "minio/minio"container_name: minioports:- "9000:9000"- "9001:9001"volumes:- "./minio/data1:/data1"- "./minio/data2:/data2"restart: on-fai…

网络原理-TCP/IP --传输层(UDP)

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 今天你敲代码了吗 目录 端口号UDP协议 端口号 我们在学习套接字的时候,涉及到两个概念:IP地址和端口号 IP地址是用来确定主机,这是网络层提供的概念 而端口号就是用来确定主机上的应用程序,就是传输层的概念的…

leetcode102. 二叉树的层序遍历

一、题目描述&#xff1a; 给你二叉树的根节点 root &#xff0c;返回其节点值的 层序遍历 。 &#xff08;即逐层地&#xff0c;从左到右访问所有节点&#xff09;。 二、输入输出实例&#xff1a; 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null,15,7] 输出&am…

c++(七)

c&#xff08;七&#xff09; 内联函数内联函数的特点为什么要有内联函数内联函数是如何工作的呢 类型转换异常处理智能指针单例模式懒汉模式饿汉模式 VS中数据库的相关配置 内联函数 修饰类的成员函数&#xff0c;关键字&#xff1a;inline inline 返回值类型 函数名(参数列…

【C++】———list容器

前言 1.list容器简单来说其实就是之前的链表结构。 2.这里的list用的是双向带头结点的循环链表。 目录 前言 一 构造函数 1.1 list (); 1.2 list (size_type n, const value_type& val value_type() ); 1.3 list (InputIterator first, InputIterator last…

21.Redis之分布式锁

1.什么是分布式锁 在⼀个分布式的系统中, 也会涉及到多个节点访问同⼀个公共资源的情况. 此时就需要通过 锁 来做互斥控制, 避免出现类似于 "线程安全" 的问题. ⽽ java 的 synchronized 或者 C 的 std::mutex, 这样的锁都是只能在当前进程中⽣效, 在分布式的这种多…

计算机系统结构之互联网络

一、基本的单级互联网络 1、立方体单级网络 立方体单级网络的名称来源于下图所示的三维立方体结构。每个顶点&#xff08;网络的节点&#xff09;代表一个处理单元&#xff0c;共有8个处理单元&#xff0c;用zyx三位二进制编号。 Cubei函数表式相连的入端和出端的二进制编号只…

海外媒体通稿:9个极具创意的旅游业媒体推广案例分享-华媒舍

如今&#xff0c;旅游业正迅速发展&#xff0c;媒体推广成为吸引游客的关键。为了更好地展示旅游目的地&#xff0c;许多创意而富有创新的媒体推广策略应运而生。本文将介绍九个极富创意的旅游业媒体推广案例&#xff0c;为广大从业者带来灵感和借鉴。 1. 视频系列&#xff1a;…

Hadoop3:MapReduce的序列化和反序列化

一、概念 1、序列化 就是把内存中的对象&#xff0c;转换成字节序列 &#xff08;或其他数据传输协议&#xff09;以便于存储到磁 盘&#xff08;持久化&#xff09;和网络传输。 2、反序列化 就是将收到字节序列&#xff08;或其他数据传输协议&#xff09;或者是磁盘的持…

services层和controller层

services层 我的理解&#xff0c;services层是编写逻辑代码语句最多的一个层&#xff0c;非常重要&#xff0c;在实际的项目中&#xff0c;负责调用Dao层中的mybatis&#xff0c;在我的项目中它调用的是这两个文件 举例代码如下 package com.example.sfdeliverysystem.servic…

华东师范大学研究团队《Ecology Letters 》揭示植物如何改变其物候以响应全球变化

自工业革命以来&#xff0c;人类活动导致多种环境因子同时发生变化&#xff0c;包括气候变暖、降水模式改变、氮沉降增加和大气CO2升高。这些变化预计会影响植物生命周期事件的季节时序—植物物候&#xff08;Nature Reviews Earth & Environment | 傅伯杰院士团队发文阐述…

基于java的CRM客户关系管理系统(二)

目录 第二章 相关技术介绍 2.1 后台介绍 2.1.1 B/S平台模式 2.1.2 MVC 2.1.3 Spring 2.1.4 Hibernate 2.1.5 Struts 2.2 前端介绍 2.2.1 JSP网页技术 2.3 开发工具 2.4 本章小结 前面内容请移步 基于java的CRM客户关系管理系统&#xff08;二&#xff09; 资源…

机器学习第四十一周周报 JTFT

文章目录 week41 JTFT摘要Abstract1. 题目2. Abstract3. 网络架构3.1 JTFT3.2 具有可学习频率的稀疏FD表示3.3 用于提取跨渠道依赖关系的低阶注意力层 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程 5. 结论小结参考文献 week41 JTFT 摘要 本周阅读了题为A Joint Time-…

【TIPs】 Visual Stadio 2019 中本地误使用“git的重置 - 删除更改 -- hard”后,如何恢复?

环境&#xff1a; VS 2019Windows10本地版本管理&#xff08;非远程&#xff09; 前言&#xff1a; git 在Visual Stadio 2019中集成了git的版本管理&#xff0c;在本地用来做版本管理&#xff0c;本来比较好用。 不过有一次&#xff0c;由于拿最初始的版本的时候&#xf…

fyne apptab布局

fyne apptab布局 AppTabs 容器允许用户在不同的内容面板之间切换。标签要么只是文本&#xff0c;要么是文本和一个图标。建议不要混合一些有图标的标签和一些没有图标的标签。 package mainimport ("fyne.io/fyne/v2/app""fyne.io/fyne/v2/container"//&…

广告变现是什么

广告变现是指媒体或平台通过向用户展示广告主的广告&#xff0c;从而获得收入的过程。 广告变现就像是一个店主&#xff0c;他需要有一个吸引人的店面&#xff0c;提供优质的内容和服务&#xff0c;然后在店里摆放一些别人的商品或服务&#xff0c;每当有客人看了或买了这…

Proxmox 虚拟环境下1Panel Linux 服务器运维管理面板的安装

简介 以前安装服务器管理面板用的都是宝塔&#xff0c;今天发现 1Panel Linux 服务器运维管理面板也很好&#xff0c;面板清晰整洁&#xff0c;使用的技术比较先进&#xff0c;所以我决定亲自安装一下看看效果就竟如何&#xff1f; 1Panel Linux 服务器运维管理面板是一个开源…

C语言 | Leetcode C语言题解之第125题验证回文串

题目&#xff1a; 题解&#xff1a; bool isalumn(char c) {return (c > a && c < z) || (c > A && c < Z) || (c > 0 && c < 9); }bool isPalindrome(char* s) {for (int left 0, right strlen(s) - 1; left < right; left, …