本篇来聊以下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的配置加载逻辑其实还是比较简单的,具体的各个配置项是怎么加载的就没有一一说明了,相信大家自己再去深入了解也问题不大。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。