1.源码分析Mybatis 底底层MapperProxy初始化【文并茂】
2.为什么 MyBatis 源码中,没有我那种 if···else
3.MyBatis源码之MyBatis中SQL语句执行过程
4.[Mybatis]-[基础支持层]-插件-plugin标签解析
5.三万字带你彻底吃透MyBatis源码!层源!原理
源码分析Mybatis 底底层MapperProxy初始化【文并茂】
源码分析Mybatis MapperProxy初始化,本文基于Mybatis.3.x版本,层源展现作者阅读源码技巧。原理html js css 源码MapperScannerConfigurer作为Spring整合Mybatis的底底层核心类,负责扫描项目中Dao类,层源并创建Mybatis的原理Maper对象即MapperProxy对象。
在项目配置文件中,底底层关注到与Mapper相关的层源配置信息。源码分析的原理行文思路如下,可能会比较枯燥,底底层但先给出MapperProxy的层源创建序列图,有助于理解。原理
MapperScannerConfigurer类图,实现Spring Bean生命周期相关功能。核心类及其作用简述如下:
BeanDefinitionRegistryPostProcessor负责设置SqlSessionFactory,生成的Mapper最终受该SqlSessionFactory管辖。
ClassPathMapperScanner的scan方法进行扫描动作,具体实现由ClassPathBeanDefinitionScanner的doScan方法和ClassPathMapperScanner的内部方法共同完成。
ClassPathMapperScanner#doScan方法首先调用父类方法,接着配置文件并构建对应的BeanDefinitionHolder对象。对这些BeanDefinitions进行处理,对Bean进行加工,同学要窝源码加入Mybatis特性。
MapperFactoryBean作为创建Mapper的FactoryBean对象,其beanClass为MapperFactoryBean,初始化实例为MapperFactoryBean。在实例化时自动获取SqlSessionFactory或SqlSessionTemplate,用于创建具体的Mapper实例。
MapperFactoryBean的checkDaoConfig方法实现Mapper与Mapper.xml文件的关联注册。MapperRegistry负责管理注册的Mapper,核心类图展示了其关键属性和方法。
MapperRegistry#addMapper方法完成MapperProxy的注册,但实际的MapperProxy创建在getMapper方法中,根据接口获取MapperProxyFactory,调用newInstance创建MapperProxy对象。
至此,Mybatis Mapper的初始化构造过程完成一半,即MapperScannerConfigurer通过包扫描,构建MapperProxy。剩余部分,即MapperProxy与*.Mapper.xml文件中SQL语句的关联流程,将在下一篇文章中详细说明。通过MapperProxy对象的创建,为后续SQL执行流程做准备。
更多文章请关注:线报酱
为什么 MyBatis 源码中,没有我那种 if···else
在 MyBatis 源码追溯无积分源码中,设计模式的巧妙使用是整个框架的精华,共有约种模式,包括创建型、结构型和行为型模式。
创建型模式包括工厂模式、单例模式和建造者模式。工厂模式用于创建 SqlSessionFactory,单例模式确保 Configuration 的唯一实例,建造者模式将 XML 文件解析到对象中。
结构型模式有适配器模式、代理模式、组合模式和装饰器模式。适配器模式使接口不兼容的对象可以协作,代理模式提供 DAO 接口的实现,组合模式用于 SQL 标签组合,装饰器模式允许在不修改结构的情况下增加行为。
行为型模式包括模板模式、策略模式和迭代器模式。模板模式定义算法框架,策略模式允许算法的替换,迭代器模式遍历集合元素。
总结,MyBatis 源码运用设计模式解决复杂问题,合理切割子问题,紫可可源码下载学习这些方案技术能提高对设计和实现的理解,扩展编码思维,积累经验,成为优秀工程师和架构师。
MyBatis源码之MyBatis中SQL语句执行过程
MyBatis源码之MyBatis中SQL语句执行过程
MyBatis编程时主要有两种方式执行SQL语句。
方式一,通过SqlSession接口的selectList方法调用,进入DefaultSqlSession的实现,最终调用executor的query方法,使用MappedStatement封装SQL语句。
方式二,调用SqlSession接口的getMapper(Class type)方法,通过工厂创建接口的代理对象,调用MapperProxy的invoke方法,进一步执行MappedStatement,调用sqlSession的方法。
创建动态代理类会执行MapperProxy类中的invoke方法,判断方法是否是Object的方法,如果是直接调用,否则执行cachedInvoker()方法,获取缓存中的MapperMethodInvoker,如果没有则创建一个,内部封装了MethodHandler。当cacheInvoker返回了PalinMethodInvoker实例后,精品商城网站源码调用其invoke方法,执行execute()方法,调用sqlSession的方法。
查询SQL执行流程:调用关系明确,主要步骤包括调用关系。
增删改SQL执行流程:主要步骤清晰,最后执行的都是update方法,因为insert、update、delete都对数据库数据进行改变。执行流程为:
具体的执行流程图如下所示。
[Mybatis]-[基础支持层]-插件-plugin标签解析
该系列文章针对 Mybatis 3.5.1 版本
一、Mybatis 插件的作用
Mybatis 针对SQL映射语句执行过程进行拦截处理,而对应的拦截器 Mybaits 又称之为插件(这些插件就是Mybatis的扩展点)。
在 Mybaits 中允许用插件来拦截的方法包括:
通过插件的方式可以实现SQL打印、分页等插件功能实现。
二、Mybatis 插件配置
插件代码逻辑实现后还需要加载到 Mybatis 中才能生效,Mybatis 提供了配置标签,用来声明。
插件在mybatis-config.xml 中的配置案例,如下:
通过 标签,然后在指定的属性 interceptor 配置插件实现类的全路径即可。
三、`plugin` 标签解析
再来回顾一下,XMLConfigBuilder解析时序简图,如下:
在时序图中加载解析在XMLConfigBuilder#pluginElement中完成,相关解析代码如下:
如上述代码,`plugin` 的解析流程很简单
1、加载 `plugin` 下的子标签
2、获取 `plugin` 中 interceptor 属性中的 class 全路径名
3、class 必须实现了 Interceptor接口,如果满足,通过反射实例化类
4、把类加载到存放拦截器的拦截器容器,拦截器链 InterceptorChain
简单来看一下InterceptorChain 代码定义
如上述代码所示,InterceptorChain 本身就是一个容器,用来存放所有从 `plugin` 读取到的拦截器对象。
而这里的拦截器列表,在使用过程中,会通过代理的方式,对目标对象层层代理,通过责任链的方式实现代码执行前后的层层过滤,相关逻辑图如下:
四、interceptor 过滤链代理处理代码
上面提到了 interceptor 过滤链的实现是通过代理的方式层层包裹实现的,下面来简单阅读代理流程源码
Mybatis 中只针对 Executor、ParameterHandler、ResultSetHandler、StatementHandler,这四种情况追加了过滤连的处理。
相关的处理方法入口为InterceptorChain#pluginAll,如下图
如上述代码,遍历所有的插件,调用插件本身的 plugin 方法来处理,也就是 Interceptor#plugin,来看通用实现
(也可以自定义实现逻辑),代码如下
如上述代码,通用的代理逻辑交由工具类 Plugin 来实现,
接着来看一下 Plugin#wrap 方法源码
如上述源码所示,通过配对当前 interceptor 是否符合目标对象 target ,如果配对,构建相应的代理对象。
以此类推,随后实现如下图的效果:
五、总结
通过上述源码解析能够知道一个插件,也就是一个 Interceptor 的定义需要满足两个条件
1、该插件实现类实现了 Interceptor 接口
2、该插件实现类通过注解 @Intercepts 指定了该插件需要拦截的对象,也就是 Executor、ParameterHandler、ResultSetHandler、StatementHandler 中的一种或者多种
`plugin` 标签中配置的是一系列拦截器,这些拦截器通过代理的方式组合起来实现了过滤器链。
而这些过滤器数据存储在 InterceptorChain 中,最终数据仍然会存在 Configuration 中,相关的 Configuration 逻辑图如下:
三万字带你彻底吃透MyBatis源码!!
随着互联网的迅猛发展,MyBatis逐渐成为了Java开发者不可或缺的框架技术。许多大厂在面试中偏好问及MyBatis的底层原理及源码实现,这表明了其在技术栈中的重要性。本文旨在全面解析MyBatis源码,帮助开发者深入理解这一强大的框架。为了方便学习,推荐大家先收藏后仔细研读。
MyBatis源码在封装了JDBC之后,实现了对数据库操作的高级抽象。无论是获取连接、预编译语句、参数封装还是执行SQL,其核心步骤并未改变。
解析过程始于通过`ClassLoader.getResourceAsStream`方法获取配置文件路径。这个过程确保了MyBatis能正确加载配置信息,进而解析XML文件,构建配置中心。
解析XML文件的关键在于`parseConfiguration`和`mapperParser.parse`方法。前者用于解析配置文件中的`Environment`、`Setting`等信息,后者则专注于解析Mapper映射器,将其与工厂类进行绑定。
构建`SqlSessionFactory`的过程涉及解析Mapper映射器,生成`MappedStatement`对象,以及将接口类型与工厂类绑定。最终,`DefaultSqlSessionFactory`被创建,用于管理会话生命周期。
会话的创建通过`openSession`方法完成,该方法实例化了`Executor`来执行SQL。`Executor`的配置则决定了事务管理和执行器类型。同时,`Transaction`的管理分为两种方式,以确保数据的一致性和完整性。
获取Mapper对象时,通过`mapperRegistry.getMapper`方法,该方法从`MapperRegistry`的`knownMappers`中获取接口类型和对应的工厂类。代理对象`MapperProxy`由JDK动态代理生成,用于执行实际的数据库操作。
执行SQL时,调用代理对象的`invoke`方法,进而调用`execute`方法。无论是查询还是其他操作,均遵循此流程。在查询场景下,`selectOne`与`selectList`功能实现相同,仅在参数处理上有所差异。
`MappedStatement`对象负责存储SQL信息,包括执行策略、参数类型等。`CacheKey`的生成则基于`BoundSql`内容,用于缓存结果,提高效率。
通过以上解析,我们可以看到MyBatis源码的简洁与高效。深入理解其结构与机制,不仅有助于提高开发效率,还能增强对数据库操作的理解。总的来说,MyBatis的源码并不复杂,只需耐心研读,两三天内即可掌握其核心。
2024-11-29 20:411171人浏览
2024-11-29 20:211473人浏览
2024-11-29 20:212539人浏览
2024-11-29 19:181323人浏览
2024-11-29 18:48830人浏览
2024-11-29 18:392691人浏览
1.我要o泡病毒链接如何获得?2.病毒是什么原理3.头像贩子是什么意思?4.这是什么病毒啊?我要o泡病毒链接如何获得? 不建议你这样做,无论是自己点开链接也好,恶搞别人也好,这个病毒是非常,难受的
1.拼拼多多一站式店铺管理工作台怎么切换账号?2.如何退出拼多多商家工作台登录?怎样安装工作台?3.拼多多商家工作台怎么切换账号?具体流程介绍4.拼多多商家工作台无法操作拼拼多多一站式店铺管理工作台怎
1.快手极速版如何关闭视频挂件2.快手极速版挂机是什么意思3.快手红包挂件怎么开启4.快手极速版多开自动脚本谁用过?哪里下载快手极速版如何关闭视频挂件 在使用快手极速版观看短视频的时候,在视频界面