Mybatis初始化过程

前端之家收集整理的这篇文章主要介绍了Mybatis初始化过程前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

学习自拉钩教育java高薪训练营

Mybatis初始化过程

  1. // 1. 读取配置文件,读成字节输入流,注意:现在还没解析
  2. InputStream resourceAsStream = Resources.getResourceAsStream("sqlMapConfig.xml");
  3. // 2. 解析配置文件,封装Configuration对象 创建DefaultsqlSessionFactory对象
  4. sqlSessionFactory sqlSessionFactory = new sqlSessionFactoryBuilder().build(resourceAsStream);

image-20201116211910024

1.读取配置文件,读成字节输入流

  1. //Resources.java
  2. public static InputStream getResourceAsStream(String resource) throws IOException {
  3. return getResourceAsStream(null,resource);
  4. }
  5. public static InputStream getResourceAsStream(ClassLoader loader,String resource) throws IOException {
  6. InputStream in = classLoaderWrapper.getResourceAsStream(resource,loader);
  7. if (in == null) {
  8. throw new IOException("Could not find resource " + resource);
  9. }
  10. return in;
  11. }

通过classLoad调用getResourceAsStream()方法返回字节输入流,也就是得到了配置文件的字节输入流

2. 解析配置文件,封装Configuration对象 创建DefaultsqlSessionFactory对象

2.1 解析配置文件

  1. sqlSessionFactory sqlSessionFactory = new sqlSessionFactoryBuilder().build(resourceAsStream);
  1. //sqlSessionFactoryBuilder.java
  2. // 1.我们最初调用的build
  3. public sqlSessionFactory build(InputStream inputStream) {
  4. //调用了重载方法
  5. return build(inputStream,null,null);
  6. }
  7. // 2.调用的重载方法
  8. public sqlSessionFactory build(InputStream inputStream,String environment,Properties properties) {
  9. try {
  10. // 创建 XMLConfigBuilder,XMLConfigBuilder是专门解析mybatis的配置文件的类
  11. XMLConfigBuilder parser = new XMLConfigBuilder(inputStream,environment,properties);
  12. // 执行 XML 解析
  13. // 创建 DefaultsqlSessionFactory 对象
  14. return build(parser.parse());
  15. } catch (Exception e) {
  16. throw ExceptionFactory.wrapException("Error building sqlSession.",e);
  17. } finally {
  18. ErrorContext.instance().reset();
  19. try {
  20. inputStream.close();
  21. } catch (IOException e) {
  22. // Intentionally ignore. Prefer prevIoUs error.
  23. }
  24. }
  25. }

1.传入配置文件的字节输入流,调用其重载方法
2.创建 XMLConfigBuilder对象,它是用来解析mybatis的配置文件的类
3.执行parser.parse()

  1. parser.parse()
  2. //XMLConfigBuilder.java
  3. /**
  4. * 解析 XML 成 Configuration 对象。
  5. *
  6. * @return Configuration 对象
  7. */
  8. public Configuration parse() {
  9. // 若已解析,抛出 BuilderException 异常
  10. if (parsed) {
  11. throw new BuilderException("Each XMLConfigBuilder can only be used once.");
  12. }
  13. // 标记已解析
  14. parsed = true;
  15. ///parser是XPathParser解析器对象,读取节点内数据,<configuration>是MyBatis配置文件中的顶层标签
  16. // 解析 XML configuration 节点
  17. parseConfiguration(parser.evalNode("/configuration"));
  18. return configuration;
  19. }

parse():
判断是否解析过,抛出异常或打标记
4.调用parseConfiguration()方法,开始解析XML configuration 节点,并返回configuration

  1. //XMLConfigBuilder.java
  2. /**
  3. * 解析 XML
  4. * 具体 MyBatis 有哪些 XML 标签,参见 《XML 映射配置文件》http://www.mybatis.org/mybatis-3/zh/configuration.html
  5. * @param root 根节点
  6. */
  7. private void parseConfiguration(XNode root) {
  8. try {
  9. //issue #117 read properties first
  10. // 解析 <properties /> 标签
  11. propertiesElement(root.evalNode("properties"));
  12. // 解析 <settings /> 标签
  13. Properties settings = settingsAsProperties(root.evalNode("settings"));
  14. // 加载自定义的 VFS 实现类
  15. loadCustomVfs(settings);
  16. // 解析 <typeAliases /> 标签
  17. typeAliasesElement(root.evalNode("typeAliases"));
  18. // 解析 <plugins /> 标签
  19. pluginElement(root.evalNode("plugins"));
  20. // 解析 <objectFactory /> 标签
  21. objectFactoryElement(root.evalNode("objectFactory"));
  22. // 解析 <objectWrapperFactory /> 标签
  23. objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
  24. // 解析 <reflectorFactory /> 标签
  25. reflectorFactoryElement(root.evalNode("reflectorFactory"));
  26. // 赋值 <settings /> 到 Configuration 属性
  27. settingsElement(settings);
  28. // read it after objectFactory and objectWrapperFactory issue #631
  29. // 解析 <environments /> 标签
  30. environmentsElement(root.evalNode("environments"));
  31. // 解析 <databaseIdProvider /> 标签
  32. databaseIdProviderElement(root.evalNode("databaseIdProvider"));
  33. // 解析 <typeHandlers /> 标签
  34. typeHandlerElement(root.evalNode("typeHandlers"));
  35. // 解析 <mappers /> 标签
  36. mapperElement(root.evalNode("mappers"));
  37. } catch (Exception e) {
  38. throw new BuilderException("Error parsing sql Mapper Configuration. Cause: " + e,e);
  39. }
  40. }

这些都是mybatis配置文件中的标签,开始逐个解析,注意最后一行 mapperElement(root.evalNode("mappers"))
说明在解析config*.xml的同时也解析了mapper.xml(映射配置)文件
一个映射配置文件中的每一个select、delete、update、insert都会封装成一个MappedStatement

2.2.创建DefaultsqlSessionFactory对象

  1. return build(parser.parse());
  2. public sqlSessionFactory build(Configuration config) {
  3. return new DefaultsqlSessionFactory(config); //构建者设计模式
  4. }

5.执行build方法,接收到封装好的Configuration对象,并根据这个对象构建一个DefaultsqlSessionFactoryDefaultsqlSessionFactory就是一个sqlSessionFactory的实现类。

构建者设计模式:当构建一个复杂的对象时 可以把他拆成构建个很多的简单的对象,再由多个简单的对象构成复杂的对象

猜你在找的Mybatis相关文章