摘要:源码阅读之的配置文件所有配置会被类读取,我们可以通过此类来了解各个配置是如何运作的。是用于项目中存在多种数据库时区分同一条对应的数据库。可以这样认为,在中的和组合才是一条的唯一标识。如果发现自己的没被正确识别,可以查看方法是否和预期一致。
MyBatis 源码阅读之 databaseId
MyBatis 的配置文件所有配置会被 org.apache.ibatis.builder.xml.XMLConfigBuilder 类读取,我们可以通过此类来了解各个配置是如何运作的。而 MyBatis 的映射文件配置会被 org.apache.ibatis.builder.xml.XMLMapperBuilder 类读取。我们可以通过此类来了解映射文件的配置时如何被解析的。
databaseIddatabaseId 是用于项目中存在多种数据库 SQL 时区分同一条 SQL 对应的数据库。可以这样认为,在 Mybatis 中 SQL 的 id 和 databaseId 组合才是一条 SQL 的唯一标识。实际上 MyBatis 只会选择性加载指定 databaseId 的 SQL ,还有一些没有指定 databaseId 的 SQL。这里说的有点不是很准确,我们来慢慢分析便可以知晓。
databaseId 的配置MyBatis 配置文件中 databaseId 的配置如下:
读取的代码如下:
private void databaseIdProviderElement(XNode context) throws Exception { DatabaseIdProvider databaseIdProvider = null; if (context != null) { String type = context.getStringAttribute("type"); // 保持向后兼容 if ("VENDOR".equals(type)) { type = "DB_VENDOR"; } // 属性设置 Properties properties = context.getChildrenAsProperties(); // 找到 type 配置对应的类 databaseIdProvider = (DatabaseIdProvider) resolveClass(type).newInstance(); databaseIdProvider.setProperties(properties); } Environment environment = configuration.getEnvironment(); if (environment != null && databaseIdProvider != null) { // 通过数据源确定使用的 databaseId ,之后 SQL 也只会加载这种 databaseId 的 SQL ,其他类型都会被忽略 String databaseId = databaseIdProvider.getDatabaseId(environment.getDataSource()); configuration.setDatabaseId(databaseId); } }
这里的代码逻辑比较简单:
读取 databaseIdProvider 节点的 type 值与子节点属性值
根据 type 值找到与之匹配的 DatabaseIdProvider 子类,创建相应的实例,将子节点属性设置到实例中
调用 DatabaseIdProvider 实例的 getDatabaseId() 方法获取值设置到 Configuration 实例中
注:
type 为 DB_VENDOR 表示使用 org.apache.ibatis.mapping.VendorDatabaseIdProvider 作为 DatabaseIdProvider 的实现类。这一点可以在 org.apache.ibatis.session.Configuration 的构造方法中找到证据。
如果发现自己的 databaseId 没被正确识别,可以查看 getDatabaseId() 方法是否和预期一致。
databaseId 的使用databaseId 在映射文件里要和上一节的配置的属性 value 值对应,如下:
读取的代码在这,这只是
private void sqlElement(Listlist) throws Exception { if (configuration.getDatabaseId() != null) { // 加载 DataSource 对应的 databaseId 的 SQL 节点 sqlElement(list, configuration.getDatabaseId()); } // 记载 databaseId 为空的 SQL 节点 sqlElement(list, null); } private void sqlElement(List list, String requiredDatabaseId) throws Exception { for (XNode context : list) { String databaseId = context.getStringAttribute("databaseId"); String id = context.getStringAttribute("id"); id = builderAssistant.applyCurrentNamespace(id, false); if (databaseIdMatchesCurrent(id, databaseId, requiredDatabaseId)) { sqlFragments.put(id, context); } } } private boolean databaseIdMatchesCurrent(String id, String databaseId, String requiredDatabaseId) { if (requiredDatabaseId != null) { if (!requiredDatabaseId.equals(databaseId)) { // 两个 databaseId 一致才会返回 true,此处不一致 return false; } } else { // 一个为空,一个不为空,也不一致 if (databaseId != null) { return false; } // 如果先前已经加载过节点,则不再加载 // 是否视为同一个节点是由 id 决定 // 但 id 相同,databaseId 不同 mybatis也可以加载,所以有些地方说,id+databaseId 确定唯一一条 SQL if (this.sqlFragments.containsKey(id)) { XNode context = this.sqlFragments.get(id); if (context.getStringAttribute("databaseId") != null) { return false; } } } return true; }
代码上已经有了详细的注释,这里就简单说一下。sqlElement() 方法会被调用两次,第一次用于处理 databaseId 与全局 Configuration 实例的 databaseId 一致的节点;另一次用于处理节点的 databaseId 为 null 的情况,针对同一个 id ,优先选择存在 databaseId 并且与数据源的一致。
同样的, 之类的节点解析代码也是类似,不过它们的解析代码在 org.apache.ibatis.builder.xml.XMLStatementBuilder 中。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/72680.html
摘要:配置测试描述测试类技术部查询表至此初步配置完成执行过程获取解析成接收方法方法方法属性定位方法数据绑定到具体方法提交传输获取配置解析标签对象获取过程源码使用 MyBatis 配置 4.0.0 com.huifer mybatisBook 1.0-SNAPSHOT UTF-8 UTF-8 1...
摘要:原因就是传入的和原有的单引号,正好组成了,而后面恒等于,所以等于对这个库执行了查所有的操作。类比的执行流程和原有的我们使用的方法就是。可以理解为就是用来解析定制的符号的语句。后续的流程,就和正常的流程一致了。 前言 在JDBC中,主要使用的是两种语句,一种是支持参数化和预编译的PrepareStatement,能够支持原生的Sql,也支持设置占位符的方式,参数化输入的参数,防止Sql注...
摘要:下面我会详细地从源码的角度分析下文简写成是如何实现自动注入的原理。文件解析器,解析对应的文件信息,并将文件信息注册到中。节点解析器,用于构建节点信息。注册与绑定类,将的类信息与绑定。 微信公众号「后端进阶」,专注后端技术分享:Java、Golang、WEB框架、分布式中间件、服务治理等等。 老司机倾囊相授,带你一路进阶,来不及解释了快上车! mybatis-plus是完全基于myba...
摘要:从使用到原理学习线程池关于线程池的使用,及原理分析分析角度新颖面向切面编程的基本用法基于注解的实现在软件开发中,分散于应用中多出的功能被称为横切关注点如事务安全缓存等。 Java 程序媛手把手教你设计模式中的撩妹神技 -- 上篇 遇一人白首,择一城终老,是多么美好的人生境界,她和他历经风雨慢慢变老,回首走过的点点滴滴,依然清楚的记得当初爱情萌芽的模样…… Java 进阶面试问题列表 -...
阅读 3153·2023-04-26 03:06
阅读 3665·2021-11-22 09:34
阅读 1112·2021-10-08 10:05
阅读 2996·2021-09-22 15:53
阅读 3425·2021-09-14 18:05
阅读 1286·2021-08-05 09:56
阅读 1744·2019-08-30 15:56
阅读 2096·2019-08-29 11:02