6)Mybatis启动流程

news2025/2/23 20:29:32

1. 首先Mybatis会加载配置文件mybatis-config.xml, 主要实现在Mybatis的builder模块,包路径org.apache.ibatis.builder,解析入口XMLConfigBuilder

  

  private void settingsElement(Properties props) {
    configuration.setAutoMappingBehavior(AutoMappingBehavior.valueOf(props.getProperty("autoMappingBehavior", "PARTIAL")));
    configuration.setAutoMappingUnknownColumnBehavior(AutoMappingUnknownColumnBehavior.valueOf(props.getProperty("autoMappingUnknownColumnBehavior", "NONE")));
    configuration.setCacheEnabled(booleanValueOf(props.getProperty("cacheEnabled"), true));
    configuration.setProxyFactory((ProxyFactory) createInstance(props.getProperty("proxyFactory")));
    configuration.setLazyLoadingEnabled(booleanValueOf(props.getProperty("lazyLoadingEnabled"), false));
    configuration.setAggressiveLazyLoading(booleanValueOf(props.getProperty("aggressiveLazyLoading"), false));
    configuration.setMultipleResultSetsEnabled(booleanValueOf(props.getProperty("multipleResultSetsEnabled"), true));
    configuration.setUseColumnLabel(booleanValueOf(props.getProperty("useColumnLabel"), true));
    configuration.setUseGeneratedKeys(booleanValueOf(props.getProperty("useGeneratedKeys"), false));
    configuration.setDefaultExecutorType(ExecutorType.valueOf(props.getProperty("defaultExecutorType", "SIMPLE")));
    configuration.setDefaultStatementTimeout(integerValueOf(props.getProperty("defaultStatementTimeout"), null));
    configuration.setDefaultFetchSize(integerValueOf(props.getProperty("defaultFetchSize"), null));
    configuration.setDefaultResultSetType(resolveResultSetType(props.getProperty("defaultResultSetType")));
    configuration.setMapUnderscoreToCamelCase(booleanValueOf(props.getProperty("mapUnderscoreToCamelCase"), false));
    configuration.setSafeRowBoundsEnabled(booleanValueOf(props.getProperty("safeRowBoundsEnabled"), false));
    configuration.setLocalCacheScope(LocalCacheScope.valueOf(props.getProperty("localCacheScope", "SESSION")));
    configuration.setJdbcTypeForNull(JdbcType.valueOf(props.getProperty("jdbcTypeForNull", "OTHER")));
    configuration.setLazyLoadTriggerMethods(stringSetValueOf(props.getProperty("lazyLoadTriggerMethods"), "equals,clone,hashCode,toString"));
    configuration.setSafeResultHandlerEnabled(booleanValueOf(props.getProperty("safeResultHandlerEnabled"), true));
    configuration.setDefaultScriptingLanguage(resolveClass(props.getProperty("defaultScriptingLanguage")));
    configuration.setDefaultEnumTypeHandler(resolveClass(props.getProperty("defaultEnumTypeHandler")));
    configuration.setCallSettersOnNulls(booleanValueOf(props.getProperty("callSettersOnNulls"), false));
    configuration.setUseActualParamName(booleanValueOf(props.getProperty("useActualParamName"), true));
    configuration.setReturnInstanceForEmptyRow(booleanValueOf(props.getProperty("returnInstanceForEmptyRow"), false));
    configuration.setLogPrefix(props.getProperty("logPrefix"));
    configuration.setConfigurationFactory(resolveClass(props.getProperty("configurationFactory")));
    configuration.setShrinkWhitespacesInSql(booleanValueOf(props.getProperty("shrinkWhitespacesInSql"), false));
    configuration.setArgNameBasedConstructorAutoMapping(booleanValueOf(props.getProperty("argNameBasedConstructorAutoMapping"), false));
    configuration.setDefaultSqlProviderType(resolveClass(props.getProperty("defaultSqlProviderType")));
    configuration.setNullableOnForEach(booleanValueOf(props.getProperty("nullableOnForEach"), false));
  }

加载配置入口: org.apache.ibatis.builder.xml.XMLConfigBuilder#parseConfiguration

  1. 加载properties节点 , 将配置中变量加载到mybatis上下文中
  2. 加载settings节点, 初始化或者定制化configuration中属性
  3. 加载typeAliases节点, 添加类型别名映射器
  4. 加载plugins节点, 添加一些插件处理器
  5. 加载objectFactory节点,指定对象创建工厂类
  6. 加载objectWrapperFactory节点,指定对象创建工厂类
  7. 加载reflectorFactory节点,指定对象反射处理工厂类
  8. 加载environments节点, 定制化环境配置,例如不同环境不同数据库连接配置
  9. 加载databaseIdProvider节点,获取不同数据源的databaseId
  10. 加载typeHandlers节点, 添加类型处理器
  11. 加载mappers节点,添加Mapper

蒋加载的配置信息统计存储在org.apache.ibatis.session.Configuration

2. Mybatis加载具体的Mapper.xml文件,XMLMapperBuilder

加载配置入口: org.apache.ibatis.builder.xml.XMLMapperBuilder#parse

1. org.apache.ibatis.builder.xml.XMLMapperBuilder#configurationElement 加载Mapper节点配置

  • 获取namespace属性, 设置namespace
  • 加载cache-ref节点配置, 加载缓存配置
  • 加载cache节点配置, 加载缓存配置,MapperBuilderAssistant#useNewCache
  • 加载/mapper/parameterMap节点配置, 加载ParameterMapping配置
  •  加载ResultMapping配置,MapperBuilderAssistant#buildParameterMapping
  • 加载/mapper/resultMap节点配置, 加载ResultMapping配置,MapperBuilderAssistant#buildResultMapping
  • 加载/mapper/sql节点配置, 加载sql配置
  • 加载select|insert|update|delete节点配置, 构造MappedStatement配置, org.apache.ibatis.builder.xml.XMLStatementBuilder#parseStatementNode

2. org.apache.ibatis.builder.xml.XMLMapperBuilder#bindMapperForNamespace 将xml文件配置的具体java接口注册到MapperRegistry

  •  org.apache.ibatis.session.Configuration#addMapper
  • org.apache.ibatis.binding.MapperRegistry#addMapper

3. XMLMapperBuilder#parsePendingResultMaps 加载未解析成功的ResultMapping配置

4. XMLMapperBuilder#parsePendingCacheRefs 加载上面为解析成功的Cache配置

5. XMLMapperBuilder#parsePendingStatements 加载上面为解析成功的MappedStatement配置

3. Mybatis加载mapper文件中具体的某个SQL语句,XMLStatementBuilder

解析入口: org.apache.ibatis.builder.xml.XMLStatementBuilder#parseStatementNode

  • 构建sql语句即 SqlSource 对象,LanguageDriver#createSqlSource
  • 构建MapperStatement, MapperBuilderAssistant#addMappedStatement()

4. Mybatis构建SqlSource对象,org.apache.ibatis.scripting.LanguageDriver

 

接口: org.apache.ibatis.scripting.LanguageDriver

实现:

org.apache.ibatis.scripting.xmltags.XMLLanguageDriver
org.apache.ibatis.scripting.defaults.RawLanguageDriver

接口: org.apache.ibatis.scripting.xmltags.SqlNode sql节点

实现:

org.apache.ibatis.scripting.xmltags.ChooseSqlNode
org.apache.ibatis.scripting.xmltags.ForEachSqlNode
org.apache.ibatis.scripting.xmltags.IfSqlNode
org.apache.ibatis.scripting.xmltags.MixedSqlNode
org.apache.ibatis.scripting.xmltags.SetSqlNode
org.apache.ibatis.scripting.xmltags.TrimSqlNode
org.apache.ibatis.scripting.xmltags.WhereSqlNode 等等

接口: org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.NodeHandler 节点处理器

org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.BindHandler

org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.WhereHandler

org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.SetHandler        

org.apache.ibatis.scripting.xmltags.XMLScriptBuilder.ChooseHandler等等

解析入口:XMLLanguageDriver#createSqlSource

1. org.apache.ibatis.scripting.xmltags.XMLScriptBuilder#parseScriptNode

  • org.apache.ibatis.scripting.xmltags.DynamicSqlSource
  • org.apache.ibatis.scripting.defaults.RawSqlSource

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/156613.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

指针进阶篇(2)

进阶指针 🤔前言🤔 一、😊函数指针😊 二、😜函数指针数组😜 三 、😝指向函数指针数组的指针😝 四、🌝回调函数🌝 🍀小结🍀 &…

摩丝-题解

看到题目,怀疑是莫尔斯电码,打开发现果然是莫尔斯电码的点和划.. .-.. --- ...- . -.-- --- ..-简单说一下电报的原理最简单的电报模型就是一个电源,一个开关和一个电磁铁当需要长距离使用时候,需要用到继电器按下开关&#xff0c…

【BP靶场portswigger-服务端10】XML外部实体注入(XXE注入)-9个实验(全)

前言: 介绍: 博主:网络安全领域狂热爱好者(承诺在CSDN永久无偿分享文章)。 殊荣:CSDN网络安全领域优质创作者,2022年双十一业务安全保卫战-某厂第一名,某厂特邀数字业务安全研究员&…

C#【必备技能篇】使用NPOI实现对excel的读取和写入

文章目录1、Winform界面布局2、引用NPOI的dll3、源码4、运行效果5、NPOI的dll下载地址6、补充【以上步骤只能打开.xls文件(97-2003版本),打不开.xlsx文件(2007版本)】1、Winform界面布局 2、引用NPOI的dll 3、源码 us…

(十二)devops持续集成开发——jenkins的全局工具配置之sonar qube环境安装及配置

前言 本节内容我们主要介绍一下在jenkins中如何集成sonar qube代码质量检查工具,sonar qube可以在流水化项目集成部署前对我们的代码质量检查。开始本节内容前我们需要先搭建好sonar qube服务,关于sonar qube服务的搭建可参考作者往期博客内容&#xff…

P4391 [BOI2009]Radio Transmission 无线传输

题目描述 给你一个字符串 s_1s1​,它是由某个字符串 s_2s2​ 不断自我连接形成的。但是字符串 s_2s2​ 是不确定的,现在只想知道它的最短长度是多少。 输入格式 第一行一个整数 LL,表示给出字符串的长度。 第二行给出字符串 s_1s1​ 的一个子…

【linux入门】基础知识学习笔记

文章目录【第一章-宏观知识】1.硬件和软件的关系2.操作系统 是什么、作用是什么3.常见的操作系统4.Linux的诞生5.Linux内核 是什么6.Linux发行版 是什么7.WSL是什么8.虚拟机快照9.FinalShell(Xshell替代品)【第二章-Linux基础命令】1.Linux目录结构2.什么…

Linux---权限

目录 1.文件访问者的分类(人/用户) 2.文件类型和访问权限(事物属性) 3.文件权限值的表示方法 a)字符表示方法 b)8进制数值表示方法 4.文件访问权限的相关设置方法 4.1 改属性 4.2 改人(改拥有者/所属组)…

数组常用方法总结 (3) :map / forEach / every / some

map 遍历数组的每一项。如果是简单数组,不改变原始数组(值类型)。如果是对象数组,原始数组可以被改变(引用类型)。遍历原始数组,返回值为原始数组的每一项,最终可组合成新数组。 简…

LeetCode 78 子集 | 解题思路分享

原题链接:78. 子集 - 力扣(LeetCode) 题目难度:中等 题目描述 给你一个整数数组 nums ,数组中的元素 互不相同 。返回该数组所有可能的子集(幂集)。 解集 不能 包含重复的子集。你可以按 任…

忆享聚焦|5G投资、网络安全市场、云计算、Web3技术……近期热点资讯一览

“忆享聚焦”栏目第11期来啦!本栏目汇集近期互联网最新资讯,聚焦前沿科技,关注行业发展动态,筛选高质量讯息,拓宽用户视野,让您以最低的时间成本获取最有价值的行业资讯。目录行业资讯1. SA:全球…

ubuntu虚拟机VmWare与主机共享文件夹

一、说明: 宿主操作系统:Windows 11 64位。 客户操作系统:Ubuntu 18.04.1 64位。 虚拟机软件:VMware Workstation 17 pro 二、步骤: 1、参考教程链接1,在主机设置共享文件夹。 注意:教程链接…

聚焦技术,2022巨杉荣获国内外多家权威机构认可

作为分布式数据库的领先企业 巨杉成立十年来,一直聚焦分布式技术的自研与深耕 在分布式数据库领域已取得丰硕的成果 回望2022,巨杉除在客户案例及产品方面屡获殊荣外 也凭借过硬的技术实力及规模化的行业应用 得到多家国内外权威机构的认可 国际权威…

TensorRT学习笔记--基本概念和推理流程

目录 前言 1--Tensor RT基本概念 2--推理流程 3--实例代码 前言 以下 Tensor RT 的基本概念和推理流程均为博主自我的理解,可能部分内存会存在错误或偏差,仅供参考! 1--Tensor RT基本概念 ① Logger:日志记录器,…

ssm:spring定时任务Task和CronExpression表达式

开发一个定时任务&#xff1a;每天晚上23点执行数据归集任务 首先Spring配置文件&#xff1a; <?xml version"1.0" encoding"UTF-8"?> <beans xmlns"http://www.springframework.org/schema/beans"xmlns:xsi"http://www.w3.or…

Java中的常用的代理模式

本文介绍在Java种常用的3种动态代理。 代理模式是23种模式中的一种&#xff0c;属于结构型设计模式。这种模式的作用就是要创建一个中间对象&#xff08;相当于中介或者代理对象&#xff09;&#xff0c;通过操作中间对象来间接调用目的对象的方法&#xff0c;字段等&#xff0…

Everything搜索知识总结

1.只知道那个文件以 .txt结尾 .*\.txt$ ($表示以什么结尾) 2.搜索某个路径下的文件 D:\ configure.bat (搜索D盘下的该文件,注意要用这种类型的"\",和被搜索的文件之间有空格;要先打出路径,再打出搜索文件.) 3.搜索指定路径下的多个文件 路径\ 文件1 | …

Halcon亚像素边缘缺陷检测案例

一、下面的案例是总结的Halcon边缘缺陷检测的一种情况。本案例是利用阈值分割获取金属区域&#xff0c;并利用boundary和edges_sub_pix获取到亚像素边缘。然后综合利用fit_rectangle2_contour_xld拟合出金属对应的放射矩形&#xff0c;最后利用dist_rectangle2_contour_points_…

【小白课程】openKylin用户手册原理解析,一招教你学会自定义!

openKylin用户手册是详细描述openKylin操作系统的功能和用户界面&#xff0c;让用户了解如何使用该软件的说明书。通过阅读openKylin用户手册&#xff0c;能够更快更好的上手和使用openKylin操作系统。今天就带大家简单了解下openKylin用户手册的实现原理以及如何自定义用户手册…

用EditPlus编译Fortran

一、EditPlus配置 语法点亮 安装好EditPlus后&#xff0c;点击Tool->Prefenrences&#xff0c;在File->Setting&syntex下&#xff0c;点击Add按钮&#xff0c;填Frotran。 到EditPlus官网上 EditPlus - User Files (other files) 下载Fortran语法文件 ​ 二、配置…