您好!
欢迎来到京东云开发者社区
登录
首页
博文
课程
大赛
工具
用户中心
开源
首页
博文
课程
大赛
工具
开源
更多
用户中心
开发者社区
>
博文
>
MyBatis配置文件解析探究
分享
打开微信扫码分享
点击前往QQ分享
点击前往微博分享
点击复制链接
MyBatis配置文件解析探究
自猿其说Tech
2021-12-06
IP归属:未知
49600浏览
计算机编程
### 1 简介 MyBatis是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射, 它可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。基于此大多数项目中使用mybatis作为持久层框架,本文主要探究mybatis对配置文件解析的源码实现。 ### 2 MyBatis配置解析 - MyBatis配置文档的顶层结构如下: - configuration(配置) - properties(属性) - settings(设置) - typeAliases(类型别名) - typeHandlers(类型处理器) - objectFactory(对象工厂) - plugins(插件) - environments(环境配置) - databaseIdProvider(数据库厂商标识) - mappers(映射器) 对于配置文件的解析首先会加载为InputStream流,之后调用new SqlSessionFactoryBuilder().build(inputStream)进行加载,首先会解析出configuration节点的内容,之后依次解析各个节点,具体过程如下图。 ![](//img1.jcloudcs.com/developer.jdcloud.com/cf6bd42b-b694-4fe5-8e47-c51b2f014eb220211206145005.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/e4fa4577-9464-4b9a-8960-ec6f18c1c1de20211206145013.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/cbd70ecc-525d-4a3c-8eb8-c92e4ab9cf1420211206145018.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/6b87844f-ce04-4983-958d-bd86320a172920211206145024.png) #### 2.1 properties(属性) 设置一些属性,可以在整个配置文件中用来替换需要动态配置的属性值 ,这些属性我们可以在外部文件写好引入,可以在properties的子属性标签内定义,还可以在加载配置文件的构造函数入参传入。 通过源码可以看到属性信息是通过propertiesElement方法来解析的。 ![](//img1.jcloudcs.com/developer.jdcloud.com/16846dcc-11a0-497b-ac0b-2d82a8b005ea20211206145052.png) 可以看出这几种方式的优先级是:方法参数传递 >外部文件>元素体内指定。其中外部指定的名称可以是“resource”或者“url”,但是不能同时存在。 #### 2.2 settings(设置) settings主要设置MyBatis的一些行为,具体每个参数设置的意义可以参阅文末的官方说明链接。对于settings的解析分为了两个方法实现,loadCustomVfs解析解析自定义 VFS 的实现的类的设置,settingsElement实现其余的设置解析。 ![](//img1.jcloudcs.com/developer.jdcloud.com/d9146a5b-4353-4a55-aca5-094165826bab20211206145113.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/dd27a89a-a516-416e-8c9b-ad791bb2d7eb20211206145125.png) #### 2.3 typeAliases(类型别名) 类型别名可为 Java 类型设置一个缩写名字,它仅可以用于 XML 配置。通过typeAliasesElement方法来解析别名配置。 ![](//img1.jcloudcs.com/developer.jdcloud.com/7c489370-aeb4-4fdf-a566-d404f4d10fbb20211206145158.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/2b3da8c6-33fa-46c0-a328-239cb5e736b820211206145208.png) 从上述实现可以看出解析出来的类型别名信息会存放到TYPE_ALIASES中,这是一个map类型的数据结构。此外MyBatis中那些默认的类型别名是在TypeAliasRegistry类的构造函数中存入进去的。 ![](//img1.jcloudcs.com/developer.jdcloud.com/9ba841fc-ca78-42c8-b733-c8866c8a689e20211206145222.png) #### 2.4 typeHandlers(类型处理器) 类型处理器 用来将数据库查询的结果转换为Java对应的类型,通过typeHandlerElement方法解析该配置。 ![](//img1.jcloudcs.com/developer.jdcloud.com/49f5e5d6-1bf5-47f0-adba-e57c6a61617520211206145243.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/1e0dbbb6-50ef-4cd6-8a8e-9c66c3f7ad7920211206145259.png) 解析出来的结果存入定义好的map结构中,MyBatis中默认的类型处理器是在TypeHandlerRegistry的构造函数中存入的。 ![](//img1.jcloudcs.com/developer.jdcloud.com/3d2f7370-81de-4dd0-ab59-81bb73533f0820211206145313.png) #### 2.5 objectFactory(对象工厂) 对象工厂用来完成对象的实例化工作 ,通过objectFactoryElement方法解析该配置 ![](//img1.jcloudcs.com/developer.jdcloud.com/32bff4c9-c32a-4a2a-88e3-94c5c5890e5c20211206145330.png) ##### 2.6 plugins(插件) 对于MyBatis插件配置的解析通过pluginElement方法实现。 ![](//img1.jcloudcs.com/developer.jdcloud.com/b5ab3145-9c94-4f41-a05f-f6f76a59dd1e20211206145354.png) #### 2.7 environments(环境配置) 对于环境变量的配置解析通过environmentsElement方法实现。 ![](//img1.jcloudcs.com/developer.jdcloud.com/777524d2-1703-478e-b66d-1dce8552f3b220211206145412.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/4600a313-e250-4ce3-83e1-09d1e4e0484e20211206145424.png) 从上述实现可以看出只有default属性定义的环境配置才会被解析。 #### 2.8 databaseIdProvider(数据库厂商标识) 对于数据库厂商标识的配置解析通过databaseIdProviderElement方法实现。 ![](//img1.jcloudcs.com/developer.jdcloud.com/39dcf6ff-8d30-4a3e-b035-245bd6fe96aa20211206145440.png) ##### 2.9 mappers(映射器) 对于mapper映射器的配置解析通过mapperElement方法实现。 ![](//img1.jcloudcs.com/developer.jdcloud.com/7069304a-a7d7-4a78-85e7-b3c61d17a43520211206145456.png) ![](//img1.jcloudcs.com/developer.jdcloud.com/1176f885-c77a-422a-91c1-5e202764dbc920211206145509.png) 从上述实现可以看出对于mapper各种配置的优先级是:package>resource>url>class,并且每个mapper标签只能配置一种。 ### 3 小结 以上是MyBatis对于配置文件的解析具体实现,通过探究我们了解了那些有多种配置方式的具体实现及优先级,在后续遇到配置不生效的情况时可以对照查看其配置方式。根据MyBatis对于默认配置的实现方式,我们可以按照需要修改存入特定的配置,构建定制化的jar类使用。 对于每种配置的参数说明本文并未列出,具体内容可以参考[官方说明文档](https://mybatis.org/mybatis-3/zh/configuration.html )。 ------------ ###### 自猿其说Tech-京东物流技术发展部 ###### 作者:管碧强
原创文章,需联系作者,授权转载
上一篇:奇点敏捷团队的第五项修炼
下一篇:以产品视角看项目管理
相关文章
Taro小程序跨端开发入门实战
Flutter For Web实践
配运基础数据缓存瘦身实践
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
本文将从Optional所解决的问题开始,逐层解剖,由浅入深,文中会出现Optioanl方法之间的对比,实践,误用情况分析,优缺点等。与大家一起,对这项Java8中的新特性,进行理解和深入。
01
Taro小程序跨端开发入门实战
为了让小程序开发更简单,更高效,我们采用 Taro 作为首选框架,我们将使用 Taro 的实践经验整理了出来,主要内容围绕着什么是 Taro,为什么用 Taro,以及 Taro 如何使用(正确使用的姿势),还有 Taro 背后的一些设计思想来进行展开,让大家能够对 Taro 有个完整的认识。
01
Flutter For Web实践
Flutter For Web 已经发布一年多时间,它的发布意味着我们可以真正地使用一套代码、一套资源部署整个大前端系统(包括:iOS、Android、Web)。渠道研发组经过一段时间的探索,使用Flutter For Web技术开发了移动端可视化编程平台—Flutter乐高,在这里希望和大家分享下使用Flutter For Web实践过程和踩坑实践
01
配运基础数据缓存瘦身实践
在基础数据的常规能力当中,数据的存取是最基础也是最重要的能力,为了整体提高数据的读取能力,缓存技术在基础数据的场景中得到了广泛的使用,下面会重点展示一下配运组近期针对数据缓存做的瘦身实践。
自猿其说Tech
文章数
426
阅读量
2149964
作者其他文章
01
深入JDK中的Optional
01
Taro小程序跨端开发入门实战
01
Flutter For Web实践
01
配运基础数据缓存瘦身实践
添加企业微信
获取1V1专业服务
扫码关注
京东云开发者公众号