0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

SqlSessionFactory创建过程

科技绿洲 来源:Java技术指北 作者:Java技术指北 2023-09-25 14:55 次阅读

本篇文章我们首先解析 SqlSessionFactory 的创建过程。

1、实例代码

在实例代码中,我们在测试类中写了一个 init() 方法,里面包括了 SqlSessionFactory 的构建,分为两步。

第一步:读取配置文件 mybatis-config.xml 输入流

第二步:根据输入流构建 SqlSessionFactory;

public void init() {
    //定义mybatis全局配置文件
    String resource = "mybatis-config.xml";
    //加载 mybatis 全局配置文件
    InputStream inputStream = null;
    try {
        inputStream = Resources.getResourceAsStream(resource);
    } catch (IOException e) {
        e.printStackTrace();
    }
    //构建sqlSession的工厂
    sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

}

没什么难的,去掉 try-catch,也就两行代码。

InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");
SqlSessionFactory sessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

是的,那只是你以为的两行代码,其实......

话不多说,指北君就来给大家揭秘这冰山下面的东西。

2、代码剖析

根据上面的时序图,我们分析根据源码分析每个步骤。

①、获取配置文件输入流

InputStream inputStream = Resources.getResourceAsStream("mybatis.config.xml");

这里没什么好说的,就是获取配置文件的输入流。

②、build(in)

这里的 in 就是上一步获取的输入流 inputStream。

public SqlSessionFactory build(InputStream inputStream) {
    return build(inputStream, null, null);
  }

在进入到 build 方法:

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        inputStream.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }

③、XMLConfigBuilder(in)

这一段代码是为了解析我们的配置文件,配置文件是 XML形式 ,我在之前的博客介绍过解析 XML 的几种方式。

一种是基于树的结构来解析的称为DOM;另一种是基于事件流的形式称为SAX和(StAX)

两者各有优缺点,我这里不做详细说明,想了解的可以看我之前的文章。

而 Mybatis 使用的是 DOM 形式,并结合 XPath 来解析配置文件。

④、parse()

public Configuration parse() {
        if (this.parsed) {
            throw new BuilderException("Each XMLConfigBuilder can only be used once.");
        } else {
            this.parsed = true;
            this.parseConfiguration(this.parser.evalNode("/configuration"));
            return this.configuration;
        }
    }

从 /configuration 标签处开始解析。然后我们进入到 this.parseConfiguration() 方法中:

private void parseConfiguration(XNode root) {
        try {
            this.propertiesElement(root.evalNode("properties"));
            Properties settings = this.settingsAsProperties(root.evalNode("settings"));
            this.loadCustomVfs(settings);
            this.loadCustomLogImpl(settings);
            this.typeAliasesElement(root.evalNode("typeAliases"));
            this.pluginElement(root.evalNode("plugins"));
            this.objectFactoryElement(root.evalNode("objectFactory"));
            this.objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
            this.reflectorFactoryElement(root.evalNode("reflectorFactory"));
            this.settingsElement(settings);
            this.environmentsElement(root.evalNode("environments"));
            this.databaseIdProviderElement(root.evalNode("databaseIdProvider"));
            this.typeHandlerElement(root.evalNode("typeHandlers"));
            this.mapperElement(root.evalNode("mappers"));
        } catch (Exception var3) {
            throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + var3, var3);
        }
    }

看到这是不是很熟悉了,这不就是mybatis-config.xml 配置文件里面的各个标签名嘛,是的,这就是解析该文件,然后全部放在 configuration 对象中。需要注意的是,这里的 configuration 对象不仅包括 mybatis-config.xml 文件内容,也包括 xxxMapper.xml 文件内容。

图片

⑤、build(configuration)

public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
  }

就是去 new 了一个 DefaultSqlSessionFactory 对象,将 configuration 作为参数

⑥、DefaultSqlSessionFactory(configuration)

public DefaultSqlSessionFactory(Configuration configuration) {
        this.configuration = configuration;
    }

3、总结

自此,SqlSessionFactory 的创建过程就讲完了,总的来说就是一个封装了配置文件的工厂类。那么得到了 SqlSessionFactory 这个工厂对象,接下来干嘛?生产 SqlSession,然后通过 SqlSession 进行数据库的增删改查操作

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SQL
    SQL
    +关注

    关注

    1

    文章

    753

    浏览量

    44028
  • 代码
    +关注

    关注

    30

    文章

    4721

    浏览量

    68216
  • factory
    +关注

    关注

    0

    文章

    4

    浏览量

    1881
  • mybatis
    +关注

    关注

    0

    文章

    58

    浏览量

    6695
收藏 人收藏

    评论

    相关推荐

    labview怎么通过程序来创建波形图表控件

    就是通过程序来实现控件的创建
    发表于 06-05 10:07

    MySql存储过程创建以及Mybatis的调用遇到的问题概述

    MySql存储过程创建以及Mybatis的调用
    发表于 07-04 11:06

    Linux内核创建新进程的过程分析

    PCB包含了一个进程的重要运行信息,所以我们将围绕在创建一个新进程时,如何来建立一个新的PCB的这一个过程来进行分析,在Linux系统中,PCB主要是存储在一个叫做task_struct这一个结构体中,创建新进程仅能通过
    发表于 08-08 08:42

    TCP服务器创建过程

    (UCOSIII版本)的基础上进行修改,实现多客户端连接的一个方法。1、TCP服务器创建过程建立一个TCP服务器需要经过创建连接conn=netconn_new(NETCONN_TCP);//
    发表于 08-24 08:03

    ESP32--FreeRTOS任务的创建与删除过程是怎样的?

    ESP32--FreeRTOS任务的创建与删除过程是怎样的?
    发表于 01-14 06:02

    FreeRTOS的任务创建过程

    FreeRTOS笔记(四):任务创建/删除,挂起/解挂详解在第二篇笔记中介绍了任务创建的API,并且简单使用了相关API,本文将详细介绍任务创建过程。一、任务
    发表于 02-08 06:10

    浅谈Keil-MDK创建及其编译过程

    浅谈Keil-MDK创建项目&编译过程---Code-data,RO-data,RW-data,ZI-data一、编译过程二、MDK 编译工具(1)创建一个新的工程(2)添加 star
    发表于 02-24 06:03

    阿尔卡特软交换产品VOIP数据创建过程

    阿尔卡特软交换产品VOIP数据创建过程成都通信建设工程局 王玺 薛恒飞  邮政编码 611130[摘要] 本文通过对阿尔卡特移动软交换设备在VOIP数据如何创建过程的介绍,简
    发表于 05-16 01:39 6次下载

    altium-designer使用PCB向导来创建PCB详细过程

    altium-designer使用PCB向导来创建PCB详细过程,感兴趣的可以看看。
    发表于 07-22 16:08 0次下载

    使用PCI Express模块​​创建Zynq UltraScale+的过程介绍

    本视频介绍了使用处理子系统中的PCI Express模块​​创建Zynq UltraScale +解决方案的过程
    的头像 发表于 11-28 06:35 3300次阅读

    整理剖析,只为教你创建MySQL存储过程

    简单地说,存储过程就是一条或者多条SQL语句的集合,可视为批文件,但是其作用不仅限于批处理。本篇主要介绍如何创建存储过程和存储函数以及变量的使用,如何调用、查看、修改、删除存储过程和存
    的头像 发表于 07-02 17:11 2049次阅读

    易灵思JTAG写入Flash工程的创建过程和烧写操作

    易灵思在通过JTAG写入Flash时,需要手动创建一个打通JTAG到Flash的bridge,这里我们来介绍下工程创建过程和烧写操作。
    的头像 发表于 03-09 16:04 5192次阅读
    易灵思JTAG写入Flash工程的<b class='flag-5'>创建</b><b class='flag-5'>过程</b>和烧写操作

    如何创建 Docker 镜像的能力

    本文将带大家继续深入了解 Dockerfile 镜像创建过程中最重要的配置文件内容,更加透彻地了解整个容器镜像的创建过程
    的头像 发表于 09-16 09:39 1081次阅读

    手写一个MyBatis框架

    SqlSessionFactory 是获取会话的工厂,每次使用MyBatis 操作数据库时, 都会开启一个新的会话。在会话工厂的实现中,SqlSessionFactory 负责获取数据源环境配置信息、构建事务工厂和创建操作SQL
    的头像 发表于 04-20 11:29 564次阅读

    创建jar文件的过程

    在这篇文章中,我们将介绍一下以编程方式创建jar文件的过程。在编写软件时,最终我们需要将其部署到生产状态。在某些情况下,使用带有独立文件的classpath是可以的。通常情况下,处理一个文件会更方便
    的头像 发表于 10-08 15:36 787次阅读