Mybatis源码分析:从解析xml到获取结果集

Mybatis源码分析

  • 一:mybatis的使用
    • 1.mybatis的入口
    • 2.配置文件的配置
  • 二:IDEA如何下载源码
    • 1.IDEA的配置
    • 2.Maven更新
    • 3.Download sources
  • 三:源码分析
    • 1.获取数据源
    • 2.获取sql
    • 3.SQL的执行
  • 四:MyBatis处理流程图
  • 五:使用设计模式
    • 1.构建者设计模式
  • 六:参考资料

一:mybatis的使用

1.mybatis的入口

package mybatis;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

import java.io.IOException;
import java.io.InputStream;
import java.util.Map;

/**
 * @Author bluesnail95
 * @Date 2020/7/19 9:01
 * @Description
 */
public class TestMybatis {

    public static void main(String[] args) {
        String resource = "mybatis.xml";
        InputStream inputStream = null;
        try {
            inputStream = Resources.getResourceAsStream(resource);
            SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
            SqlSession sqlSession = sqlSessionFactory.openSession();
            Map objectMap = sqlSession.selectOne("mybatis.BlogMapper.selectBlog", 1);
            System.out.println(objectMap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.配置文件的配置




   
       
           
           
               
               
               
               
           
       
   
   
       
   

二:IDEA如何下载源码

1.IDEA的配置

Mybatis源码分析:从解析xml到获取结果集_第1张图片

2.Maven更新

右键mavne–>reimport

3.Download sources

Ctrl + Alt + B 可以进入一个类的源码文件,如果进入的是一个classes文件,可以点击窗口右上角的【download sources】进行下载。
Mybatis源码分析:从解析xml到获取结果集_第2张图片

三:源码分析

1.获取数据源

创建SqlSessionFactoryBuilder对象,然后调用它的build方法,入参是配置文件的输入流。再调用build的重载方法。
在这里插入图片描述
再调用XMLConfigBuilder的parse方法对配置文件进行解析。
Mybatis源码分析:从解析xml到获取结果集_第3张图片
Mybatis源码分析:从解析xml到获取结果集_第4张图片
调用praseConfiguration方法对节点下的子节点进行解析。
Mybatis源码分析:从解析xml到获取结果集_第5张图片
调用environmentsElement方法解析标签;
调用dataSourceElement方法解析标签;
调用Configuration的setEnvironment保存拿到的数据源信息。
Mybatis源码分析:从解析xml到获取结果集_第6张图片
Mybatis源码分析:从解析xml到获取结果集_第7张图片

2.获取sql

mybatis有4种加载mapper文件的方式。参看官方文档:
Mybatis源码分析:从解析xml到获取结果集_第8张图片
调用XMLConfigBuilder的mapperElement方法解析标签。可以看到,mybatis会优先处理标签的资源。

Mybatis源码分析:从解析xml到获取结果集_第9张图片
再调用XMLMapperBuilder的parse方法进行解析。
Mybatis源码分析:从解析xml到获取结果集_第10张图片
Mybatis源码分析:从解析xml到获取结果集_第11张图片
Mybatis源码分析:从解析xml到获取结果集_第12张图片
调用XMLStatementBuilder的parseStatementNode方法;
Mybatis源码分析:从解析xml到获取结果集_第13张图片
调用MapperBuilderAssistant的addMappedStatement方法;
再调用Configuration的addMappedStatement保存得到的MappedStatement;
Mybatis源码分析:从解析xml到获取结果集_第14张图片

3.SQL的执行

调用DefaultSqlSessionFactory的openSession方法。
在这里插入图片描述
再调用openSessionFromDataSource方法。
Mybatis源码分析:从解析xml到获取结果集_第15张图片
查看Configuration的newExecutor方法可以知道,当执行器是null时,会使用Simple作为默认执行器。

mybatis有3种执行器,包括SIMPLE,REUSE,BATCH。
Mybatis源码分析:从解析xml到获取结果集_第16张图片
变量cacheEnabled表示是否开启一级缓存,默认是true。
Mybatis源码分析:从解析xml到获取结果集_第17张图片
调用DefaultSqlSession的selectOne方法。selectOne的底层是调用的selectList方法,再取list的第一个元素。
Mybatis源码分析:从解析xml到获取结果集_第18张图片
调用CachingExecutor的query方法获取结果集。
Mybatis源码分析:从解析xml到获取结果集_第19张图片
调用BaseExecutor的createCacheKey方法获取缓存Key
Mybatis源码分析:从解析xml到获取结果集_第20张图片
调用BaseExecutor的query方法,如果缓存中存在,从缓存中获取结果;如果缓存中不存在,就从数据库查询结果。
Mybatis源码分析:从解析xml到获取结果集_第21张图片
调用BaseExecutor的queryFromDatabase方法,把获取的结果集和请求的入参存在缓存中。
Mybatis源码分析:从解析xml到获取结果集_第22张图片
我们这里使用的是默认的执行器SimpleExecutor,所以调用SimpleExecutor的doQuery方法。
Mybatis源码分析:从解析xml到获取结果集_第23张图片
查看prepareStatement方法,获取了java.sql.Connection
Mybatis源码分析:从解析xml到获取结果集_第24张图片
调用PreparedStatementHandler的query方法;
在这里插入图片描述
调用的DefaultResultSetHandler的handleResultSets方法
Mybatis源码分析:从解析xml到获取结果集_第25张图片
查看getFirstResultSet方法;再调用new ResultSetWrapper();
Mybatis源码分析:从解析xml到获取结果集_第26张图片

Mybatis源码分析:从解析xml到获取结果集_第27张图片
Mybatis源码分析:从解析xml到获取结果集_第28张图片Mybatis源码分析:从解析xml到获取结果集_第29张图片
Mybatis源码分析:从解析xml到获取结果集_第30张图片

四:MyBatis处理流程图

parse解析
build
openSession
query
newStatementHandler
handleResultSets
SqlSessionFactoryBuilder
Configuration
SqlSessionFactory
SqlSession
Executor
StatementHandler
ResultSetHandler

五:使用设计模式

1.构建者设计模式

六:参考资料

mybatis源码分析-概述
mybatis官方文档
mybatis-3

你可能感兴趣的:(mybatis)