MyBatis执行流程

启动流程

构建全局的 org.apache.ibatis.session.SqlSessionFactory 对象

该对象在全局应只有一个(一个数据源一个SqlSessionFactory)

SqlSessionFactory 的构建过程

<configuration>
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/> <!--将下划线转换为驼峰-->
    </settings>
    <environments default="development">
        <environment id="development">
            <!--事务类型-->
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="com.mysql.jdbc.Driver"/>
                <property name="url" value="jdbc:mysql://192.168.10.20:3306/jsh_erp2"/>
                <property name="username" value="root"/>
                <property name="password" value="Aa.123456"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/dreams/test/mapper/UserMapper.xml"/>
    </mappers>
</configuration>
InputStream input = Resources.getResourceAsStream("MybatisConfiguration.xml"); //1

SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();  //2
SqlSessionFactory factory = builder.build(input);  	//根据配置文件构建SqlSessionFactory对象
  • 解析Configuration.xml 文件, 生成org.apache.ibatis.session.Configuration对象
    • 加载 Configuration.xml , 根据xml文件创建解析器实例XMLConfigBuilder,并创建对应的 Configuration 对象
    • 调用 XMLConfigBuilder.parse()方法 解析xml文件
      • 调用 propertiesElement() 方法,解析 \<properties\>标签下的所有数据,并设置到Configuration 实例的variables【Properties】参数中
      • 解析 settings 标签下的配置信息, 并根据该配置信息加载对应的对象, 例如:VFS, Logger
      • 解析 typeAliases 标签, 注册别名 (注册在Configration中的 TypeAliasRegistry 中)
      • 解析 pluginElement 标签, 注册插件
      • 解析 environments 标签, 构建Environment 实例
        • 根据配置的 transacetionManager 构建事务管理对象: JDBCMANAGED
        • 根据配置的 datasource 信息,获取对应的 DataSourceFactory 创建DataSource实例, 并设置数据库连接参数(driver,user,pass,url)
          • PooledDataSource
          • UnpoolDataSource
        • 将调用的DataSource对象传入Environment对象中
        • 将Environment对象设置到Configuration
      • 解析 typeHandlers 配置的类型处理器
      • 解析 mappers
        • 通过 package 参数自动扫描注册
        • 通过 resource 或 url 解析 mapper.xml 注册
flowchart a(读取配置文件) --> b(构建SqlSessionFactoryBuilder)

SqlSessionFactoryBuilder.build(InputStream);

// 创建对象
// 1. Configuration  配置参数
// 	1.1 创建Configuration 时,会自动注册内置类型 如 JDBC, MANAGED, POOLED 等
// 2. TypeAliasRegistry 类型别名注册
// 3. TypeHandleRegistry 类型转换注册
XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
return build(parser.parse());

image

parse() 方法中调用 parseConfiguration()方法, 在 parseConfiguration 中,针对于配置文件中的每一项配置进行解析, 其中主要有 environments和mappers的解析

environments中配置了数据源

mappers中配置了 sql 映射文件

image

environmentsElement()

xml 中的 POOLED 时创建Configuration 对象时注册的一个别名: typeAliasRegistry.registerAlias("POOLED", PooledDataSourceFactory.class);

dataSourceElement(XNode) 方法会根据 <datasource> 中的type属性,创建一个DatasourceFactory对象

image

posted @ 2024-04-22 19:03  Dreamsrj  阅读(5)  评论(0)    收藏  举报