MyBatis源码分析(二):MyBatis整体架构及原理
一、Mybatis整体架构导图

二、Mybatis的核心组成
SqlSessionFactoryBuilder(构造器):
根据配置信息(XML)生成SqlSessionFactory工厂接口,构造器使用了org.apache.ibatis.builder.xml包下的XMLConfigBuilder对Mybatis-config配置文件解析,该XML解析类使用了org.apache.ibatis.parsing解析包下的工具解析XML各个节点的信息,构建Configuration,再用Configuration创建SqlSessionFactory,然后SqlSessionFactoryBuilder生命周期结束。其中,默认生成的是DefaultSqlSessionFactory。
SqlSessionFactory(工厂接口):
依靠工厂来生成SqlSession会话接口,生命周期贯穿整个应用,重复创建工厂接口会消耗更多数据库连接资源。
SqlSession(会话接口):
发送SQL去执行并返回结果,还能获取Mapper的接口,生命周期存在于请求数据库处理事务中,结束后要关闭,线程不安全。它里面主要有四大对象:
- Executor 执行器:SIMPLE、REUSER、BATCH
- StatementHandler 数据库会话器:SimpleStatementHandler、PreparedStatementHandler、CallableStatementHandler,通过RoutingStatementHandler的适配器模式穿建不同的StatementHandler对象
- ParameterHandler SQL参数处理器:对预编译的SQL语句进行参数设置,完成预编译参数的设置,从parameterObject对象中取得参数,然后同TypeHandler进行参数处理
- ResultHandler 结果处理器:组装结果集来返回的,里面有处理存储过程输出参数的方法,还有包装结果集的方法,默认情况下用DefaultResultSetHandler类,这个接口的实现有点复杂,涉及到JAVASSIST或者CGLIB作为延迟加载,然后用TypeHandler和ObjectFactory进行结果组装结果再返回
SqlSession内部运行图:

SQL Mapper(Java接口+XML文件 或者 Java接口+Java注解):
有对应的SQL和映射规则,负责发送SQL执行,并返回结果。映射器的内部由3部分组成:
MappedStatement,保存映射的一个节点<select|insert|delete|update>,包括配置的SQL,SQL的id、缓存信息、resultMap、parameterType、resultType、languageDriver等配置内容;
SqlSource,提供SqlBound对象,是MappedStatement的一个属性;
SqlBound,建立SQL和参数的地方,有3个常用属性,sql、parameterObject,parameterMappings。
MyBatis源码分析(二):MyBatis整体架构及原理的更多相关文章
- Mybatis源码分析--关联表查询及延迟加载原理(二)
在上一篇博客Mybatis源码分析--关联表查询及延迟加载(一)中我们简单介绍了Mybatis的延迟加载的编程,接下来我们通过分析源码来分析一下Mybatis延迟加载的实现原理. 其实简单来说Myba ...
- MyBatis源码分析(各组件关系+底层原理
MyBatis源码分析MyBatis流程图 下面将结合代码具体分析. MyBatis具体代码分析 SqlSessionFactoryBuilder根据XML文件流,或者Configuration类实例 ...
- Bootstrap源码分析系列之整体架构
作为一名合格的前端工程师,你肯定听说过Bootstarp框架.确实可以说Bootstrap框架是最流行的前端框架之一.可是也有人说Bootstrap是给后端和前端小白用的,我认为只要学习它能给我们前端 ...
- Flask源码分析二:路由内部实现原理
前言 Flask是目前为止我最喜欢的一个Python Web框架了,为了更好的掌握其内部实现机制,这两天准备学习下Flask的源码,将由浅入深跟大家分享下,其中Flask版本为1.1.1. 上次了解了 ...
- mybatis源码分析二
这次分析mybatis的xml文件 1. <?xml version="1.0" encoding="UTF-8" ?> <configura ...
- mybatis源码学习(二)--mybatis+spring源码学习
这篇笔记主要来就,mybatis是如何利用spring的扩展点来实现和spring的整合 1.mybatis和spring整合之后,我们就不需要使用sqlSession.selectOne()这种方式 ...
- 【Seajs源码分析】1. 整体架构
seajs是一个非常流行的模块开发引擎,目前项目中使用比较多,为了深入了解已经改进seajs我阅读了他的源码,希望对自己的代码生涯能有所启发. 本文说介绍的是指seajs2.3.3版本. 首先seaj ...
- MyBatis源码分析(二)
MyBatis的xml配置(核心配置) configuration(配置) properties(属性) settings(设置) typeAliases(类型别名) typeHandlers(类型处 ...
- mybatis 源码分析二
1.SqlSession下的四大对象 Executor.StatementHandler.ParameterHandler.ResultSetHandler StatementHandler的作用是使 ...
- 精尽 MyBatis 源码分析 - 整体架构
该系列文档是本人在学习 Mybatis 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释(Mybatis源码分析 GitHub 地址.Mybatis-Spring 源码分析 GitHub ...
随机推荐
- spark相关介绍-提取hive表(一)
本文环境说明 centos服务器 jupyter的scala核spylon-kernel spark-2.4.0 scala-2.11.12 hadoop-2.6.0 本文主要内容 spark读取hi ...
- File Inclusion(文件包含)
File Inclusion,意思是文件包含(漏洞),是指当服务器开启allow_url_include选项时,就可以通过php的某些特性函数(include(),require()和include_ ...
- CodeForce-811C Vladik and Memorable Trip(动态规划)
Vladik and Memorable Trip CodeForces - 811C 有一个长度为 n 的数列,其中第 i 项为 ai. 现在需要你从这个数列中选出一些互不相交的区间,并且保证整个数 ...
- python语言介绍及安装
Python语言简介 Python是什么语言 Python是一种解释型的.可移植的.开源的脚本. 什么是计算机编程 计算机程序:为了让计算机执行某些操作或解决某个问题而编写的一系列有序指令的集合 如何 ...
- ACID的实现原理
引言 ACID是事务的特点也是必须的要求,只有保证ACID事务的执行才不会出错,分别是原子性.一致性.隔离性和持久性.我们知道典型的MySQL事务是这样执行的: start transaction 开 ...
- 学习PHP中好玩的Gmagick图像操作扩展的使用
在 PHP 的图像处理领域,要说最出名的 GD 库为什么好,那就是因为它不需要额外安装的别的什么图像处理工具,而且是随 PHP 源码一起发布的,只需要在安装 PHP 的时候添加上编译参数就可以了. G ...
- composer出现问题: Could not open input file: composer.phar
可以执行下面命令 php -r "readfile('https://getcomposer.org/installer');" | php This will install c ...
- nginx使用用户真实IP做hash(解决经过CND后ip_hash失效问题)
在nginx中常用的有以下四种负载均衡的算法,分别是:round-robin.ip-hash.least-connected和weighted.当然在实际生产中或许使用最多的就是ip-hash了,一般 ...
- EcShop调用显示指定分类下的子分类方法
ECSHOP首页默认的只有全部分类,还有循环大类以及下面小类的代码,貌似没有可以调用显示指定大类下的子分类代码.于是就有这个文章的产生了,下面由夏日博客来总结下网站建设过程中ECSHOP此类问题的网络 ...
- 推荐一款 Python 微服务框架 - Nameko
1. 前言 大家好,我是安果! 考虑到 Python 性能及效率性,Python Web 端一直不温不火,JAVA 和 Golang 的微服务生态一直很繁荣,也被广泛用于企业级应用开发当中 本篇文章 ...