互联网轻量级框架SSM-查缺补漏第七天(MyBatis的解析和运行原理)
第七章MyBatis的解析和运行原理
SqlSessionFactory是MyBatis的核心类之一,其最重要的功能就是提供创建MyBatis的核心借口SqlSession,所以要先创建SqlSessionFactory,为此要提供配置文件和相关的参数。MyBatis是一个复杂的系统,它采用了Builder模式去创建SqlSessionFactory,在实际上可以通过SqlSessionFactoryBuilder去创建,分为两步:
SqlSessionFactory = new SqlSessionFactoryBuider().build(inputStream);

- 第一步通过org.apache.ibatis.builder.xml.XMLConfigBuilder解析配置XML文件,读取所有配置参数,并将读取的内容装入org.apache.ibatis.session.Configuration类对象中。而Configuration采用的事单例模式,几乎所有的MyBatis配置内容都会存放在这个单例对象中,以便后续将这些内容读出。
- 第二步使用Configuration对象创建SqlSessionFactory,MyBatis中SqlSessionFactory是一个接口,而不是一个实现类,为此MyBatis提供一个默认的实现类org.apache.ibatis.session.defaults.DefaultSqlSessionFactory。在大部分情况下都没有必要自己去创建新的SqlSessionFactory实现类。
映射器的内部组成:
当XMLConfigBuilder解析XML时,会将每一个SQL和其配置的内容保存起来。一般而言,在MyBatis中一条SQL和它相关的配置信息是由3个部分组成阀门分别是MappedStatement、SqlSource和BoundSql。

- MappedStatement:的作用是保存一个映射器节点(select|insert|delete|update)的内容。他是一个类,包括许多我们配置的SQL、SQL的id、缓存信息、resultMap、parameterType、resultType、resultMap、languageDriver等重要配置内容。她还有一个重要的属性sqlSource,MyBatis通过读取它来获取某条SQL配置的所有信息。
- sqlSource:提供BoundSql陪对象的地方,他是MappedStatement的一个属性。它是一个接口。自定义了一个接口方法getBoundSql(parameterObject),使用它可以得到一个BoundSql对象。
- BoundSql:是一个结果对象,对于最终的参数和SQL都反映在BoundSql类对象上。BoundSql有三个主要的属性:parameterMappings、parameterObject和sql
- parameterObject:为参数本身,可以传递简单对象、POJO或者Map
- parameterMappings是一个List,它的每一个元素都是ParameterMapping对象。对象会描述参数,参数包括属性名称、表达式、javaType、jdbcType、typrHandler等重要信息
- sql属性就是书写在映射器里面的一条被SqlSource解析后的SQL
SqlSession运行过程
注:这里的代码作为例子。图为代码运行过程的流程图。

SqlSession处理SQL的过程:通过StatementHandler、ParameterHandler和ResultSetHandler来完成数据库操作和结果的返回。
- Executor:代表执行器,由他来调度其他对象来执行对应的SQL。SqlSession其实是一个门面,真正干活的是执行器,它是一个真正执行Java和数据库交互的对象。
- StatementHandler:作用是使用数据库的Statement(例如PreparedStatement)执行操作,它很重要。
- ParameterHandler:是用来处理SQL参数的。
- ResultSetHandler:是进行数据集(ResultSet)的封装返回处理的。

总结:SqlSession内部运行图如下:

- prepared预编译SQL
- parameterize设置参数
- query/update执行SQL
互联网轻量级框架SSM-查缺补漏第七天(MyBatis的解析和运行原理)的更多相关文章
- 互联网轻量级框架SSM-查缺补漏第八天(MyBatis插件plugin使用及原理)
简言:今天进行第八天的记录(只是写了八天).有的时候看的多,有的时候看的少,看的少的时候就攒几天一起写了.而今天这个插件我昨天写了一下午,下班没写完就回去了,今天把尾收了,再加上一个过程图方便下面原理 ...
- Android查缺补漏(线程篇)-- AsyncTask的使用及原理详细分析
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8515304.html 一.AsyncTask的使用 AsyncTask是一种轻 ...
- Java EE互联网轻量级框架整合开发— SSM框架(中文版带书签)、原书代码
Java EE互联网轻量级框架整合开发 第1部分 入门和技术基础 第1章 认识SSM框架和Redis 2 1.1 Spring框架 2 1.2 MyBatis简介 6 1.3 Spring MVC简介 ...
- 互联网轻量级框架SSM-查缺补漏第六天【级联+延迟加载特辑】
简言:本来这是昨天看的,但是因为想好好写一下[级联]这个东西,所以就看完之后今天来整理一下. 级联 1. 什么是级联 级联是一个数据库实体的概念.比如教师就需要存在学生与之对应,这样就有教师学生表,一 ...
- 互联网轻量级框架SSM-查缺补漏第一天
简言:工欲其事必先利其器,作为一个大四的准毕业生,在实习期准备抽空补一下基础.SSM框架作为互联网的主流框架,在会使用的基础上还要了解其原理,我觉得会对未来的职场会有帮助的.我特意的买了一本<J ...
- Android查缺补漏(View篇)--自定义View利器Canvas和Paint详解
上篇文章介绍了自定义View的创建流程,从宏观上给出了一个自定义View的创建步骤,本篇是上一篇文章的延续,介绍了自定义View中两个必不可少的工具Canvas和Paint,从细节上更进一步的讲解自定 ...
- Android查缺补漏(IPC篇)-- Bundle、文件共享、ContentProvider、Messenger四种进程间通讯介绍
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8387752.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- Android查缺补漏(IPC篇)-- 款进程通讯之AIDL详解
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
- Android查缺补漏(IPC篇)-- 进程间通讯之AIDL详解
本文作者:CodingBlock 文章链接:http://www.cnblogs.com/codingblock/p/8436529.html 进程间通讯篇系列文章目录: Android查缺补漏(IP ...
随机推荐
- jquery源码解析:代码结构分析
本系列是针对jquery2.0.3版本进行的讲解.此版本不支持IE8及以下版本. (function(){ (21, 94) 定义了一些变量和函数, jQuery = function() ...
- UIViewController读书笔记
当一个VC把另一个VC作为子view加到自己的view时,一定要先调用addChildViewController(_:)方法. 因为一个VC的root view,也就是VC的view只能被这个VC持 ...
- 通过Nginx部署Django
Django的部署可以有很多方式,采用nginx+uwsgi的方式是其中比较常见的一种方式. 在这种方式中,我们的通常做法是,将nginx作为服务器最前端,它将接收WEB的所有请求,统一管理请求.ng ...
- jmxtrans 监控kafka
jmxtrans 的版本必须 是jmxtrans-268.rpm 以上 如果kafka 为kafka_2.11-0.10.1.0 ,则在 jdk 1.7上使用 kafka_2.12-0.11.0.0 ...
- [spring] spring 装配Bean
Bean的配置信息是Bean的元数据信息.包括1.Bean的实现类.2.Bean的属性信息.3.Bean的依赖关系.4.Bean的行为配置(比如控制Bean的生命周期中init,destory方法). ...
- MVC 提交List 集合 注意对应的参数名称
public void AddMovieInfos(List<MoviesInfo> movies) { foreach (var item in movies) { dal.Add(it ...
- 海思hi35xx 开发学习(3):视频输入
视频输入(VI)模块实现的功能:通过 MIPI Rx(含 MIPI 接口.LVDS 接口和 HISPI 接口),SLVS-EC,BT.1120,BT.656,BT.601,DC 等接口接收视频数据.V ...
- C#只启动一个进程的代码
把写内容过程中经常用到的内容做个收藏,如下的内容是关于C#只启动一个进程的内容.public partial class App : Application { protected override ...
- linux curl post/put请求
案列: -X: 请求方式 --header: 请求header -d: 请求的数据 最后跟上请求的地址 curl -X PUT --header 'Content-Type: application/ ...
- php session的简单使用
创建session: session_start(); $_SESSION['name'] = $value; 获取session: session_start(); echo $_SESSION[' ...