Mybatis学习笔记:mybatis加载配置文件

数字漫游家
• 阅读 1000

每个mybatis应用都是以一个SqlSessionFactory实例为核心的,而SqlSessionFactory的生成其实很简单,只需要一下三行代码(基于XML配置文件实现):

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

首先需要有XML配置文件,然后转成InputStream,然后使用SqlSessionFactoryBuilder生成SqlSessionFactory对象。接下来看一下具体做了什么:

首先,调用的是一个build(InputStream inputStream)方法:

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

可以看到这个方法直接调用了build(InputStream inputStream, String environment, Properties properties)方法,后面两个参数传的是null。看下具体实现:

 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.
      }
    }
  }

忽略try...catch...,首先根据参数new了一个XMLConfigBuilder对象,可以看出这个XML解析器装载了一个实现了EntityResolver接口的XMLMapperEntityResolver对象。然后调用了下一个build(Configuration config)方法。看下parser.parse()

  public Configuration parse() {
    if (parsed) {
      throw new BuilderException("Each XMLConfigBuilder can only be used once.");
    }
    parsed = true;
    // 这里开始解析XML配置文件
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
  }

可以看出解析XML配置文件的代码是:parseConfiguration(parser.evalNode("/configuration"));

  private void parseConfiguration(XNode root) {
    try {
      //issue #117 read properties first
      // 解析properties节点配置
      propertiesElement(root.evalNode("properties"));
      // 解析settings节点配置
      Properties settings = settingsAsProperties(root.evalNode("settings"));
      // 根据settings配置,装载自定义Vfs
      loadCustomVfs(settings);
      // 根据settings配置,装载对应的日志实现
      loadCustomLogImpl(settings);
      // 解析别名配置
      typeAliasesElement(root.evalNode("typeAliases"));
      // 解析插件配置
      pluginElement(root.evalNode("plugins"));
      // 解析objectFactory配置
      objectFactoryElement(root.evalNode("objectFactory"));
      // 解析objectWrapperFactory配置
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      // 解析reflectorFactory配置
      reflectorFactoryElement(root.evalNode("reflectorFactory"));
      // 把settings中的属性设置到configuration对象中去
      settingsElement(settings);
      // 解析environment配置
      // read it after objectFactory and objectWrapperFactory issue #631
      environmentsElement(root.evalNode("environments"));
      // 解析databaseIdProvider配置,
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
      // 解析typeHandlers配置
      typeHandlerElement(root.evalNode("typeHandlers"));
      // 解析mappers标签配置
      mapperElement(root.evalNode("mappers"));
    } catch (Exception e) {
      throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
    }
  }

至此,mybatis配置文件解析完毕,调用build(Configuration config)方法生成SqlSessionFactory对象:

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

可以看出,返回的是DefaultSqlSessionFactory对象.

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Easter79 Easter79
3年前
SpringMVC与SpringBoot配置文件的加载区别
一、SpringMVC:配置文件在classpath下。在web.xml中配置加载。以下项目为示例其中引用关系为1. applicationContextdao.xml引用了mybatis文件夹中的配置文件2. applicationContextshiro.xml引用了shiro文件夹中的配置文件3. sprin
Stella981 Stella981
3年前
MyBatis基于Maven的入门
主要内容如下: 1.myBatis在maven中的配置 2.myBatis在工程中的config配置文件3.myBatis为Bean和表的映射文件4.myBatis基本的使用 myBatis在maven中的配置,在pom.xml中增加内容       1.增加依赖 ,mybatis的,还有mysql的驱动的
Easter79 Easter79
3年前
SSM_基于传统web项目
1.这是一个单模块的项目!有四个配置文件,mybaits,spring。springmvc,web.xml!2.web.xml配置文件,导入spring和springmvc的配置文件,spring配置文件中,获取sqlsession,以及关联mybatis的mpper(增删改查)文件3.mybatis的配置文件则可以不用写
Stella981 Stella981
3年前
MybatisPlus知识详解以及用十数个例子完成MybatisPlus的入门到进阶
1\.MybatisPlus1.1业务需求Mybatis缺点:1.Mybatis操作数据库的过程中,需要编辑大量的sql语句.无论该sql是否复杂或者简单.2.Mybatis操作时在xml配置文件中需要额外记忆单独的标签.需求:能否实现单表操作的CRUD的全自动的实现.能否实现
Stella981 Stella981
3年前
SpringBoot集成mybatis以及自动化测试代码实现
Mybatis和logback的应用配置1、在module的pom.xml文件中,加载springboot和swagger、lombok、fastjson、mysql、mybatis包2、在resources中添加配置:配置文件有两种,一种是properties,另一种是yaml,这里使用yamlyaml配
Stella981 Stella981
3年前
SSM_基于传统web项目
1.这是一个单模块的项目!有四个配置文件,mybaits,spring。springmvc,web.xml!2.web.xml配置文件,导入spring和springmvc的配置文件,spring配置文件中,获取sqlsession,以及关联mybatis的mpper(增删改查)文件3.mybatis的配置文件则可以不用写
Easter79 Easter79
3年前
SpringBoot集成mybatis以及自动化测试代码实现
Mybatis和logback的应用配置1、在module的pom.xml文件中,加载springboot和swagger、lombok、fastjson、mysql、mybatis包2、在resources中添加配置:配置文件有两种,一种是properties,另一种是yaml,这里使用yamlyaml配
Stella981 Stella981
3年前
Mybatis之加载mybatis
概述每个基于MyBatis的应用都是以一个SqlSessionFactory的实例为中心的。SqlSessionFactory都是通过SqlSessionFactoryBuilder来创建的,SqlSessionFactoryBuilder需要通过Configuration对象来构建SqlSessionFactory。一个
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
4个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(