乐趣区

关于mybatis:mybatis之配置加载

本篇来聊以下 mybatis 的配置加载内容,来看下 mybatis 是如何对配置进行加载的。

知识点

  • mybatis 原生怎么加载
  • mybatis-spring 如何加载

前言

咱们平时在应用 mybatis 的时候,很多时候都会去定义一个 xml 配置文件,大略如下

<?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>

    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
        <setting name="logImpl" value="MYLOG"/>
    </settings>
    <typeAliases>
        <typeAlias alias="MYLOG" type="com.example.mybatisanalyze.logger.MyloggerImpl"/>
    </typeAliases>
    <typeHandlers>
        <package name="com.example.mybatisanalyze.typehandler"/>
    </typeHandlers>
    <plugins>
        <plugin interceptor="com.example.mybatisanalyze.plugin.MyPlugin">
            <property name="output" value="hello"/>
        </plugin>
    </plugins>
</configuration>

咱们晓得该配置文件会在 mybatis 整个执行过程中失效,那么它是如何被加载的呢?

mybatis 原生怎么加载

mybatis 自身提供了配置加载的入口,在 org.apache.ibatis.session.SqlSessionFactoryBuilder 中去创立 SqlSessionFactory 的时候会先去做配置解析,所以咱们如果间接用 mybatis,个别是先用 SqlSessionFactoryBuilder 的 build 函数来传入对应配的配置文件流,大抵应用如下

Reader reader = Resources.getResourceAsReader("org/apache/ibatis/submitted/global_variables_defaults/mybatis-config.xml");
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(reader, props);

或者

String resource = "org/apache/ibatis/submitted/association_nested/mybatis-config.xml";
    InputStream inputStream = Resources.getResourceAsStream(resource);
    SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);

再来看下 build 里做了什么

能够看到在 build 里次要是应用 org.apache.ibatis.builder.xml.XMLConfigBuilder 对配置进行加载。看下 parser.parse() 逻辑

能够看到这里取解析了 configuration 节点,再进去看下子节点的解析逻辑

能够看到这里对 Configuration 下所有的子节点进行了解析,具体外面的细节就不一一介绍了,对应的官网配置在这块

咱们平时在应用 mybatis 的时候都会定义 sql 语句的文件(mapper 文件),来看下 mapper 是怎么做解析的,也就是下面 configuration 解析的最初一行

能够看到这里能够指定 packge、resource、url、class。package 和 class 会基于注解形式去解析,而 resource 和 url 会基于 xml 配置形式去解析。注解解析的类是org.apache.ibatis.builder.annotation.MapperAnnotationBuilder,基于 xml 配置文件解析的类是org.apache.ibatis.builder.xml.XMLMapperBuilder。mapper 的解析这块对应官网的以下内容

具体每个节点配置项怎么解析就不介绍了,不然内容太多太多,大家本人去跟着这个思路跟进去看代码就晓得了。

mybatis-spring 如何加载

下面是基于 mybatis 原生应用的形式来介绍了如何加载配置,实际上咱们平时用得比拟多的还是集成 spring 来做的,并不需要本人去写代码指定配置文件。你会发现我的项目中会引入这个包

咱们就基于这个包的源码来阐明下 mybatis-spring 是如何加载配置文件的。咱们基于 spring 去应用的时候,都会配置如下几个配置

    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <property name="dataSource" ref="dataSource"/>
        <property name="configLocation" value="classpath:mybatis-config.xml"/>
        <property name="mapperLocations" value="classpath:com/fingard/rh/rhf/spms/dao/**/*.xml"/>
    </bean>

其实这里就看进去了,是通过 SqlSessionFactoryBean 来加载配置文件的。看下 org.mybatis.spring.SqlSessionFactoryBean#buildSqlSessionFactory 办法

能够看到如果咱们配置了 configLocation,就会进行配置加载,当然咱们也能够不须要用 xml 配置,间接利用 spring 个性来进行配置也能够。具体的 xml 配置加载逻辑和 mybatis 原生的一样

其实咱们也能够间接获取到 SqlSessionFactoryBean 来再做一些自定义的操作。

总结

mybatis 的配置加载逻辑其实还是比较简单的,具体的各个配置项是怎么加载的就没有一一阐明了,置信大家本人再去深刻理解也问题不大。

退出移动版