Mybatis的解析和运行原理
Mybatis的解析和运行原理
Mybatis的运行过程大致分为两大步:第一步,读取配置文件缓存到Configuration对象,用以创建 SqlSessionFactory;第二步,SqlSession的执行过程。其中第一步中, SqlSessionFactory的创建过程比较简单,第二步中, SqlSession的执行过程较为复杂,其底层需要用到反射技术和动态代理的知识。
1. 构建 SqlSessionFactory过程
SqlSessionFactory是Mybatis的核心类之一,其重要的功能是提供创建Mybatis的核心接口 SqlSession,所以要先创建 SqlSessionFactory,在Mybatis中,它采用了 Builder的模式去创建 SqlSessionFactory,在实际中可以通过 SqlSessionFactoryBuilder 去构建,其构建分为两步:
第1步:通过org.apache.ibatis.builder.xml.XMLConfiguration解析配置的XML 文件,读出所配置的参数,并将读取的内容存入到org.apache.ibatis.session.Configuration类对象中。而Configuration对象采用的是单例模式,几乎所有的Mybatis配置内容都会存放在这个单例对象中,以便后续将这些内容读出。
第2步:使用Configuration对象去创建SqlSessionFactory,Mybatis中的SqlSessionFactory是一个接口,而不是一个实现类,为此Mybatis提供了一个默认的实现类org.apache.ibatis.session.defaults.DefaultSqlSessionFactory。在大部分情况下都没必要自己去创建新的SqlSessionFactory实现类。
这种创建方式就是一种Builder模式,对于复杂的对象而言,使用构造参数很难实现,这时使用一个类(比如Configuration)作为统领,一步步构建所需的内容,然后通过他去创建最终的对象(比如SqlSessionFactory),这样比较清晰,思路值得我们去学习和参考。
1.1 构建Configuration
在SqlSessionFactory构建中,configuration是最重要的,它的作用是:
①读入配置文件,包括基础配置的XML和映射器XML(或注解)。
②初始化一些基础配置,比如Mybatis的别名等,一些重要的类对象(比如插件、映射器、Object工厂、typeHandlers对象等)。
③提供单例,为后续创建SessionFactory服务,提供配置的参数。
④执行一些重要对象的初始化方法。
Configuration是通过XMLConfigurationBuilder去构建的,首先它会读出所有XML配置的信息,然后把他们解析并保存在Configuration单例中。它会对如下内容进行初始化:全局参数、别名、插件、对象工厂、对象包装工厂、反射工厂、环境设置、数据库环境、数据库标识、类型转换器和映射器等等。
1.2 构建映射器的内部组成
当XMLConfigBuilder解析XML时,会将每一个SQL和其配置的内容保存起来。一般而言,在Mybatis中一条SQL和它配置信息主要由3个部分组成,分别是MappedStatement、SqlSource和BoundSql
①MappedStatement的作用是保存一个映射器节点的内容,它是一个类,包括配置的SQL、SQL中的id、缓存信息、resultType、resultMap等配置内容,它还有一个重要的属性sqlSource。
②SqlSource是提供BoundSql的地方,它是MappedStatement的一个属性,它的作用是根据上下文和参数解析生成需要的SQL。
③BoundSql是一个结果对象,也就是SqlSource通过对SQL和参数的联合解析得到的SQL和参数。
1.3 构建SqlSessionFactory
SqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
Mybatis会根据文件流先生成Configuration对象,进而构建SqlSessionFactory对象。
2.SqlSession运行过程
2.1映射器(Mapper)的动态代理
在程序的编写过程中,我们经常写这样的代码:
RoleMapper roleMapper = sqlSession.getMapper(RoleMapper.class);
通过看Mybatis的源码可以得知,它是运用了configuration对象的getMapper方法,来获取对应的接口的对象的,其底层又运用了映射器的注册器MapperRegistry来获取对应的接口对象,首先它判断是否注册一个Mapper,如果没有则会抛出异常信息,如果有,就会启用MapperProxyfactory工厂来生成一个代理实例。Mapper映射是通过动态代理来实现的,这里可以看到动态代理对接口的绑定,它的作用是生成动态代理对象(占位),而代理的方法则是放到了MapperProxy类中。在看MapperProxy的源码,可以发现invoke的方法逻辑。如果Mapper是一个JDK动态代理对象,那么它就会运行到invoke方法里面。invoke首先判断是否是一个类,这里mapper是一个接口不是类,所以判定失败,然后生成MapperMethod对象,它是通过cachedMapperMethod方法对其初始化。最后执行execute方法,把sqlSession和当前运行的参数传递进去。
通过分析源码我们可以得知,Mybatis为什么只用Mapper接口就能运行了,因为mapper的XML文件的命名空间对应的是这个接口的全限定名,而方法就是那条SQL的id,这样Mybatis就可以根据全路径和方法名,将其和代理对象绑定起来。通过动态代理技术,让这个接口运行其阿里,后面采用命令模式。最后使用SqlSession接口的方法是的它能够执行对应的SQL,只有有了这层封装,就可以采用接口编程。
2.2 SqlSession的四大对象
①Executor代表执行器,由它调度StatementHandler、ParameterHandler、ResultSetHandler等来执行对应的SQL,其中StatementHandler是最重要的。
②StatementHandler的作用是使用数据库的Statement执行操作,它是四大对象的核心,起到承上启下的作用,许多重要的插件都是通过拦截它来实现的。
③ParameterHandler是用来处理SQL参数的。
④ResultSetHandler是进行数据集的封装返回处理的。
Mybatis的解析和运行原理的更多相关文章
- 互联网轻量级框架SSM-查缺补漏第七天(MyBatis的解析和运行原理)
第七章MyBatis的解析和运行原理 SqlSessionFactory是MyBatis的核心类之一,其最重要的功能就是提供创建MyBatis的核心借口SqlSession,所以要先创建SqlSess ...
- 《深入浅出MyBatis技术原理与实战》——6. MyBatis的解析和运行原理
MyBatis的运行分为两大部分,第一部分是读取配置文件缓存到Configuration对象,用以创建SqlSessionFactory,第二部分是SqlSession的执行过程. 6.1 涉及的技术 ...
- .NET/ASP.NET MVC Controller 控制器(深入解析控制器运行原理)
阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...
- 二、ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)
阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...
- NET/ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)
阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...
- 试解析Tomcat运行原理(一)--- socket通讯
关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...
- 试解析Tomcat运行原理(一)--- socket通讯(转)
关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...
- mybatis运行原理
mybatis运行原理 运行过程中涉及到的类或者接口 Resources(c) :用于加载mybatis核心配置文件 XMLConfigBuilder(c) :用于解析xml文件(核心配置文件) Co ...
- MyBatis实战之解析与运行
本次所谈的原理仅仅只涉及基本的框架和核心代码,并不会全部都说到,比如关于MyBatis是如何解析XML文件和其他配置文件从而的到内容,还有就是JDBC如何使用,关于JDBC如何使用,可以参考我的这篇博 ...
随机推荐
- drf token刷新配置、认证组件(使用)、权限组件(使用)、频率组件(使用)、异常组件(使用)
目录 一.特殊路由映射的请求 二.token刷新机制配置(了解) 三.认证组件项目使用:多方式登录 1.urls.py 路由 2.views.py 视图 3.serializers.py 序列化 4. ...
- 2000_wideband extension of telephone speech using a hidden Markov model
论文地址:基于隐马尔科夫模型的电话语音频带扩展 博客作者:凌逆战 博客地址:https://www.cnblogs.com/LXP-Never/p/12151866.html 摘要 本文提出了一种从l ...
- MySQL中的幻读,你真的理解吗?
昨天接到阿里的电话面试,对方问了一个在MySQL当中,什么是幻读.当时一脸懵逼,凭着印象和对方胡扯了几句.面试结束后,赶紧去查资料,才发现之前对幻读的理解完全错误.下面,我们就聊聊幻读. 要说幻读,就 ...
- PyQt5官方教程+帮助文档+模块功能汇总
写在开头 笔者自学PyQt5的过程中,在网上发现了不少友好的新手入门教程,比如: Archi的博客 PyQt5图形界面编程 但是学习PyQt5的最好方法是阅读官方文档 + 自己动手实践,笔者将分享官网 ...
- 关于OFFICE 文件在线编辑dsoframer
下载dsoframer.ocx 系统为32位时:拷贝 dsoframer.ocx 到c:\windows\system32\dsoframer.ocx打开cmd命令行注册 regsvr32.exe ...
- Android Studio 学习笔记(四):Adapter和RecyclerView说明
在现版本中,滚动控件有多种,而相比于ListView,GridView,RecyclerView的用途更广,因此将前两者作为Adapter适配器的引入,再对RecyclerView进行简单讲解. MV ...
- 12-Factor与云原生Part2
12-Factor与云原生Part2 12-Factor 为构建如下的 SaaS 应用提供了方法论: 使用声明式格式来搭建自动化,从而使新的开发者花费最少的学习成本加入这个项目 和底层操作系统保持简洁 ...
- 展讯平台uboot启动流程
启动流程 1. Stage1 start.S代码结构 u-boot的stage1代码通常放在start.S文件中,用汇编语言,主要实现功能如下: (1) 定义入口: 该工作通过修改连接器脚本来完成. ...
- jQuery---小火箭返回顶部案例
小火箭返回顶部案例 1. 滚动页面,当页面距离顶部超出1000px,显示小火箭. 封装在scroll函数里,当前页面距离顶部为$(window).scrollTop >=1000 小火箭显示和隐 ...
- AI数据标注行业面临的5大发展困局丨曼孚科技
根据艾瑞咨询发布的行业白皮书显示,2018年中国人工智能基础数据服务市场规模为25.86亿元,预计2025年市场规模将突破113亿元,行业年复合增长率达到了23.5%. 作为人工智能产业的基石,数据 ...