Mybatis的实现原理
在spring启动的时候,spring会根据我们配置的有关mapper.xml的路径加载此路径下的xml文件,得到一个List<Resource>的集合,然后将这个集合转化成Resource[]数组赋值到SqlSessionFactoryBean中的mapperLocations(其实也是一个Resource[])
带目前位置这些mapper的配置文件就被维护到一个SqlSessionFactoryBean中了,然后调用SqlSessionFactoryBean的getObject()方法通过buildSqlSessionFactory()方法创建一个SqlSessionFactoryBean实例,在调用buildSqlSessionFactory的时候,会创建一个XMLConfigBuilder对象然后获取一个configuration类型的对象,这个对象很关键,后面会用到,接着会对mapperLocations进行循环,然后使用XMLMapperBuilder对每个mapperLocations的流解析成document对象,接着会调用XMLMapperBuilder的parse()方法解析对document对象的每个结点并生成对象,当然在解些此resource的时候会判断configuration对象中是否已经有此resource,如果有就不解析如果没有才会解析,并将解析完的各个子结点放入到configuration中,其实就是放到不同的map集合中,而我们常见的insert,update等结点,会被维护到一个Map<String, MappedStatement> mappedStatements的map中,key就是namespace加上标签的id(例如:com.org.userMapper.selectOne之所以这样做是为了保证key的唯一性),value中存的MappedStatement对象其实就是对sql标签解析的结果,到这里mapper.xml就解析完成了,然后会将configuration作为参数通过DefaultSqlSessionFactory来创建一个sqlsessionFactory的实例对象,而对于解析失败的会进行循环处理处理,最后是通过namaspace维护到一个configuration中的一个类型为MapperRegistry对象中,而mapperRegistry
会调用addmapper方法把这个mapper维护到一个Map<Class<?>, MapperProxyFactory<?>> knownMappers = new HashMap()中,这个knownMappers 非常重要,他会在我们对接口进行调用的时候通过动态代理获取mapper接口实例,找到我们要找到的sql,当然在找到mapper实例之后还要经过一系列的参数处理器,sql处理器,然后选择合适的执行器,最后执行器将结果交给执行结果处理器处理返回给sqlsession。
动态代理的过程
通过接口的calss文件类型从knownMappers中获取一个mapper的代理工厂,在MapperProxyFactory代理工厂同调用newInstance()方法通过sqlsession实例和接口类型还有methodCach获取MapperProxy实例,然后再通过jdk动态代理来生成我们想要代理类
Mybatis的实现原理的更多相关文章
- Mybatis接口编程原理分析(三)
前面两篇博客Mybatis接口编程原理分析(一)和Mybatis接口编程原理分析(二)我们介绍了MapperProxyFactory.MapperProxy和MapperMethod的操作及源码分析, ...
- Mybatis接口编程原理分析(二)
在上一篇博客中 Mybatis接口编程原理分析(一)中我们介绍了MapperProxyFactory和MapperProxy,接下来我们要介绍的是MapperMethod MapperMethod:它 ...
- 深入理解Mybatis技术与原理
目录 第1章 Mybatis简介 1.1 传统的JDBC编程 1.2 ORM模型 1.4 MyBatis 1.5 什么时候用MyBatis 第2章 MyBatis入门 2.2 MyBatis构成 2. ...
- mybatis(一、原理,一对多,多对一查询)
MyBatis框架及原理分析 MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 ...
- Mybatis之工作原理
1.Mybatis的架构 1.1 Mybatis的框架分层 1.2 MyBatis的实现原理 mybatis底层还是采用原生jdbc来对数据库进行操作的,它支持定制化 SQL.存储过程以及高级映射的优 ...
- mybatis 插件的原理-责任链和动态代理的体现
目录 1 拦截哪些方法 2 如何代理 3 代理对象 4 责任链设计模式 @ 如果没有自定义过拦截器, 可以看我前面的文章.如果不知道 JDK 动态代理怎么使用的, 可以看我这文章. 责任链设计模式理解 ...
- Mybatis简介与原理
经常面试别人或者被面试,对Mybatis简介与原理这个问题的回答千差万别,为了更好的服务与以后,来个原理介绍. 什么是Mybatis MyBatis 本是apache的一个开源项目iBatis, 20 ...
- MyBatis整合Spring原理分析
目录 MyBatis整合Spring原理分析 MapperScan的秘密 简单总结 假如不结合Spring框架,我们使用MyBatis时的一个典型使用方式如下: public class UserDa ...
- 深入详解Mybatis的架构原理与6大核心流程
MyBatis 是 Java 生态中非常著名的一款 ORM 框架,目前在一线互联网大厂中应用广泛,Mybatis已经成为了一个必会框架. 如果你想要进入一线大厂,能够熟练使用 MyBatis 开发已经 ...
- MyBatis框架及原理分析
MyBatis 是支持定制化 SQL.存储过程以及高级映射的优秀的持久层框架,其主要就完成2件事情: 封装JDBC操作 利用反射打通Java类与SQL语句之间的相互转换 MyBatis的主要设计目的就 ...
随机推荐
- kafka笔记博客
大数据数据流组件选择: https://www.cnblogs.com/yinzhengjie/articles/11155051.html 初识Apache Kafka 核心概念: https:// ...
- zz SOLID (面向对象设计)
SOLID (面向对象设计) 维基百科,自由的百科全书 跳到导航 跳到搜索 在程序设计领域, SOLID(单一功能.开闭原则.里氏替换.接口隔离以及依赖反转)是由罗伯特·C·马丁在21世纪早期[1] ...
- php 判断图片文件的真实类型
/** * * 检测文件的真实类型 * * @param string $srcPath 文件路径 * * @return string $realType 文件真实类型 * */ $imgurl = ...
- [原][工具][global mapper]查看图元属性(查看shp文件属性值)
常用的shp文件需要查看其内部字段 目前常用的有三种方法: 1.使用excel打开dbf文件,直接查看shp数据库文本文件 2.使用global mapper查看shp图元,然后通过内部工具查看“图元 ...
- grib2文件格式说明
GRIB是一种二进制编码的名称,用于加工资料的传输和交换,GRIB编码的分析或预报产品是由一系列八位组构成的连续比特流组成.在GRIB2中编码资料主要分为9段. 0段——指示段八位组序号 ...
- 深入理解JVM+G1+GC.pdf (中文版带书签)
目录 序 VII前言 IX 第1章 JVM & GC基础知识 11.1 引言 21.2 基本术语 31.2.1 Java相关术语 41.2.2 JVM/GC通用术语 241.2.3 G1涉及术 ...
- 报错:Connection to node -1 could not be established. Broker may not be available. (org.apache.kafka.clients.NetworkClient)
报错背景: 启动kafka消费者之后出现这种报错,持续打印相同信息. 报错现象: [root@master kafka_2.-]# /opt/kafka/kafka_2.-/bin/kafka-con ...
- spring 装配bean的混合使用
在现实中,使用XML或者注解各有道理,建议在自己的工程中所开发的类尽量使用注解方式,因为使用它并不困难,甚至可以说更为简单,而对于引入第三方包或者服务的类,尽量使用XML方式,这样的好处是可以尽量对三 ...
- Selenium WebDriver原理
WebDriver原理 WebDriver是按照Server-Client的经典设计模式设计的. Server端就是RemoteServer,可以是任意的浏览器,当我们的脚本启动浏览器后,该浏览器就是 ...
- 机器学习之径向基神经网络(RBF NN)
本文基于台大机器学习技法系列课程进行的笔记总结. 主要内容如下图所示: 首先介绍一下径向基函数网络的Hypothesis和网络的结构,然后介绍径向基神经网络学习算法,以及利用K-means进行的学习, ...