【設計】設計一個web版的數據庫管理平臺后端(之二)

在之前,我寫過一篇【設計】設計一個web版的數據庫管理平臺后端精要 的文章,文章講了一個web版數據庫管理平臺的實現思路及主要代碼。
最近,我看了下Mybatis的源碼,覺得Mybatis的分層架構挺好,所以想到了完善下web版數據庫管理平臺中,關于sql查詢的功能。

在上期文章中,關于sql的執行,代碼是最簡單的

// 執行SQL
jdbcTemplate.execute(sql);

對于sql查詢功能來說,這是遠遠不夠的,sql查詢需要查詢出數據庫中的結果,并顯示在網頁上。這里我們比Mybatis簡單,我們不需要實現結果與java類型的映射,只是顯示出來就好。

網上有個圖片(原圖地址,如有侵權,請聯系我),很好的反應了我即將要做的事情
在這里插入圖片描述

方案

也就是說,我要將原來直接執行sql的方式進行解耦,改為調用SQL執行器去執行。
參考Mybatis,我們添加了

SqlSession│├── Configuration (配置中心)│└── Executor (執行器)│├── StatementHandler (語句處理器)│└── ResultSetHandler (結果集處理器)

以下是本次完善的類圖。
在這里插入圖片描述

類圖說明:

  1. 核心類關系:
  • SqlSession 是入口類,包含Configuration和Executor
  • Executor 接口定義了執行SQL的核心方法
  • SimpleExecutor 是基礎實現,使用StatementHandler執行SQL
  1. 執行流程相關類:
  • StatementHandler 負責SQL語句準備和執行
  • SimpleStatementHandler 是基礎實現,使用PreparedStatement
  • ResultSetHandler 負責結果集處理
  • MapResultSetHandler 將ResultSet轉為List
  1. 配置類:
  • Configuration 持有數據源等配置信息
  1. 依賴關系:
  • 實線箭頭表示組合關系(強擁有)
  • 虛線箭頭表示依賴關系(臨時使用)
  • 空心三角箭頭表示接口實現

詳細設計

Configuration 配置類

public class Configuration {private DataSource dataSource;private boolean cacheEnabled = false;// 其他配置項...public Configuration(DataSource dataSource) {this.dataSource = dataSource;}// getters and setters...
}

SqlSession 實現

public class SqlSession {private final Configuration configuration;private final Executor executor;public SqlSession(Configuration configuration) {this.configuration = configuration;this.executor = new SimpleExecutor(configuration);}public List<Map<String, Object>> selectList(String sql, Object... parameters) {return executor.query(sql, parameters);}public void close() {executor.close();}
}

Executor 執行器

public interface Executor {List<Map<String, Object>> query(String sql, Object... parameters);void close();
}public class SimpleExecutor implements Executor {private final Configuration configuration;private Connection connection;public SimpleExecutor(Configuration configuration) {this.configuration = configuration;}@Overridepublic List<Map<String, Object>> query(String sql, Object... parameters) {try {StatementHandler statementHandler = new SimpleStatementHandler(configuration);return statementHandler.query(sql, parameters);} catch (SQLException e) {throw new RuntimeException("Error executing query: " + sql, e);}}@Overridepublic void close() {if (connection != null) {try {connection.close();} catch (SQLException e) {// ignore}}}
}

StatementHandler 語句處理器

public interface StatementHandler {List<Map<String, Object>> query(String sql, Object... parameters) throws SQLException;
}public class SimpleStatementHandler implements StatementHandler {private final Configuration configuration;private final ResultSetHandler resultSetHandler;public SimpleStatementHandler(Configuration configuration) {this.configuration = configuration;this.resultSetHandler = new MapResultSetHandler();}@Overridepublic List<Map<String, Object>> query(String sql, Object... parameters) throws SQLException {Connection connection = null;PreparedStatement stmt = null;ResultSet rs = null;try {connection = configuration.getDataSource().getConnection();stmt = connection.prepareStatement(sql);// 設置參數for (int i = 0; i < parameters.length; i++) {stmt.setObject(i + 1, parameters[i]);}rs = stmt.executeQuery();return resultSetHandler.handleResultSets(rs);} finally {if (rs != null) {try {rs.close();} catch (SQLException e) {// ignore}}if (stmt != null) {try {stmt.close();} catch (SQLException e) {// ignore}}if (connection != null) {try {connection.close();} catch (SQLException e) {// ignore}}}}
}

ResultSetHandler 結果集處理器

public interface ResultSetHandler {List<Map<String, Object>> handleResultSets(ResultSet rs) throws SQLException;
}public class MapResultSetHandler implements ResultSetHandler {@Overridepublic List<Map<String, Object>> handleResultSets(ResultSet rs) throws SQLException {List<Map<String, Object>> resultList = new ArrayList<>();ResultSetMetaData metaData = rs.getMetaData();int columnCount = metaData.getColumnCount();while (rs.next()) {Map<String, Object> row = new LinkedHashMap<>();for (int i = 1; i <= columnCount; i++) {String columnName = metaData.getColumnLabel(i);if (columnName == null || columnName.isEmpty()) {columnName = metaData.getColumnName(i);}row.put(columnName, rs.getObject(i));}resultList.add(row);}return resultList;}
}

使用示例

// 初始化配置
DataSource dataSource = ... // 創建數據源
Configuration configuration = new Configuration(dataSource);// 創建SqlSession
try (SqlSession sqlSession = new SqlSession(configuration)) {// 執行查詢List<Map<String, Object>> result = sqlSession.selectList("SELECT * FROM users WHERE age > ?", 18);// 處理結果for (Map<String, Object> row : result) {System.out.println(row);}
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/90758.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/90758.shtml
英文地址,請注明出處:http://en.pswp.cn/web/90758.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Visual tudio 各版本下 C++ 開發的核心區別與實踐指南

C語言的發展經歷了數十年的演進&#xff0c;從 C98 到現代的 C20/23&#xff0c;語言本身發生了巨大的變革。與此同時&#xff0c;Visual Studio 作為主流的 C 開發環境之一&#xff0c;其編譯器對各個 C 標準的支持程度也隨版本不斷演進&#xff0c;直接影響著開發者的編程方式…

怎樣讓阿里云服務器(centos)有界面

要讓阿里云服務器 CentOS 有圖形界面&#xff0c;可以按照以下步驟進行操作&#xff1a;登錄服務器&#xff1a;使用 SSH 客戶端工具&#xff0c;通過 IP 地址和賬號登錄到阿里云服務器。更新系統軟件源&#xff1a;輸入命令sudo yum update&#xff0c;更新系統軟件源&#xf…

Qt 異步編程模式與應用

在現代軟件開發中&#xff0c;異步編程已成為提升應用性能和響應性的關鍵技術。Qt 作為一個強大的跨平臺框架&#xff0c;提供了多種異步編程模式&#xff0c;包括信號槽機制、事件循環、線程池、異步 I/O 等。本文將深入探討 Qt 異步編程的各種模式及其應用場景&#xff0c;幫…

面試150 數字范圍按位與

思路 只要 left < right&#xff0c;說明兩者在某些低位上存在不同&#xff0c;為了找到它們的公共前綴&#xff08;高位相同部分&#xff09;&#xff0c;不斷將 left 和 right 同時右移&#xff08;即除以2&#xff09;&#xff0c;直到它們相等&#xff0c;記錄右移的次數…

數據庫HB OB mysql ck startrocks, ES存儲特點,以及應用場景

這些數據庫和存儲引擎主要有:HB(HBase)、OB(OceanBase)、MySQL、ClickHouse(CK)、StarRocks、Elasticsearch(ES),下面分別介紹它們的存儲特點以及典型應用場景。 1. HBase (HB) 存儲特點 分布式、面向列的NoSQL數據庫 采用HDFS存儲,數據以表、row key、列族、時間戳…

Java技術棧/面試題合集(17)-Git篇

場景 Java入門、進階、強化、擴展、知識體系完善等知識點學習、性能優化、源碼分析專欄分享: Java入門、進階、強化、擴展、知識體系完善等知識點學習、性能優化、源碼分析專欄分享_java高級進階-CSDN博客 通過對面試題進行系統的復習可以對Java體系的知識點進行查漏補缺。…

破局與重構:King’s LIMS 引領電子行業實驗室智能化轉型

在全球化高新技術競爭白熱化背景下&#xff0c;電子行業正經歷從規模導向擴張向質量效益躍升的戰略轉型。終端用戶對產品性能的極致化追求、行業質量合規標準的持續迭代升級&#xff0c;以及檢測數據的指數級增長&#xff0c;共同形成"需求牽引供給、供給創造需求"的…

暑期算法訓練.9

目錄 43 .力扣75 顏色分類 43.1 題目解析&#xff1a; 43.2 算法思路&#xff1a; 43.3 代碼演示&#xff1a; 43.4 總結反思&#xff1a; 44. 力扣 912 排序數組 44.1 題目解析&#xff1a; 44.2 算法思路&#xff1a; 44.3 代碼演示&#xff1a; ?編輯 44.4 總結反…

2.安裝CUDA詳細步驟(含安裝截圖)

2.安裝CUDA 第一步&#xff1a;安裝anaconda 注意&#xff1a;安裝CUDA之前需要安裝好anaconda&#xff0c;詳見安裝anaconda詳細步驟&#xff08;含安裝截圖&#xff09; 文章目錄2.安裝CUDA2.0 CUDA是什么&#xff0c;為什么要安裝它&#xff1f;2.1 驗證計算機是否安裝CUDA2…

Triton IR

Triton IR語法 Triton IR的語句遵從MLIR Dialect的語法定義規范&#xff0c;示例如下&#xff1a; %3 tt.splat %1 : i32 -> tensor<1024xi32> loc(#loc5) 其中&#xff1a; %0&#xff1a;右邊expression的結果值的名字&#xff08;Value的name&#xff09; tt…

掌握JavaScript函數封裝與作用域

JavaScript 基礎 - 第4天筆記理解封裝的意義&#xff0c;能夠通過函數的聲明實現邏輯的封裝&#xff0c;知道對象數據類型的特征&#xff0c;結合數學對象實現簡單計算功能。理解函數的封裝的特征掌握函數聲明的語法理解什么是函數的返回值知道并能使用常見的內置函數函數理解函…

Datawhale AI 夏令營—科大訊飛AI大賽(大模型技術)—讓大模型理解表格數據(列車信息表)

目錄 一、本次賽事目標&#xff1a;讓大模型理解表格數據&#xff08;列車信息表&#xff09; 二、分析賽題、對問題進行建模 賽事背景 賽題解讀 數據分析與探索 賽題要點與難點 解題思考過程 三、Baseline方案 Baseline概況 Baseline運行步驟 Baseline文件概況 Ba…

SSH連接失敗排查與解決教程: Connection refused

前言 當使用云服務器&#xff08;如阿里云、騰訊云、AWS 等&#xff09;時&#xff0c;嘗試在本地PC端使用圖形化工具如 FinalShell、XShell可能會遇到 SSH 連接失敗的問題。本文列舉 SSH 連接失敗的常見原因&#xff0c;并提供對應解決方案&#xff0c;幫助快速定位并解決問題…

性能優化:Vue 3 `v-memo` 指令詳解

v-memo 是 Vue 3 提供的一個性能優化工具&#xff0c;能幫助開發者緩存模板內容&#xff0c;減少不必要的渲染開銷。本文將介紹 v-memo 的引入版本、作用、使用方法和實現原理&#xff0c;并通過示例說明如何使用它。內容基于 Vue 3.5.18&#xff08;截至 2025 年 7 月的最新版…

標準庫開發和寄存器開發的區別

1.標準庫void GPIO_Toggle_INIT(void)//初始化GPIO {GPIO_InitTypeDef GPIO_InitStructure {0};//定義GPIO結構體RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);//使能GPIO時鐘GPIO_InitStructure.GPIO_Pin GPIO_Pin_2;//GPIO引腳選擇GPIO_InitStructure.GPIO_Mode …

在 WebSocket 中使用 @Autowired 時遇到空指針異常

背景&#xff1a;在websocket在有新的連接加入進來時&#xff0c;調用servier中的服務&#xff0c;使用 Autowired 注入的 Bean 竟然是 null&#xff01;這并非 Spring 的 Bug&#xff0c;而是對 WebSocket 生命周期管理理解不足導致的。了解這個問題&#xff0c;我們需要區分兩…

MGER實驗

一、實驗拓撲圖二、配置1.R5為ISP&#xff0c;只能進行IP地址配置&#xff0c;其所有地址均配為公有IP地址R1側為15.1.1.1&#xff0c;對應R5為15.1.1.2R2側為25.1.1.2&#xff0c;對應R5為25.1.1.1R3側為35.1.1.2&#xff0c;對應R5為35.1.1.1R4側為45.1.1.2&#xff0c;對應R…

基于 XGBoost 與 SHAP 的醫療自動化辦公與可視化系統(下)

— 登錄接口 — @app.post(“/token”) def login(form_data: OAuth2PasswordRequestForm = Depends()): user = fake_users_db.get(form_data.username) if not user or form_data.password != user[“password”]: raise HTTPException(status_code=400, detail=“用戶名或密…

python學智能算法(二十九)|SVM-拉格朗日函數求解中-KKT條件

引言 前序學習進程中&#xff0c;對拉格朗日函數執行了初步求導&#xff0c;并獲得了簡化后的拉格朗日函數極值計算式&#xff1a; L(w,b,α)∑i1mαi?12∑i,j1mαiαjyiyjxiTxjL(w,b,\alpha)\sum_{i1}^{m}\alpha_{i}-\frac{1}{2}\sum_{i,j1}^{m}\alpha_{i}\alpha_{j}y_{i}y_…

【AI論文】MiroMind-M1:通過情境感知多階段策略優化實現數學推理的開源新進展

摘要&#xff1a;近期&#xff0c;大型語言模型已從流暢的文本生成發展至能在多個領域進行高級推理&#xff0c;由此催生了推理語言模型&#xff08;RLMs&#xff09;。在眾多領域中&#xff0c;數學推理堪稱代表性基準&#xff0c;因為它需要精確的多步驟邏輯與抽象推理能力&a…