摘要:源碼閱讀之的配置文件所有配置會被類讀取,我們可以通過此類來了解各個配置是如何運作的。是用于項目中存在多種數據庫時區分同一條對應的數據庫。可以這樣認為,在中的和組合才是一條的唯一標識。如果發現自己的沒被正確識別,可以查看方法是否和預期一致。
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 中。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/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 進階面試問題列表 -...
閱讀 3189·2023-04-26 03:06
閱讀 3689·2021-11-22 09:34
閱讀 1134·2021-10-08 10:05
閱讀 3024·2021-09-22 15:53
閱讀 3530·2021-09-14 18:05
閱讀 1387·2021-08-05 09:56
閱讀 1880·2019-08-30 15:56
閱讀 2124·2019-08-29 11:02