详解Mybatis核心类SqlSessionFactory的构建

目录
  • 1、实例代码
  • 2、代码剖析
  • 3、总结

请大家搬好小板凳,指北君将会用最通俗易懂,图文并茂的方式,给大家深入剖析 Mybatis 的实现原理。

本篇文章我们首先解析 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 进行数据库的增删改查操作

没错,接下来,指北君将给大家介绍 SqlSession 的交互过程,这也是 Mybatis 里面最重要的一个对象。

到此这篇关于详解Mybatis核心类SqlSessionFactory的构建的文章就介绍到这了,更多相关Mybatis SqlSessionFactory内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 关于MyBatis中SqlSessionFactory和SqlSession简解

    目录 [1]SqlSessionFactoryBuilder [2]SqlSessionFactory SqlSessionFactory 接口源码 SqlSessionFactory 有六个方法创建 SqlSession 实例 [3]非线程安全的SqlSession 永远不要在一个被管理域中引用SqlSession 语句执行方法 立即批量更新方法 事务控制方法 本地缓存 使用映射器 映射器注解 映射注解示例 mybatis官网中文文档:https://mybatis.org/mybatis-3

  • MyBatis源码解析——获取SqlSessionFactory方式

    目录 MyBatis源码解析_获取SqlSessionFactory 首先从Resources.getResourceAsReader(path) 进入到SqlSessionFactoryBuilder.build(Reader)方法中 进入到mapperElement(XNode)方法后 如果子节点名字不是package 经过一系列的解析,终于完成了 用MyBatis的配置文件获取SqlSessionFactory MyBatis源码解析_获取SqlSessionFactory 我们都知道,在

  • 解析Mybatis SqlSessionFactory初始化原理

    目录 引言 SqlSessionFactory 不使用 XML 构建 SqlSessionFactory SqlSessionFactoryBuilder 拓展 引言 现在内卷越来越严重,关于常用的ORM框架Mybatis,小编准备了三篇文章,分别将介绍SqlSessionFactory初始化原理.SqlSession执行流程,Mybatis代理模式运行方式与最终总结,这是第一篇,感兴趣的朋友可以持续关注. SqlSessionFactory 每个基于 MyBatis 的应用都是以一个 SqlS

  • 使用Mybatis-Plus时的SqlSessionFactory问题及处理

    目录 使用Mybatis-Plus时的SqlSessionFactory问题 贴一下这两个类的源码,看一眼就明白了 还有MybatisSqlSessionFactoryBean的 springboot+mybatis-plus报错Property'sqlSessionFactory'or'sqlSessionTemplate'are required 使用Mybatis-Plus时的SqlSessionFactory问题 前些日子工作中出现一个问题,项目中使用了MybatisPlus,然后出现了

  • 详解Mybatis核心类SqlSessionFactory的构建

    目录 1.实例代码 2.代码剖析 3.总结 请大家搬好小板凳,指北君将会用最通俗易懂,图文并茂的方式,给大家深入剖析 Mybatis 的实现原理. 本篇文章我们首先解析 SqlSessionFactory 的创建过程. 1.实例代码 在实例代码中,我们在测试类中写了一个 init() 方法,里面包括了 SqlSessionFactory 的构建,分为两步. 第一步:读取配置文件 mybatis-config.xml 输入流 第二步:根据输入流构建 SqlSessionFactory: publi

  • 详解Mybatis核心配置文件

    Mybatis核心配置文件 记录在mybatis核心配置文件中,常用的配置选项: 下边是之前的配置选项: <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"

  • 详解MyBatis XML配置解析

    MyBatis核心配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <environm

  • 详解MyBatis的Dao层实现和配置文件深入

    目录 Mybatis的Dao层实现 传统开发方式 代理开发方式 MyBatis映射文件深入 动态sql语句 SQL片段抽取 MyBatis核心配置文件深入 typeHandlers标签 plugins标签 MyBatis核心配置文件常用标签 Mybatis的Dao层实现 传统开发方式 编写UserDao接口 public interface UserDao { List<User> findAll() throws IOException; } 编写UserDaoImpl实现 public c

  • 详解MyBatis逆向工程

    1.什么是mybatis逆向工程 在使用mybatis时需要程序员自己编写sql语句,针对单表的sql语句量是很大的,mybatis官方提供了一种根据数据库表生成mybatis执行代码的工具,这个工具就是一个逆向工程. 逆向工程:针对数据库单表-->生成代码(mapper.xml.mapper.java.pojo..) mybatis-generator-core-1.3.2.jar-逆向工程运行所需要的jar核心 包 2.配置逆向工程的配置文件 配置文件generatorConfig.xml

  • 详解MyBatis配置typeAliases的方法

    0x00:前言参考 之前的<MyBatis 中 SqlMapConfig 配置文件详解>记了一下 MyBatis 中的核心配置文件各个标签的作用和使用场景,这篇文章细说一下配置文件中 typeAliases 标签的详细使用. 0x01:标签介绍 在 MyBatis 的 sql 映射配置文件中,需要使用 paramterType.resultType 来设置 sql 语句的输入输出参数,一般参数都是基本的数据类型或封装类型,但都需要声明该类型的全路径,java.lang.String,或者 cn

  • 详解Mybatis是如何解析配置文件的

    缘起 经过前面三章的入门,我们大概了解了Mybatis的主线逻辑是什么样子的,在本章中,我们将正式进入Mybatis的源码海洋. Mybatis是如何解析xml的 构建Configuration 我们调用new SqlSessionFactoryBuilder().build()方法的最终目的就是构建 Configuration对象,那么Configuration何许人也?Configuration对象是一个配置管家, Configuration对象之中维护着所有的配置信息. Configura

  • 详解MyBatis工作原理

    一.Mybatis工作原理 Mybatis分层框架图 Mybatis工作原理图 源码分析:一般都是从helloworld入手 1.根据xml配置文件(全局配置文件mybatis-config.xml)创建一个SqlsessionFactory对象,mybatis-config.xml有数据源一些环境信息 2.sql映射文件EmployeeMapper.xml配置了每一个sql,以及sql的封装规则等. 3.将sql映射文件注册在全局配置文件中 4.写代码: 根据全局配置文件得到sqlsessio

  • 详解MyBatis resultType与resultMap中的几种返回类型

    目录 一.返回集合 1.返回JavaBean集合 2.返回 Map 集合 二.返回 Map 1.一条记录 2.多条记录,需要指定 Map 的 Key 和 Value 的类型 三.返回 resultMap 自定义结果集封装 1.自定义 JavaBean 的封装 2.关联查询的封装,一对一,JavaBean 属性包含 JavaBean 3.关联查询的封装,一对多,JavaBean 属性包含 JavaBean 的集合 4.鉴别器discriminator 一.返回集合 1.返回JavaBean集合 p

  • 详解Mybatis拦截器安全加解密MySQL数据实战

    需求背景 公司为了通过一些金融安全指标(政策问题)和防止数据泄漏,需要对用户敏感数据进行加密,所以在公司项目中所有存储了用户信息的数据库都需要进行数据加密改造.包括Mysql.redis.mongodb.es.HBase等. 因为在项目中是使用springboot+mybatis方式连接数据库进行增删改查,并且项目是中途改造数据.所以为了不影响正常业务,打算这次改动尽量不侵入到业务代码,加上mybatis开放的各种拦截器接口,所以就以此进行改造数据. 本篇文章讲述如何在现有项目中尽量不侵入业务方

随机推荐