[Mybatis源码分析系列] 01 解析mybatis-config.xml配制文件并返回SqlSessionFactory的类SqlSessionFactoryBuilder

前言

公司一直在使用Jpa + Hibernate那一套东西,但是这套技术封装的太过后重。不利于开发人员掌握,而在优化sql方面也是蛋疼的很。所以在后台不是特别重要的项目中引入了MyBatis。当然光会使用,是满足不了本吊丝的胃口,所以走上了分析MyBatis源码的道路,并有了这一系列的文档,供志同道合的朋友参考和指证。

解析配制文件并返回SqlSessionFacotory的类SqlSessionFactoryBuilder

我们在使用MyBatis的时候一般都会提供一个mybatis-config.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>
    <properties>
        <property name="username" value="root"/>
        <property name="password" value="jianglei"/>
    </properties>
    
    <settings>
        <setting name="mapUnderscoreToCamelCase" value="true"/>
    </settings>


    <typeAliases>
        <typeAlias alias="Blog" type="com.jianglei.example.Blog"/>
    </typeAliases>
    <environments default="prod">
        <environment id="development">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username1:root}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
        <environment id="prod">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="jdbc:mysql://localhost:3306/prod"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>
    <mappers>
        <mapper resource="com/jianglei/example/BlogMapper.xml"/>
    </mappers>
</configuration>

而在进行数据查询的时候一般是如下的代码:

public class InterfaceWithXMLTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void testInit() throws IOException {
        String resource = "mybatis-config.xml";
        InputStream is = Resources.getResourceAsStream(resource);
        Properties prop = new Properties();
        prop.load(Resources.getResourceAsStream("mybatis-config.properties"));
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(is, prop);
    }

    @Test
    public void save() {
        SqlSession session =
                sqlSessionFactory.openSession();
        try {
           ...
        }finally {
            session.close();
        }
    }
}

SqlSessionFactoryBuilder解析了mybatis-config.xml文件,并返回了SqlSessionFactory

SqlSessionFactoryBuilder关键代码

查看该类的源码,就是一大堆build方法的重载,而最核心的方法如下:

public SqlSessionFactory build(Reader reader, String environment, Properties properties) {
    try {
      XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
      return build(parser.parse());
    } catch (Exception e) {
      throw ExceptionFactory.wrapException("Error building SqlSession.", e);
    } finally {
      ErrorContext.instance().reset();
      try {
        reader.close();
      } catch (IOException e) {
        // Intentionally ignore. Prefer previous error.
      }
    }
  }

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

先由XMLConfigBuilder类解析配制文件转换为相应的XMLConfigBuilder实例
调用parser.parse()方法生成Configuration
调用new DefaultSqlSessionFactory(config)返回SqlSessionFactory实例

猜你喜欢

转载自blog.csdn.net/weixin_36210698/article/details/83057844
今日推荐