`
kobe学java
  • 浏览: 262421 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

Mybatis技术(四) 从配置读取到打开连接的源码分析

 
阅读更多

1. 准备工作

  编写测试代码(具体请参考《Mybatis入门示例》),设置断点,Debug模式运行,具体代码如下: 

Java代码   收藏代码
  1. String resource = "mybatis.cfg.xml";  
  2.   
  3. Reader reader = Resources.getResourceAsReader(resource);  
  4.   
  5. SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);  
  6.   
  7. SqlSession session = ssf.openSession();  

 

2.源码分析

我们此次就对上面的代码进行跟踪和分析,let's go。

首先我们按照顺序先看看第一行和第二行代码,看看它主要完成什么事情:

Java代码   收藏代码
  1. String resource = "mybatis.cfg.xml";  
  2.   
  3. Reader reader = Resources.getResourceAsReader(resource);  

 

读取Mybaits的主配置配置文件,并返回该文件的输入流,我们知道Mybatis所有的SQL语句都写在XML配置文件里面,所以第一步就需要读取这些XML配置文件,这个不难理解,关键是读取文件后怎么存放。

 

我们接着看第三行代码(如下),该代码主要是读取配置文件流并将这些配置信息存放到Configuration类中。

Java代码   收藏代码
  1. SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);  

 

 

SqlSessionFactoryBuilderbuild的方法如下:

Java代码   收藏代码
  1. public SqlSessionFactory build(Reader reader) {  
  2.     return build(reader, nullnull);  
  3.   }  

 

其实是调用该类的另一个build方法来执行的,具体代码如下:

Java代码   收藏代码
  1. public SqlSessionFactory build(Reader reader, String environment, Properties properties) {  
  2.   
  3.     try {  
  4.   
  5.       XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);  
  6.   
  7.       return build(parser.parse());  
  8.   
  9.     } catch (Exception e) {  
  10.   
  11.       throw ExceptionFactory.wrapException("Error building SqlSession.", e);  
  12.   
  13.     } finally {  
  14.   
  15.       ErrorContext.instance().reset();  
  16.   
  17.       try {  
  18.   
  19.         reader.close();  
  20.   
  21.       } catch (IOException e) {  
  22.   
  23.         // Intentionally ignore. Prefer previous error.  
  24.   
  25.       }  
  26.   
  27.     }  
  28.   
  29.   }  

 

我们重点看一下里面两行:

Java代码   收藏代码
  1. //创建一个配置文件流的解析对象XMLConfigBuilder,其实这里是将环境和配置文件流赋予解析类  
  2. XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);  
  3.   
  4. // 解析类对配置文件进行解析并将解析的内容存放到Configuration对象中,并返回SqlSessionFactory  
  5. return build(parser.parse());  

 

这里的XMLConfigBuilder初始化其实调用的代码如下: 

Java代码   收藏代码
  1. private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {  
  2.     super(new Configuration());  
  3.   
  4.     ErrorContext.instance().resource("SQL Mapper Configuration");  
  5.   
  6.     this.configuration.setVariables(props);  
  7.   
  8.     this.parsed = false;  
  9.   
  10.     this.environment = environment;  
  11.   
  12.     this.parser = parser;   
  13.   
  14.   }  

 

 

 XMLConfigBuilderparse方法执行代码如下:  

Java代码   收藏代码
  1. public Configuration parse() {  
  2.   
  3.     if (parsed) {  
  4.   
  5.       throw new BuilderException("Each MapperConfigParser can only be used once.");  
  6.   
  7.     }  
  8.   
  9.     parsed = true;  
  10.   
  11.     parseConfiguration(parser.evalNode("/configuration"));  
  12.   
  13.     return configuration;  
  14.   
  15.   }  

 

解析的内容主要是在parseConfiguration方法中,它主要完成的工作是读取配置文件的各个节点,然后将这些数据映射到内存配置对象Configuration,我们看一下parseConfiguration方法内容: 

Java代码   收藏代码
  1. private void parseConfiguration(XNode root) {  
  2.   
  3.     try {  
  4.   
  5.       typeAliasesElement(root.evalNode("typeAliases"));  
  6.   
  7.       pluginElement(root.evalNode("plugins"));  
  8.   
  9.       objectFactoryElement(root.evalNode("objectFactory"));  
  10.   
  11.       objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));  
  12.   
  13.       propertiesElement(root.evalNode("properties"));  
  14.   
  15.       settingsElement(root.evalNode("settings"));  
  16.   
  17.       environmentsElement(root.evalNode("environments"));  
  18.   
  19.       typeHandlerElement(root.evalNode("typeHandlers"));  
  20.   
  21.       mapperElement(root.evalNode("mappers"));  
  22.   
  23.     } catch (Exception e) {  
  24.   
  25.       throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);  
  26.   
  27.     }  
  28.   
  29.   }  

 

 

 

最后的build方法其实是传入配置对象进去,创建DefaultSqlSessionFactory实例出来. DefaultSqlSessionFactorySqlSessionFactory的默认实现. 
Java代码   收藏代码
  1. public SqlSessionFactory build(Configuration config) {  
  2.     return new DefaultSqlSessionFactory(config);  
  3. }  

   

 最后我们看一下第四行代码: 

Java代码   收藏代码
  1. SqlSession session = ssf.openSession();  

 

通过调用DefaultSqlSessionFactoryopenSession方法返回一个SqlSession实例,我们看一下具体是怎么得到一个SqlSession实例的。首先调用openSessionFromDataSource方法。  

Java代码   收藏代码
  1. public SqlSession openSession() {  
  2.     return openSessionFromDataSource(configuration.getDefaultExecutorType(), nullfalse);  
  3. }  

 

 下面我们看一下openSessionFromDataSource方法的逻辑:  

Java代码   收藏代码
  1. private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {  
  2.     Connection connection = null;  
  3.   
  4. try {  
  5.   
  6. //获取配置信息里面的环境信息,这些环境信息都是包括使用哪种数据库,连接数据库的信息,事务  
  7. final Environment environment = configuration.getEnvironment();  
  8.   
  9. //根据环境信息关于数据库的配置获取数据源  
  10. final DataSource dataSource = getDataSourceFromEnvironment(environment);  
  11.   
  12. //根据环境信息关于事务的配置获取事务工厂  
  13. TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);  
  14.   
  15.       connection = dataSource.getConnection();  
  16.   
  17.       if (level != null) {  
  18.   
  19.         //设置连接的事务隔离级别  
  20.       connection.setTransactionIsolation(level.getLevel());  
  21.       }  
  22.   
  23.       //对connection进行包装,使连接具备日志功能,这里用的是代理。  
  24.       connection = wrapConnection(connection);  
  25.   
  26.       //从事务工厂获取一个事务实例  
  27.       Transaction tx = transactionFactory.newTransaction(connection, autoCommit);  
  28.   
  29.       //从配置信息中获取一个执行器实例  
  30.       Executor executor = configuration.newExecutor(tx, execType);  
  31.   
  32.       //返回SqlSession的一个默认实例  
  33.       return new DefaultSqlSession(configuration, executor, autoCommit);  
  34.   
  35.     } catch (Exception e) {  
  36.   
  37.       closeConnection(connection);  
  38.   
  39.       throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);  
  40.   
  41.     } finally {  
  42.   
  43.       ErrorContext.instance().reset();  
  44.   
  45.     }  
  46.   
  47.   }  

 

传入参数说明:

1ExecutorType:执行类型,ExecutorType主要有三种类型:SIMPLE, REUSE, BATCH,默认是SIMPLE,都在枚举类ExecutorType里面。

2TransactionIsolationLevel:事务隔离级别,都在枚举类TransactionIsolationLevel中定义

3autoCommit:是否自动提交,主要是事务提交的设置。

 

 DefaultSqlSessionSqlSession的实现类,该类主要提供操作数据库的方法给开发人员使用。

 

这里总结一下上面的过程,总共由三个步骤:

步骤一:读取Ibatis的主配置文件,并将文件读成文件流形式(InputStream)

 

步骤二:从主配置文件流中读取文件的各个节点信息并存放到Configuration对象中。读取mappers节点的引用文件,并将这些文件的各个节点信息存放到Configuration对象。

 

步骤三:根据Configuration对象的信息获取数据库连接,并设置连接的事务隔离级别等信息,将经过包装数据库连接对象SqlSession接口返回,DefaultSqlSessionSqlSession的实现类,所以这里返回的是DefaultSqlSessionSqlSession接口里面就是对外提供的各种数据库操作。

 

分享到:
评论

相关推荐

    MyBatis源码分析.pdf

    MyBatis源码分析 MyBatis是一款流行的Java持久层框架,提供了强大的数据库访问能力,本文将对MyBatis的源码进行深入分析,从而帮助读者更好地理解MyBatis的工作机理。 1. MyBatis入门 MyBatis是一款基于Java的...

    mybatis源码分析视频

    本资源“mybatis源码分析视频”是针对MyBatis框架进行深入剖析的教程,通过视频和文档的形式帮助学习者理解其内部工作机制。 1. **MyBatis简介** MyBatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集。...

    Mybatis源码分析.pdf

    总结起来,MyBatis源码分析涵盖了从配置加载到数据库操作的全过程,涉及到了配置解析、SQL执行、结果映射等多个关键环节,以及Executor、StatementHandler等核心组件。通过深入学习MyBatis的源码,开发者不仅可以...

    mybatis源码+配置步骤+包文件

    2. 配置mybatis-config.xml:这是MyBatis的全局配置文件,包含数据库连接信息、类型别名、映射文件路径等。 3. 创建SqlSessionFactory:基于配置文件创建SqlSessionFactory实例,通常在Spring框架中,可以使用...

    Mybatis源码分析.docx

    Mybatis源码分析 Mybatis是一款流行的持久层框架,它提供了一个强大的机制来简化Java应用程序中的数据库交互。Mybatis的核心概念包括Configuration、SqlSessionFactory、Session、Executor、MappedStatement、...

    mybatis源码分析

    SqlSessionFactory的创建通常通过SqlSessionFactoryBuilder完成,它可以从XML配置文件或注解配置中读取信息。 3. SqlSession:SqlSession是执行数据库操作的对象,提供了增删查改的方法。每次数据库交互都应在一个...

    Java架构师之源码分析专题SpringBoot2.x、Spring5、SpringMVC、Mybatis源码分析

    本专题课程针对SpringBoot 2.x、Spring 5、SpringMVC和Mybatis这四个关键框架进行源码解析,旨在帮助开发者从底层原理出发,提升技术水平,更好地应用和优化这些工具。 首先,我们来探讨SpringBoot 2.x。SpringBoot...

    Mybatis从入门到精通

    MyBatis是一款流行的持久层框架,支持SQL查询、存储过程以及高级映射,...通过本系列教程,你可以从基础的环境搭建,逐步学习到MyBatis的核心概念、高级特性以及与其他流行框架的集成方法,从而达到精通MyBatis的目标。

    SpringBoot+tk.Mybatis整合+yml配置+logback配置

    在“SpringBoot+tk.Mybatis整合+yml配置+logback配置”这个主题中,我们将探讨以下几个关键知识点: 1. **SpringBoot整合tk.Mybatis**: tk.Mybatis 是 Mybatis 的一个扩展,提供了很多实用功能,如:动态 SQL、...

    SpringMVC+MyBatis开发从入门到实践源码

    在"SpringMVC+MyBatis开发从入门到实践源码"这个项目中,你将会找到各个章节的代码示例,这些示例涵盖了从基本的配置到复杂的业务场景。例如,如何设置SpringMVC的DispatcherServlet,如何编写Controller,如何配置...

    MyBatis详解_与配置MyBatis

    MyBatis 详解与配置 MyBatis MyBatis 是一个可以自定义 SQL、存储过程和...* mysql.properties:数据库连接配置文件 MyBatis 的优点和配置步骤使其成为一个非常流行的持久层框架,广泛应用于 Java 企业级应用程序中。

    mybatis源码分析思维导图.rar

    MyBatis是一款流行的Java持久层框架,它简化了数据库操作,允许开发者将SQL语句直接映射到Java方法,从而避免了传统的数据访问层的复杂性。MyBatis的源码分析对于理解其工作原理、优化数据库交互以及进行二次开发至...

    Mybatis-generator 生成Mybatis配置文件

    Mybatis Generator 通过读取配置文件(generatorConfig.xml),解析其中的参数,连接到指定的数据库,然后根据数据库中的表信息自动生成Java源代码。这些源代码包括DAO层的接口和实现类、实体类以及Mapper XML映射...

    mybatis-3-mybatis-3.5.8.zip源码

    3. **Configuration**: MyBatis的核心配置,包含了全局配置信息(比如数据库连接信息、环境配置、映射文件等)和映射器配置信息。 4. **MapperRegistry**: 负责管理Mapper接口和对应的Mapper配置,使得用户可以通过...

    mybatis多对多配置

    4. **Mapper XML文件**: 配置多对多关系时,需要在Mapper的XML文件中定义SQL查询,包括左连接(LEFT JOIN)或右连接(RIGHT JOIN)来获取关联的数据。 5. **ResultMap**: MyBatis的ResultMap是用于映射查询结果到...

    MyBatis通过 JDBC连接 PostgreSQL数据库 最小例子

    在本文中,我们将深入探讨如何使用MyBatis框架通过JDBC连接PostgreSQL数据库,构建一个最小的示例项目。MyBatis是一个轻量级的Java持久层框架,它简化了数据库操作,允许开发者将SQL语句直接嵌入到Java代码中,提供...

    《深入浅出MyBatis技术原理与实战》高清完整PDF下载

    当前已经是移动互联网时代,Java持久框架Hibernate没有办法适应高性能,灵活,大数据,可优化等要求,这时...本书从基础讲到底层,注重实战,原理,照顾到初中高三类读者,可以作为MyBatis的学习教程和参考技术丛书。

    mybatis自动生成代码配置文件

    mybatis自动生成代码配置文件,通过配置文件详细讲解以生成各层代码。

    mybatis-3-mybatis-3.4.1源码

    SqlSessionFactoryBuilder从配置文件或XML配置流中读取信息,构建出SqlSessionFactory实例。SqlSessionFactory为每个数据库会话提供SqlSession对象,SqlSession是与数据库交互的主要接口。 在MyBatis中,Mapper接口...

    springBoot结合Mybatis的使用,其中包括了Mybaits的xml配置使用、Mybatis部分源码分析等内容

    SpringBoot结合Mybatis的使用Demo,项目中通过SpringBoot配置Mybaits,配置mybatis的xml文件,以及程序启动类上通过...并且对Mybatis部分源码分析记录到文件中。 通过本项目demo可以学会很多,希望资源对大家有用处!

Global site tag (gtag.js) - Google Analytics