dbVisitor 的雙層適配架構

新聞
HongKong
0
01:55 PM · Jan 13 ,2026

本文將深入解析 dbVisitor 獨特的"雙層適配"架構,揭示其如何通過應用層與協議層的雙重抽象,打破 RDBMS 與 NoSQL 的壁壘。

1768224410393-nb-52ddc8ccc1fba697441a69d99ca9284d-1.png

摘要

在使用 Java 進行現代應用開發時,混合使用關係型數據庫(如 MySQL、PostgreSQL)和非關係型數據庫(如 MongoDB、Elasticsearch)已成為常態。 然而,這種混合架構往往導致技術棧割裂:開發者需要在 JDBC/MyBatis 和各種 NoSQL 專有客户端之間頻繁切換。

dbVisitor 提出的"雙層適配"架構旨在解決這一痛點。

  • 第一層(應用適配):在 API 層面,通過統一的 LambdaTemplate 和 Mapper 接口屏蔽底層語法差異(SQL vs DSL)。
  • 第二層(協議適配):在驅動層面,實現了標準的 JDBC 接口,將 NoSQL 數據源封裝為標準 JDBC 驅動。

這種設計不僅實現了"One API Access Any DataBase"的願景,還帶來了極高的靈活性:開發者既可以享受 dbVisitor 全棧的便捷,也可以僅使用其 JDBC 驅動,讓現有的 MyBatis/Hibernate 項目瞬間具備操作 NoSQL 的能力。


雙層適配

1. 第一層適配:應用層的統一抽象 (API Adapter)

"應用層適配" 解決的是 "怎麼寫" 的問題。

在這一層,dbVisitor 通過高度抽象的 API 屏蔽了底層語法的差異。無論後端對接的是 MySQL 的 SQL,還是 MongoDB 的 BSON 過濾器,甚至是 Elasticsearch 的 Query DSL,開發者面對的都是同一套 Java API。

dbVisitor 提供了 5 種 不同風格的 API,滿足從簡單 CRUD 到複雜報表分析的各類場景需求:

1. 編程式 API (JdbcTemplate)

這是最基礎的形態,緊貼 JDBC 標準。它適合需要精細控制 SQL 執行,或者進行簡單且直接的數據庫操作的場景。 對於 NoSQL 數據庫,你甚至可以在這裏直接使用其原生查詢腳本(如 Mongo Shell)。

// 傳統 SQL 方式
jdbcTemplate.executeUpdate("insert into user_info (id, name) values (?, ?)", 1, "mali");

// Mongo Shell 方式 (直接透傳)
jdbcTemplate.executeUpdate("db.user_info.insert({_id: 1, name: 'mali'})");

2. 聲明式 API (Interface)

通過定義 Java 接口並配合 @Query 等註解,將數據訪問邏輯與業務代碼分離。這種方式讓代碼結構更加清晰,易於維護。

@SimpleMapper
public interface UserMapper {
    @Query("select * from user_info where age > :age")
    List<User> findByAge(@Param("age") int age);
}

3. 通用 Mapper (BaseMapper)

這是聲明式 API 的增強版。通過繼承 BaseMapper<T>,你無需編寫任何代碼即可獲得標準的 CRUD 能力。 框架會自動根據泛型實體 T 生成對應的 Select/Insert/Update/Delete 語句或指令。

// 僅需一句繼承,即擁有全套 CRUD 方法
public interface UserMapper extends BaseMapper<UserInfo> {
}

// 使用
userMapper.insert(new UserInfo("1001", "Tom"));
UserInfo user = userMapper.selectById("1001");

4. 構造器 API (LambdaTemplate)

這是當前最推薦的用法。它利用 Java 的 Lambda 表達式實現了類型安全的查詢構建。 最大的優勢在於:當你重構 Java 實體類的屬性名時,查詢條件會自動更新,無需擔心字符串硬編碼帶來的"炸雷"。

// 會自動翻譯為 SQL 或 NoSQL 對應的查詢語句
List<UserInfo> users = lambdaTemplate.lambdaQuery(UserInfo.class)
    .eq(UserInfo::getAge, 18)
    .likeRight(UserInfo::getName, "Tom")
    .list();

5. 文件 Mapper (XML/DSL)

當遇到極度複雜的查詢(如幾百行的報表 SQL,或者極其複雜的 ES 聚合查詢)時,將 SQL/DSL 放在 XML 文件中管理是最佳選擇。 這不僅保持了 Java 代碼的整潔,還支持強大的動態規則引擎。

<!-- UserMapper.xml -->
<mapper namespace="com.example.UserMapper">
    <select id="findComplexUsers">
        select * from user_info
        @{and, age > :minAge}
        @{and, name like :namePattern}
    </select>
</mapper>

第二層適配:協議層的數據標準化 (Driver Adapter)

"協議層適配" 解決的是 "怎麼連""怎麼傳" 的問題。

這是 dbVisitor 最具創新性的地方。不同於大多數框架僅在 API 層做封裝,dbVisitor 向下深入到了驅動層,完整實現了 Java 的 java.sql.Driver 接口。

NoSQL 的"關係化"偽裝

在這一層,dbVisitor 將各類非關係型數據庫"偽裝"成了標準的關係型數據庫:

  • 表映射 : MongoDB 的 Collection 和 Elasticsearch 的 Index 被映射為 JDBC 的 Table
  • 行映射: 文檔(Document)被映射為行(Row),字段被映射為列(Column)。
  • SQL 解析 : 驅動內部內置了 SQL 解析器。當你向驅動發送一條 SELECT * FROM users WHERE age > 10 的 SQL 時,驅動會自動將其翻譯為:
    • MongoDB: db.users.find({ "age": { "$gt": 10 } })
    • Elasticsearch: GET /users/_search { "query": { "range": { "age": { "gt": 10 } } } }

這種底層適配意味着:任何支持 JDBC 的工具或框架,理論上都可以通過 dbVisitor 連接到 NoSQL 數據庫。


雙層架構的靈活組合 (Synergy)

這種 應用層 (API) + 協議層 (Driver) 的雙層設計,為項目架構帶來了極大的靈活性。你可以根據團隊的習慣和存量代碼的情況,選擇"全棧模式"或"驅動模式"。

模式一:全棧模式 (Best Practice)

同時使用 dbVisitor 的 API 和 Driver。這是最順滑的使用方式,你將獲得統一的開發體驗、最佳的性能以及完整的類型安全支持。

適用場景: 新項目開發,或者希望徹底統一數據訪問層的項目。

模式二:驅動模式 (Integration)

"老瓶裝新酒"。僅使用 dbVisitor 的 JDBC 驅動,而繼續使用你熟悉的 ORM 框架(如 MyBatis、Hibernate、Spring Data JDBC)。

想象一下,你有一個運行了 5 年的 MyBatis 項目,現在需要接入 MongoDB 存儲日誌。 你不需要學習新的 MongoTemplate,也不需要引入繁重的 Spring Data Mongo。只需要:

  1. 將 JDBC URL 修改為 dbVisitor 的 JDBC 格式。
  2. 像寫 MySQL 一樣編寫 MyBatis Mapper XML。

dbVisitor 驅動會默默地在後台將 MyBatis 發出的 SQL 轉換為 MongoDB 指令。

<!-- MyBatis Mapper XML -->
<!-- 這是一個操作 MongoDB 的查詢,但在 MyBatis 看來它就是標準 SQL -->
<select id="selectLogs" resultType="LogDoc">
    SELECT * FROM app_logs 
    WHERE level = 'ERROR' 
    ORDER BY timestamp DESC
</select>

總結

dbVisitor 的雙層適配器架構,本質上是對 JDBC 標準 的一次致敬與延伸。

通過 API 層 的封裝,它讓開發者從繁雜的異構語法中解放出來,專注於業務邏輯; 通過 Driver 層 的實現,它打破了 RDBMS 與 NoSQL 的物理邊界,讓數據流轉不再受限於協議。

無論你是追求極致開發效率的"全棧派",還是堅守現有技術棧的"整合派",dbVisitor 都能為你提供一個穩健、統一的數據訪問底座。

最後如果你對這個項目感興趣不妨給個 星星關注一下它吧。

  • 項目首頁:https://www.dbvisitor.net/
  • 項目源碼:https://gitee.com/zycgit/dbvisitor
user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.