【Mybatis源码分析 3.5.1版本】

目录

前言

一、Mybatis介绍

二、Mybatis配置文件

三、SqlSessionFactory源码解析

四、SqlSession源码解析

五、Mapper源码解析

总结


前言

         mybatis中文官网地址:https://mybatis.org/mybatis-3/zh/index.html


一、Mybatis介绍

        MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。MyBatis 可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。 

        后面所有的代码都是Mybatis的源码!!!!!java代码!!!!!


二、Mybatis配置文件

       截图自中文官网:

         配置文件样例:




三、SqlSessionFactory源码解析

        根据工具类创建SqlSessionFactory对象

InputStream inputStream = Resources.getResourceAsStream("mybatis.xml");
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder()
.build(inputStream);

        进入build方法

// 当前类:SqlSessionFactoryBuilder
public SqlSessionFactory build(InputStream inputStream) {return build(inputStream, null, null);
}// 当前类:SqlSessionFactoryBuilder
public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {try {// 把传入的Mybatis的配置文件路径,包装成一个XMLConfigBuilder对象,解析xml XMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);// build方法返回一个DefaultSqlSessionFactory对象// parse方法用来解析xml配置文件,返回Configuration对象return build(parser.parse());} catch (Exception e) {throw ExceptionFactory.wrapException("Error building SqlSession.", e);} finally {ErrorContext.instance().reset();try {inputStream.close();} catch (IOException e) {// Intentionally ignore. Prefer previous error.}}
}// 当前类:SqlSessionFactoryBuilder
public SqlSessionFactory build(Configuration config) {return new DefaultSqlSessionFactory(config);
}

        进入XPathParser的parse方法

// 当前类:XPathParser
public Configuration parse() {// 默认时falseif (parsed) {// 全局配置文件不可以重复解析throw new BuilderException("Each XMLConfigBuilder can only be used once.");}// 改为trueparsed = true;// 解析入口,parser.evalNode("/configuration")返回XNode对象,xml文件解析成的java beanparseConfiguration(parser.evalNode("/configuration"));// 返回全局配置文件return configuration;
}

        进入parseConfiguration方法

// 当前类:XMLConfigBuilder
private void parseConfiguration(XNode root) {try {//解析全局配置文件的标签下的标签//保存在Configuration的variables属性和XPathParser的variables属性里propertiesElement(root.evalNode("properties"));//解析全局配置文件的标签下的标签到Properties对象里面Properties settings = settingsAsProperties(root.evalNode("settings"));//解析全局配置文件的标签下的标签,从本地和FTP加载文件 loadCustomVfs(settings);//解析全局配置文件的标签下的标签,LOG4J,LOG4J2,SLF4JloadCustomLogImpl(settings);//解析全局配置文件的标签下的标签,类别名typeAliasesElement(root.evalNode("typeAliases"));//解析全局配置文件的标签下的标签,所有的插件类pluginElement(root.evalNode("plugins"));//解析全局配置文件的标签下的标签,对象工厂objectFactoryElement(root.evalNode("objectFactory"));//解析全局配置文件的标签下的标签,对象装饰类objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));//解析全局配置文件的标签下的标签,辅助性工厂类reflectorFactoryElement(root.evalNode("reflectorFactory"));///给全局配置类configuration设置属性,没有则用默认值settingsElement(settings);//解析全局配置文件的标签下的标签,多个数据源environmentsElement(root.evalNode("environments"));//解析全局配置文件的标签下的标签,数据源标识databaseIdProviderElement(root.evalNode("databaseIdProvider"));//解析全局配置文件的标签下的标签,jdbcType和javaType映射类typeHandlerElement(root.evalNode("typeHandlers"));//解析全局配置文件的标签下的标签,sql所在文件,//支持xml文件路径(resource,url,文件下的sql标签如