1. 准备工作
编写测试代码(具体请参考《Mybatis入门示例》),设置断点,以Debug模式运行,具体代码如下:
- String resource = "mybatis.cfg.xml";
-
- Reader reader = Resources.getResourceAsReader(resource);
-
- SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
-
- SqlSession session = ssf.openSession();
2.源码分析
我们此次就对上面的代码进行跟踪和分析,let's go。
首先我们按照顺序先看看第一行和第二行代码,看看它主要完成什么事情:
- String resource = "mybatis.cfg.xml";
-
- Reader reader = Resources.getResourceAsReader(resource);
读取Mybaits的主配置配置文件,并返回该文件的输入流,我们知道Mybatis所有的SQL语句都写在XML配置文件里面,所以第一步就需要读取这些XML配置文件,这个不难理解,关键是读取文件后怎么存放。
我们接着看第三行代码(如下),该代码主要是读取配置文件流并将这些配置信息存放到Configuration类中。
- SqlSessionFactory ssf = new SqlSessionFactoryBuilder().build(reader);
SqlSessionFactoryBuilder的build的方法如下:
- public SqlSessionFactory build(Reader reader) {
- return build(reader, null, null);
- }
其实是调用该类的另一个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) {
-
-
-
- }
-
- }
-
- }
我们重点看一下里面两行:
-
- XMLConfigBuilder parser = new XMLConfigBuilder(reader, environment, properties);
-
-
- return build(parser.parse());
这里的XMLConfigBuilder初始化其实调用的代码如下:
- private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
- super(new Configuration());
-
- ErrorContext.instance().resource("SQL Mapper Configuration");
-
- this.configuration.setVariables(props);
-
- this.parsed = false;
-
- this.environment = environment;
-
- this.parser = parser;
-
- }
XMLConfigBuilder的parse方法执行代码如下:
- public Configuration parse() {
-
- if (parsed) {
-
- throw new BuilderException("Each MapperConfigParser can only be used once.");
-
- }
-
- parsed = true;
-
- parseConfiguration(parser.evalNode("/configuration"));
-
- return configuration;
-
- }
解析的内容主要是在parseConfiguration方法中,它主要完成的工作是读取配置文件的各个节点,然后将这些数据映射到内存配置对象Configuration中,我们看一下parseConfiguration方法内容:
- private void parseConfiguration(XNode root) {
-
- try {
-
- typeAliasesElement(root.evalNode("typeAliases"));
-
- pluginElement(root.evalNode("plugins"));
-
- objectFactoryElement(root.evalNode("objectFactory"));
-
- objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));
-
- propertiesElement(root.evalNode("properties"));
-
- settingsElement(root.evalNode("settings"));
-
- environmentsElement(root.evalNode("environments"));
-
- typeHandlerElement(root.evalNode("typeHandlers"));
-
- mapperElement(root.evalNode("mappers"));
-
- } catch (Exception e) {
-
- throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);
-
- }
-
- }
最后的build方法其实是传入配置对象进去,创建DefaultSqlSessionFactory实例出来. DefaultSqlSessionFactory是SqlSessionFactory的默认实现.
- public SqlSessionFactory build(Configuration config) {
- return new DefaultSqlSessionFactory(config);
- }
最后我们看一下第四行代码:
- SqlSession session = ssf.openSession();
通过调用DefaultSqlSessionFactory的openSession方法返回一个SqlSession实例,我们看一下具体是怎么得到一个SqlSession实例的。首先调用openSessionFromDataSource方法。
- public SqlSession openSession() {
- return openSessionFromDataSource(configuration.getDefaultExecutorType(), null, false);
- }
下面我们看一下openSessionFromDataSource方法的逻辑:
- private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {
- Connection connection = null;
-
- try {
-
-
- final Environment environment = configuration.getEnvironment();
-
-
- final DataSource dataSource = getDataSourceFromEnvironment(environment);
-
-
- TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);
-
- connection = dataSource.getConnection();
-
- if (level != null) {
-
-
- connection.setTransactionIsolation(level.getLevel());
- }
-
-
- connection = wrapConnection(connection);
-
-
- Transaction tx = transactionFactory.newTransaction(connection, autoCommit);
-
-
- Executor executor = configuration.newExecutor(tx, execType);
-
-
- return new DefaultSqlSession(configuration, executor, autoCommit);
-
- } catch (Exception e) {
-
- closeConnection(connection);
-
- throw ExceptionFactory.wrapException("Error opening session. Cause: " + e, e);
-
- } finally {
-
- ErrorContext.instance().reset();
-
- }
-
- }
传入参数说明:
(1)ExecutorType:执行类型,ExecutorType主要有三种类型:SIMPLE, REUSE, BATCH,默认是SIMPLE,都在枚举类ExecutorType里面。
(2)TransactionIsolationLevel:事务隔离级别,都在枚举类TransactionIsolationLevel中定义。
(3)autoCommit:是否自动提交,主要是事务提交的设置。
DefaultSqlSession是SqlSession的实现类,该类主要提供操作数据库的方法给开发人员使用。
这里总结一下上面的过程,总共由三个步骤:
步骤一:读取Ibatis的主配置文件,并将文件读成文件流形式(InputStream)。
步骤二:从主配置文件流中读取文件的各个节点信息并存放到Configuration对象中。读取mappers节点的引用文件,并将这些文件的各个节点信息存放到Configuration对象。
步骤三:根据Configuration对象的信息获取数据库连接,并设置连接的事务隔离级别等信息,将经过包装数据库连接对象SqlSession接口返回,DefaultSqlSession是SqlSession的实现类,所以这里返回的是DefaultSqlSession,SqlSession接口里面就是对外提供的各种数据库操作。
分享到:
相关推荐
MyBatis源码分析 MyBatis是一款流行的Java持久层框架,提供了强大的数据库访问能力,本文将对MyBatis的源码进行深入分析,从而帮助读者更好地理解MyBatis的工作机理。 1. MyBatis入门 MyBatis是一款基于Java的...
本资源“mybatis源码分析视频”是针对MyBatis框架进行深入剖析的教程,通过视频和文档的形式帮助学习者理解其内部工作机制。 1. **MyBatis简介** MyBatis消除了几乎所有的JDBC代码和手动设置参数以及获取结果集。...
总结起来,MyBatis源码分析涵盖了从配置加载到数据库操作的全过程,涉及到了配置解析、SQL执行、结果映射等多个关键环节,以及Executor、StatementHandler等核心组件。通过深入学习MyBatis的源码,开发者不仅可以...
2. 配置mybatis-config.xml:这是MyBatis的全局配置文件,包含数据库连接信息、类型别名、映射文件路径等。 3. 创建SqlSessionFactory:基于配置文件创建SqlSessionFactory实例,通常在Spring框架中,可以使用...
Mybatis源码分析 Mybatis是一款流行的持久层框架,它提供了一个强大的机制来简化Java应用程序中的数据库交互。Mybatis的核心概念包括Configuration、SqlSessionFactory、Session、Executor、MappedStatement、...
SqlSessionFactory的创建通常通过SqlSessionFactoryBuilder完成,它可以从XML配置文件或注解配置中读取信息。 3. SqlSession:SqlSession是执行数据库操作的对象,提供了增删查改的方法。每次数据库交互都应在一个...
本专题课程针对SpringBoot 2.x、Spring 5、SpringMVC和Mybatis这四个关键框架进行源码解析,旨在帮助开发者从底层原理出发,提升技术水平,更好地应用和优化这些工具。 首先,我们来探讨SpringBoot 2.x。SpringBoot...
MyBatis是一款流行的持久层框架,支持SQL查询、存储过程以及高级映射,...通过本系列教程,你可以从基础的环境搭建,逐步学习到MyBatis的核心概念、高级特性以及与其他流行框架的集成方法,从而达到精通MyBatis的目标。
在“SpringBoot+tk.Mybatis整合+yml配置+logback配置”这个主题中,我们将探讨以下几个关键知识点: 1. **SpringBoot整合tk.Mybatis**: tk.Mybatis 是 Mybatis 的一个扩展,提供了很多实用功能,如:动态 SQL、...
在"SpringMVC+MyBatis开发从入门到实践源码"这个项目中,你将会找到各个章节的代码示例,这些示例涵盖了从基本的配置到复杂的业务场景。例如,如何设置SpringMVC的DispatcherServlet,如何编写Controller,如何配置...
MyBatis 详解与配置 MyBatis MyBatis 是一个可以自定义 SQL、存储过程和...* mysql.properties:数据库连接配置文件 MyBatis 的优点和配置步骤使其成为一个非常流行的持久层框架,广泛应用于 Java 企业级应用程序中。
MyBatis是一款流行的Java持久层框架,它简化了数据库操作,允许开发者将SQL语句直接映射到Java方法,从而避免了传统的数据访问层的复杂性。MyBatis的源码分析对于理解其工作原理、优化数据库交互以及进行二次开发至...
Mybatis Generator 通过读取配置文件(generatorConfig.xml),解析其中的参数,连接到指定的数据库,然后根据数据库中的表信息自动生成Java源代码。这些源代码包括DAO层的接口和实现类、实体类以及Mapper XML映射...
3. **Configuration**: MyBatis的核心配置,包含了全局配置信息(比如数据库连接信息、环境配置、映射文件等)和映射器配置信息。 4. **MapperRegistry**: 负责管理Mapper接口和对应的Mapper配置,使得用户可以通过...
4. **Mapper XML文件**: 配置多对多关系时,需要在Mapper的XML文件中定义SQL查询,包括左连接(LEFT JOIN)或右连接(RIGHT JOIN)来获取关联的数据。 5. **ResultMap**: MyBatis的ResultMap是用于映射查询结果到...
在本文中,我们将深入探讨如何使用MyBatis框架通过JDBC连接PostgreSQL数据库,构建一个最小的示例项目。MyBatis是一个轻量级的Java持久层框架,它简化了数据库操作,允许开发者将SQL语句直接嵌入到Java代码中,提供...
当前已经是移动互联网时代,Java持久框架Hibernate没有办法适应高性能,灵活,大数据,可优化等要求,这时...本书从基础讲到底层,注重实战,原理,照顾到初中高三类读者,可以作为MyBatis的学习教程和参考技术丛书。
mybatis自动生成代码配置文件,通过配置文件详细讲解以生成各层代码。
SqlSessionFactoryBuilder从配置文件或XML配置流中读取信息,构建出SqlSessionFactory实例。SqlSessionFactory为每个数据库会话提供SqlSession对象,SqlSession是与数据库交互的主要接口。 在MyBatis中,Mapper接口...
SpringBoot结合Mybatis的使用Demo,项目中通过SpringBoot配置Mybaits,配置mybatis的xml文件,以及程序启动类上通过...并且对Mybatis部分源码分析记录到文件中。 通过本项目demo可以学会很多,希望资源对大家有用处!