一:配置(约定大于配置)

MyBatis 的配置文件包含了会深深影响 MyBatis 行为的设置和属性信息。 配置文档的顶层结构如下:

  • configuration(配置)

    • properties(属性)
    • settings(设置)
    • typeAliases(类型别名)
    • typeHandlers(类型处理器)
    • objectFactory(对象工厂)
    • plugins(插件)
    • environments(环境配置)
      • environment(环境变量)

        • transactionManager(事务管理器)
        • dataSource(数据源)
    • databaseIdProvider(数据库厂商标识)
    • mappers(映射器)

二. 源码分析

2.1 从调用方法build 对源码理解

step1 : 进入build

step2: 再进入build

step3: 看到SqlSessionFactory

 public SqlSessionFactory build(InputStream inputStream, String environment, Properties properties) {try {// 1.SqlSessionFactory传递了一个InputStream,这个InputStream把带有的文件信息,传递给XMLConfigBuilder的对象parserXMLConfigBuilder parser = new XMLConfigBuilder(inputStream, environment, properties);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.}}}1.SqlSessionFactory传递了一个InputStream,这个InputStream把带有的文件信息,传递给XMLConfigBuilder的对象parser2.parser调用了parse()方法,来解析xml

step4 进入parse()方法

 public Configuration parse() {if (parsed) {throw new BuilderException("Each XMLConfigBuilder can only be used once.");}parsed = true;// configuration是xml的跟节点,即在parseConfiguration这个方法中去解析xmlparseConfiguration(parser.evalNode("/configuration"));return configuration;}1.configuration是xml的跟节点2.parse() 方法利用parseConfiguration这个方法去解析xml

step 5 进入 parseConfiguration

private void parseConfiguration(XNode root) {try {//issue #117 read properties firstpropertiesElement(root.evalNode("properties"));Properties settings = settingsAsProperties(root.evalNode("settings"));loadCustomVfs(settings);typeAliasesElement(root.evalNode("typeAliases"));pluginElement(root.evalNode("plugins"));objectFactoryElement(root.evalNode("objectFactory"));objectWrapperFactoryElement(root.evalNode("objectWrapperFactory"));reflectorFactoryElement(root.evalNode("reflectorFactory"));settingsElement(settings);// read it after objectFactory and objectWrapperFactory issue #631environmentsElement(root.evalNode("environments"));databaseIdProviderElement(root.evalNode("databaseIdProvider"));typeHandlerElement(root.evalNode("typeHandlers"));mapperElement(root.evalNode("mappers"));} catch (Exception e) {throw new BuilderException("Error parsing SQL Mapper Configuration. Cause: " + e, e);}}1.根据我们一开始提到的配置顺序来看,可以这个parseConfiguration方法把xml从头到尾的每个节点都拿过来进行解析2.具体通过propertiesElement(root.evalNode("properties"));Properties settings = settingsAsProperties(root.evalNode("settings"));来解析整个xml

2.2 从返回对象SqlSessionFactory 对源码进行理解

2.2.1 进入 SqlSessionFactory

SqlSession openSession();SqlSession openSession(boolean autoCommit);SqlSession openSession(Connection connection);SqlSession openSession(TransactionIsolationLevel level);SqlSession openSession(ExecutorType execType);SqlSession openSession(ExecutorType execType, boolean autoCommit);SqlSession openSession(ExecutorType execType, TransactionIsolationLevel level);SqlSession openSession(ExecutorType execType, Connection connection);Configuration getConfiguration();1.进入SqlSessionFactory 这个方法中,看到了一堆的SqlSession,由于SqlSession是接口所以我们要去找他的接口实现类去看源码

2.2.2 找SqlSessionFactory的接口实现类DefaultSqlSessionFactory

1.找到了SqlSessionFactory的接口实现类 DefaultSqlSessionFactory
2.于是我们再返回SqlSessionFactoryBuilder中去查找他SqlSessionFactory的接口实现类DefaultSqlSessionFactory,并且进入其中查看源码
3.通过SqlSessionFactoryBuilder用于返回SqlSessionFactory对象的方法,进入其中找到下面一段代码
  public SqlSessionFactory build(Configuration config) {return new DefaultSqlSessionFactory(config);}1.可见其返回的SqlSessionFactory中,new了DefaultSqlSessionFactory这个对象2.且new 出来的这个DefaultSqlSessionFactory对象里面带有 Configuration 解析的xml文件的内容config,也就是给new出来的DefaultSqlSessionFactory里传了带有xml内容的config。也就是new DefaultSqlSessionFactory(config);的含义

2.2.3 进入DefaultSqlSessionFactory看他是怎么返回带解析了的xml内容的config

2.2.3.1 进入DefaultSqlSessionFactory之前我们要先看一下 ,我们要获得什么内容

1.由于SqlSession是向数据库去发送指令的
2.明确得到什么,得到的数据用来做什么之后我们再进入DefaultSqlSessionFactory

2.2.3.2 进入DefaultSqlSessionFactory

1.由于我们是为了去得到session对象,所以我们进入openSessionFromDataSource这个方法去看他怎么去得到我们的session对象
2.因为这个方法的返回参数类型是SqlSession,所以我们返回的一定是session对象,于是我们决定进入这个代码

2.2.3.3 进入openSessionFromDataSource方法看他怎么返回session对象

  @Overridepublic Configuration getConfiguration() {return configuration;}private SqlSession openSessionFromDataSource(ExecutorType execType, TransactionIsolationLevel level, boolean autoCommit) {//事务Transaction tx = null;try {final Environment environment = configuration.getEnvironment();final TransactionFactory transactionFactory = getTransactionFactoryFromEnvironment(environment);tx = transactionFactory.newTransaction(environment.getDataSource(), level, autoCommit);//第二步 再看到这个Executor解析器final Executor executor = configuration.newExecutor(tx, execType);//第一步.我们通过DefaultSqlSession,知道他得到的对象,在往上看return new DefaultSqlSession(configuration, executor, autoCommit);} catch (Exception e) {closeTransaction(tx); // may have fetched a connection so lets call close()throw ExceptionFactory.wrapException("Error opening session.  Cause: " + e, e);} finally {ErrorContext.instance().reset();}}1.第一步先查看最终返回值DefaultSqlSession,其中有configuration, executor, autoCommit,根据前面的解释大体知道第一个是xml的什么东西,但是不确定后面的,继续看2.第二步看到Executor,这个我们知道是解析器,但是不确定这个方法做了什么,返回了什么,所以我们选择进入这个方法

2.2.3.3 进入Executor这个方法,我们查看这个方法做了什么,解析了什么

public interface Executor {ResultHandler NO_RESULT_HANDLER = null;int update(MappedStatement ms, Object parameter) throws SQLException;<E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler, CacheKey cacheKey, BoundSql boundSql) throws SQLException;<E> List<E> query(MappedStatement ms, Object parameter, RowBounds rowBounds, ResultHandler resultHandler) throws SQLException;<E> Cursor<E> queryCursor(MappedStatement ms, Object parameter, RowBounds rowBounds) throws SQLException;List<BatchResult> flushStatements() throws SQLException;//提交事务void commit(boolean required) throws SQLException;//回滚void rollback(boolean required) throws SQLException;CacheKey createCacheKey(MappedStatement ms, Object parameterObject, RowBounds rowBounds, BoundSql boundSql);boolean isCached(MappedStatement ms, CacheKey key);void clearLocalCache();void deferLoad(MappedStatement ms, MetaObject resultObject, String property, CacheKey key, Class<?> targetType);Transaction getTransaction();void close(boolean forceRollback);boolean isClosed();void setExecutorWrapper(Executor executor);}
1.进入Executor这个方法我们发现,这个Executor也是一个接口
2.这个Executor接口提供了,增删改查最基础的方法
3.提交事务
4.回滚事务
5.由于Executor是一个接口,所以我们继续来查找这个Executor接口的实现类

2.2.3.4 查找Executor接口的实现类

1.由于Executor接口的实现类的实现类太多,在这里我们就去看一下他这个简单接口实现类,直接ctrl+n,去看这个实现类SimpleExecutor的源码
2.找到后发现他这里执行两个方法

方法1:douptate

1.发现Statement对象,顿时明白了mybatis底层也是用jdbc来操作数据库的

方法二:doQuery 对象

1.又发现了利用statement对象去返回数据库,确定了mybatis底层肯定是用jdbc去操作数据库的

mybatis源码解析相关推荐

  1. Mybatis源码解析(一):环境搭建

    Mybatis源码系列文章 手写源码(了解源码整体流程及重要组件) Mybatis源码解析(一):环境搭建 Mybatis源码解析(二):全局配置文件的解析 Mybatis源码解析(三):映射配置文件 ...

  2. Mybatis源码解析《二》

    导语 在前一篇文章Mybatis源码解析<一>中,已经简单了捋了一下mybatis核心文件和mapper配置文件的一个基本的解析流程,这是理解mybatis的基本,和spring中的配置文 ...

  3. mybatis源码阅读(二):mybatis初始化上

    转载自  mybatis源码阅读(二):mybatis初始化上 1.初始化入口 //Mybatis 通过SqlSessionFactory获取SqlSession, 然后才能通过SqlSession与 ...

  4. mybatis源码解析(一)

    Mybatis 源码解析 (一) 一. ORM框架的作用 实际开发系统时,我们可通过JDBC完成多种数据库操作.这里以传统JDBC编程过程中的查询操作为例进行说明,其主要步骤如下: (1)注册数据库驱 ...

  5. 对标阿里P8的MyBatis源码解析文档,面试/涨薪两不误,已献出膝盖

    移动互联网的特点是大数据.高并发,对服务器往往要求分布式.高性能.高灵活等,而传统模式的Java数据库编程框架已经不再适用了. 在这样的背景下,一个Java的持久框架MyBatis走入了我们的世界,它 ...

  6. 【MyBatis源码解析】MyBatis一二级缓存

    MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级),尤其是对于一些相 ...

  7. mybatis源码解析一 xml解析(解析器)

    最近闲来无事,看着一些源码类的书籍,只是光看,好像并不能给自己很好的益处,无法记下来,所以就有了这个Mybatis源码解析系列的博客.网上也有大量的源码解析,在此记录有两个原因,一是为了加深自己的印象 ...

  8. mybatis源码考究二(sqlsession线程安全和缓存失效)

    mybatis源码考究二 1.mybatis整合spring解决sqlsession线程安全问题 2.mybatis整合spring一级缓存失效问题 mybatis结合spring使用 1.项目依赖 ...

  9. 【深度学习模型】智云视图中文车牌识别源码解析(二)

    [深度学习模型]智云视图中文车牌识别源码解析(二) 感受 HyperLPR可以识别多种中文车牌包括白牌,新能源车牌,使馆车牌,教练车牌,武警车牌等. 代码不可谓不混乱(别忘了这是职业公司的准产品级代码 ...

  10. mybatis源码解析1_sessionFactory

    注 一下内容都是根据尚硅谷2018年mybatis源码解析做的课程笔记,视频链接: https://www.bilibili.com/video/BV1mW411M737?p=74&share ...

最新文章

  1. 如何为jframe设置于右侧滑轮_如何为电脑设置屏保密码?
  2. 700页!分享珍藏很久的《推荐系统学习手册》(附下载链接及入门经验)
  3. 损失函数中正则化项L1和L2的理解
  4. linux如何修改网卡序号,CentOS双网卡时改变网卡编号和配置静态路由的方法
  5. 用行为树的方式思考:任务系统设计
  6. RobotFramework自动化框架—数据驱动测试
  7. 对 SAP UI5 一无所知的新手,从哪些材料开始学习比较好?
  8. 01-Flutter移动电商实战-项目学习记录
  9. django-中间件的执行流程
  10. deepin终端编译c程序_在deepin linux上安装国人开发的编程语言-“明”语言
  11. 怎么查看raid0或者raid5_海康监控磁盘阵列怎么配置?一文了解清楚
  12. iOS开发探索-Base64编码
  13. 隨身碟檔案救援軟體救援刪除的檔案/丟失的資料
  14. ANSYS ICEM CFD——网格划分基础知识
  15. OCX控件安装过程中遇到的问题及解决方法
  16. 使用Github上传本地项目代码
  17. JAVA购物网站商城系统毕业设计 开题报告
  18. 一起来刷LeetCode呀~
  19. celeste第二章_《蔚蓝(Celeste)》全水晶之心收集攻略
  20. 微信小程序音乐播放器源码【包调试运行】

热门文章

  1. java 怎么把日期格式化时间_Java—格式化日期/时间
  2. SQL安装过程中出现的错误解决
  3. 机器学习笔记 - 什么是图神经网络?
  4. 标准cpci接口定义_cpci接口定义精简
  5. lintcode-微软笔试
  6. ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  7. sql注入工具、检测及手工注入集合
  8. TCP 和 UDP 有什么区别?
  9. jar类型文件图标不显示_显示的JAR文件
  10. 串口转usb驱动c语言程序,usb serial驱动下载-usb serial converter驱动下载 官方版usb转串口驱动程序-win7/8/10/xp32/64位-IT猫扑网...