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的解析和运行原理的更多相关文章

  1. 互联网轻量级框架SSM-查缺补漏第七天(MyBatis的解析和运行原理)

    第七章MyBatis的解析和运行原理 SqlSessionFactory是MyBatis的核心类之一,其最重要的功能就是提供创建MyBatis的核心借口SqlSession,所以要先创建SqlSess ...

  2. 《深入浅出MyBatis技术原理与实战》——6. MyBatis的解析和运行原理

    MyBatis的运行分为两大部分,第一部分是读取配置文件缓存到Configuration对象,用以创建SqlSessionFactory,第二部分是SqlSession的执行过程. 6.1 涉及的技术 ...

  3. .NET/ASP.NET MVC Controller 控制器(深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

  4. 二、ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

  5. NET/ASP.NET MVC Controller 控制器(一:深入解析控制器运行原理)

    阅读目录: 1.开篇介绍 2.ASP.NETMVC Controller 控制器的入口(Controller的执行流程) 3.ASP.NETMVC Controller 控制器的入口(Controll ...

  6. 试解析Tomcat运行原理(一)--- socket通讯

    关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...

  7. 试解析Tomcat运行原理(一)--- socket通讯(转)

    关于这篇文章也确实筹划了很久,今天决定开篇写第一篇,说起tomcat首先很容易联想到IIS,因为我最开始使用的就是.net技术,我第一次使用asp写学生成绩管理系统后,很茫然如何让别人都能看到或者说使 ...

  8. mybatis运行原理

    mybatis运行原理 运行过程中涉及到的类或者接口 Resources(c) :用于加载mybatis核心配置文件 XMLConfigBuilder(c) :用于解析xml文件(核心配置文件) Co ...

  9. MyBatis实战之解析与运行

    本次所谈的原理仅仅只涉及基本的框架和核心代码,并不会全部都说到,比如关于MyBatis是如何解析XML文件和其他配置文件从而的到内容,还有就是JDBC如何使用,关于JDBC如何使用,可以参考我的这篇博 ...

随机推荐

  1. Maven项目的目录问题

    创建maven项目,使不使用骨架都行. java项目的目录 src/main  项目 java存放.java文件,resources存放静态资源.配置文件.映射文件. 静态资源一般在resources ...

  2. 升级了NinjaLoveFish Excel量化表格

    为了方便查看均价和止盈值,新建了两列 这样做的好处就是,针对一个股票,可以实现不同的多个网格布局,然后分别实现各自的盈利设定. 例如这是网格1 那么同时也可以存在网格2 就可以实现多个网格布局到一个股 ...

  3. VUE中使用XLSX实现导出excel表格

    简介 项目中经常会用导出数据的场景,这里介绍 VUE 中如何使用插件 xlsx 导出数据 安装 ## 1.使用 npm 或 yarn 安装依赖(三个依赖) npm install -S file-sa ...

  4. 【python数据挖掘】爬取豆瓣影评数据

    概述: 爬取豆瓣影评数据步骤: 1.获取网页请求 2.解析获取的网页 3.提速数据 4.保存文件 源代码: # 1.导入需要的库 import urllib.request from bs4 impo ...

  5. H5Demo_password_generator

    原项目资源地址: https://www.html5tricks.com/js-passwd-generator.html codepen地址: https://codepen.io/deuscx/p ...

  6. 后端跨域的N种方法

    简单来说,CORS是一种访问机制,英文全称是Cross-Origin Resource Sharing,即我们常说的跨域资源共享,通过在服务器端设置响应头,把发起跨域的原始域名添加到Access-Co ...

  7. window10 cmd 常见命令

    AT 计划在计算机上运行的命令和程序. ATTRIB 显示或更改文件属性. BREAK 设置或清除扩展式 CTRL+C 检查. CACLS 显示或修改文件的访问控制列表(ACLs). CALL 从另一 ...

  8. OpenCV学习记录(C++版本)

    HighGUI组件 图像的载入:imread()函数 Mat imread(const string& filename, int flag = 1)其中flag=1代表读入RGB彩色图像,- ...

  9. 使用Python库paramiko登录远程设备

    前言 手动下载paramiko库的安装包.在PyPi库中查找即可,但是不到是我的电脑问题还是网络问题,2.0.0以上版本我都安装不了,因此我自己是安装的paramiko 1.17.0版本,此版本经过测 ...

  10. c++并发编程之进程创建(给那些想知道细节的人)

    关于多进程创建,此处只讲解一个函数fork(). 1.进程创建 先上代码: #include"iostream" #include<unistd.h> //unix标准 ...