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

一: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<String,Object> objectMap = sqlSession.selectOne("mybatis.BlogMapper.selectBlog", 1);
            System.out.println(objectMap);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

2.配置文件的配置

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
   <environments default="development">
       <environment id="development">
           <transactionManager type="JDBC"/>
           <dataSource type="POOLED">
               <property name="driver" value="com.mysql.jdbc.Driver"/>
               <property name="url" value="jdbc:mysql://193.112.47.238:3306/blog"/>
               <property name="username" value="root"/>
               <property name="password" value="19950821abc"/>
           </dataSource>
       </environment>
   </environments>
   <mappers>
       <mapper resource="mybatis/BlogMapper.xml"/>
   </mappers>
</configuration>

二:IDEA如何下载源码

1.IDEA的配置

IDEA下载源码配置

2.Maven更新

右键mavne–>reimport

3.Download sources

Ctrl + Alt + B 可以进入一个类的源码文件,如果进入的是一个classes文件,可以点击窗口右上角的【download sources】进行下载。
download sources

三:源码分析

1.获取数据源

创建SqlSessionFactoryBuilder对象,然后调用它的build方法,入参是配置文件的输入流。再调用build的重载方法。
在这里插入图片描述
再调用XMLConfigBuilder的parse方法对配置文件进行解析。
在这里插入图片描述
在这里插入图片描述
调用praseConfiguration方法对<configuration></configuration>节点下的子节点进行解析。
在这里插入图片描述
调用environmentsElement方法解析<environments></environments>标签;
调用dataSourceElement方法解析<dataSource></dataSource>标签;
调用Configuration的setEnvironment保存拿到的数据源信息。
在这里插入图片描述
在这里插入图片描述

2.获取sql

mybatis有4种加载mapper文件的方式。参看官方文档:
在这里插入图片描述
调用XMLConfigBuilder的mapperElement方法解析<mapper></mapper>标签。可以看到,mybatis会优先处理<package/>标签的资源。

在这里插入图片描述
再调用XMLMapperBuilder的parse方法进行解析。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
调用XMLStatementBuilder的parseStatementNode方法;
在这里插入图片描述
调用MapperBuilderAssistant的addMappedStatement方法;
再调用Configuration的addMappedStatement保存得到的MappedStatement;
在这里插入图片描述

3.SQL的执行

调用DefaultSqlSessionFactory的openSession方法。
在这里插入图片描述
再调用openSessionFromDataSource方法。
在这里插入图片描述
查看Configuration的newExecutor方法可以知道,当执行器是null时,会使用Simple作为默认执行器。

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

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

四:MyBatis处理流程图

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

五:使用设计模式

1.构建者设计模式

六:参考资料

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

猜你喜欢

转载自blog.csdn.net/u012734723/article/details/107442600
今日推荐