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的主要设计目的就 ...
随机推荐
- PHPStorm提示:phpdoc comment doesn't contain all necessary @throw tag(s)
选择Settings => Editor => Inspection, 选择PHP => PHPDoc => Missing @throws tag(s) ,把后面的勾勾去掉就 ...
- Docs-.NET-C#-指南-语言参考-关键字-值类型:enum
ylbtech-Docs-.NET-C#-指南-语言参考-关键字-值类型:enum 1.返回顶部 1. enum(C# 参考) 2015/07/20 enum 关键字用于声明枚举,一种包含一组被称为枚 ...
- IDEA优化配置,提高启动和运行速度
IDEA优化配置,提高启动和运行速度 参考链接:https://blog.csdn.net/riju4713/article/details/83217013,http://www.pc0359. ...
- Flutter响应式编程 - Stream
1.前言 在Dart库中,有两种实现异步编程的方式(Future和Stream),使用它们只需要在代码中引入dart:async即可. 本文主要介绍Stream的相关概念及利用其异步特性来实现简单的响 ...
- setInterval调用ajax回调函数不执行的问题
setInterval调用ajax回调函数不执行 1.首先检查你的setInterval()函数写法是否正确 参考写法 // 检查是否支付成功 var isPayRequest=false; var ...
- 报错:Error starting Jetty. JSON Metrics may not be available.java.net.BindException:地址已在使用
报错背景: 刚在CDH中集成Flume插件,启动报错 报错现象: Error starting Jetty. JSON Metrics may not be available. java.net.B ...
- SQL Server判断对象是否存在
1 判断数据库是否存在 if exists (select * from sys.databases where name = ’数据库名’) drop database [数据库名] if exis ...
- echars 3.0 去掉柱状图阴影用什么属性
原图展示: 效果图展示: 在代码中注释掉这段 // tooltip : { // trigger: 'axis', // axisPointer : { // 坐标轴指示器,坐标轴触发有效 // ty ...
- C# Hook原理及EasyHook
C# Hook原理及EasyHook简易教程 前言 在说C# Hook之前,我们先来说说什么是Hook技术.相信大家都接触过外挂,不管是修改游戏客户端的也好,盗取密码的也罢,它们都是如何实现的呢? 实 ...
- idea设置项目【非springboot项目】热部署
1.首先打开Edit Configurations 或者 2.添加的项目一定是war: exploded,而不是war 3.server这边,On 'Update' action选Redeploy,O ...