三、Myabtis源码解析——初始化

Mybatis层级结构

一。解析加载进内存

1、读取xml配置文件转换成内存中的流数据
2、流数据在SqlSessionFactoryBuilder中解析封装成Configuration对象
Configuration对象主要包含 DataSource数据源 和 Map<String,MappedStatement> mappedStatementMap存储 SQL语句
3、SqlSessionFactoryBuilder.build(Configuration)创建SqlSessionFactory对象,并将Configuration传给SqlSessionFactory
4、SqlSessionFactory.openSession SqlSessionFactory将Configuration传给SqlSession

最核心流程:解析配置文件封装成Configuration对象并最终传给SqlSession

二、框架执行过程

使用sqlSession封装的API 和 getMapper动态代理方式

使用sqlSession封装的API方式,sqlSession类有两个 属性Executor和Configuration。
内部使用执行器simpleExecutor.simpleExecutor封装了JDBC操作,simpleExecutor主要流程
1、从DataSource数据源获取连接Connection
2、从 Map<String,MappedStatement> mappedStatementMap获取SQL,解析SQL语句
3、获取预处理对象:preparedStatement
4. 设置参数
5. 执行sql
6. 封装返回结果集

三、源码分析

去除不重要的代码
1、读取配置文件

 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml");

2、构建SqlSessionFactory

   SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(inputStream);

3、build()方法

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
     XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      return build(parser.parse());
  }

XMLConfigBuilder专门解析mybatis配置文件的类
parser.parse()返回核心配置对象Configuration

4、parse()方法
看下parse方法,注意返回的就是Configuration

public Configuration parse() {
    parseConfiguration(parser.evalNode("/configuration"));
    return configuration;
  }

5、parseConfiguration()方法
这里就是解析封装到Configuration 对象中

private void parseConfiguration(XNode root) {
      propertiesElement(root.evalNode("properties"));
      Properties settings = settingsAsProperties(root.evalNode("settings"));
      loadCustomVfs(settings);
      typeAliasesElement(root.evalNode("typeAliases"));
      pluginElement(root.evalNode("plugins"));
      objectFactoryElement(root.evalNode("objectFactory"));
      objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
      reflectorFactoryElement(root.evalNode("reflectorFactory"));
      settingsElement(settings);
      environmentsElement(root.evalNode("environments"));
      databaseIdProviderElement(root.evalNode("databaseIdProvider"));
      typeHandlerElement(root.evalNode("typeHandlers"));
      mapperElement(root.evalNode("mappers"));
  }

注意最后一个解析: mapperElement(root.evalNode(“mappers”)),就是解析Mapper.xml文件的SQL,每个SQL封装成一个MappedStatement,看下MappedStatement类:

public final class MappedStatement {

  private String resource;
  private Configuration configuration;
  private String id;
  private Integer fetchSize;
  private Integer timeout;
  private StatementType statementType;
  private ResultSetType resultSetType;
  private SqlSource sqlSource;
  private Cache cache;
  private ParameterMap parameterMap;
  private List<ResultMap> resultMaps;
  private boolean flushCacheRequired;
  private boolean useCache;
  private boolean resultOrdered;
  private SqlCommandType sqlCommandType;
  private KeyGenerator keyGenerator;
  private String[] keyProperties;
  private String[] keyColumns;
  private boolean hasNestedResultMaps;
  private String databaseId;
  private Log statementLog;
  private LanguageDriver lang;
  private String[] resultSets;
  }

核心配置类Configuration 类里有个Map:

public class Configuration {
protected final Map<String, MappedStatement> mappedStatements = new StrictMap<MappedStatement>("Mapped Statements collection");
}

所以Mapper.xml解析的SQL都在这个Map里,key是namespace+sqlID组成,value就是MappedStatement 。

到现在build()将配置文件解析完成,返回Configuration,回到第3步build()方法

public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {
     XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);
      return build(parser.parse());
  }

6、build(parser.parse());
parser.parse()解析完成返回的Configuration

 public SqlSessionFactory build(Configuration config) {
    return new DefaultSqlSessionFactory(config);
  }
  public DefaultSqlSessionFactory(Configuration configuration) {
    this.configuration = configuration;
  }

至此,构建完成,返回一个DefaultSqlSessionFactory

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值