MyBatis 四大核心組件之 ParameterHandler 源碼解析

🚀 作者主頁: 有來技術
🔥 開源項目: youlai-mall 🍃 vue3-element-admin 🍃 youlai-boot
🌺 倉庫主頁: Gitee 💫 Github 💫 GitCode
💖 歡迎點贊 👍 收藏 ?留言 📝 如有錯誤敬請糾正!

在這里插入圖片描述

目錄

  • 前言
  • ParameterHandler 接口
  • DefaultParameterHandler 類
    • setParameters 方法
    • getParameterValue 方法
  • 結語
  • 開源項目

前言

在 MyBatis 中,ParameterHandler 是四大核心組件之一,負責將 Java 方法的參數解析成 SQL 語句中的參數。在本文中,我們將詳細介紹 ParameterHandler 的源碼,并解釋復雜對象作為參數時一個和多個的區別和原因。

ParameterHandler 接口

ParameterHandler 接口定義了參數解析器的基本方法,包括:

  • setParameters(PreparedStatement ps):將 Java 方法的參數設置到 PreparedStatement 中。
  • getParameterObject():獲取 Java 方法的參數對象。
  • getParameterType():獲取 Java 方法的參數類型。

DefaultParameterHandler 類

DefaultParameterHandler 類是 ParameterHandler 接口的默認實現,它提供了參數解析的默認實現。DefaultParameterHandler 類中包含了兩個重要的成員變量:

  • parameterObject:Java 方法的參數對象。
  • mappedStatement:當前正在執行的 SQL 語句的映射語句。

setParameters 方法

setParameters 方法是 ParameterHandler 接口的核心方法,它負責將 Java 方法的參數設置到 PreparedStatement 中。setParameters 方法的實現如下:

@Override
public void setParameters(PreparedStatement ps) throws SQLException {// 獲取 Java 方法的參數對象Object parameterObject = getParameterObject();// 獲取當前正在執行的 SQL 語句的映射語句MappedStatement mappedStatement = getMappedStatement();// 獲取 SQL 語句中的參數映射List<ParameterMapping> parameterMappings = mappedStatement.getParameterMappings();// 遍歷參數映射for (int i = 0; i < parameterMappings.size(); i++) {// 獲取參數映射ParameterMapping parameterMapping = parameterMappings.get(i);// 獲取參數值Object value = getParameterValue(parameterMapping, parameterObject);// 設置參數值ps.setObject(i + 1, value);}
}

getParameterValue 方法

getParameterValue 方法負責獲取參數值。getParameterValue 方法的實現如下:

private Object getParameterValue(ParameterMapping parameterMapping, Object parameterObject) {// 獲取參數類型Class<?> parameterType = parameterMapping.getJavaType();// 獲取參數名稱String parameterName = parameterMapping.getProperty();// 獲取參數值Object value = null;if (parameterType == String.class) {value = (String) parameterObject;} else if (parameterType == Integer.class) {value = (Integer) parameterObject;} else if (parameterType == Long.class) {value = (Long) parameterObject;} else if (parameterType == Float.class) {value = (Float) parameterObject;} else if (parameterType == Double.class) {value = (Double) parameterObject;} else if (parameterType == Date.class) {value = (Date) parameterObject;} else if (parameterType == byte[].class) {value = (byte[]) parameterObject;} else {// 如果參數類型是復雜類型,則需要使用反射獲取參數值try {Field field = parameterObject.getClass().getDeclaredField(parameterName);field.setAccessible(true);value = field.get(parameterObject);} catch (NoSuchFieldException e) {throw new RuntimeException("Error getting parameter value: " + e.getMessage());} catch (IllegalAccessException e) {throw new RuntimeException("Error getting parameter value: " + e.getMessage());}}// 返回參數值return value;
}

這兩個方法結合起來完成了將 Java 方法的參數解析并設置到 PreparedStatement 的過程。

結語

通過深入理解 MyBatis 中 ParameterHandler 的源碼,我們能夠更好地把握參數解析的機制,提高 SQL 語句的執行效率。同時,了解復雜對象作為參數時的處理方式,能夠更靈活地應對各種場景。在實際應用中,合理地使用參數映射規范,能夠使 SQL 語句更加清晰易讀,提高開發效率。

開源項目

  • SpringCloud + Vue3 微服務商城
GithubGitee
后端youlai-mall 🍃youlai-mall 🍃
前端mall-admin🌺mall-admin 🌺
移動端mall-app 🍌mall-app 🍌
  • SpringBoot 3+ Vue3 單體權限管理系統
GithubGitee
后端youlai-boot 🍃youlai-boot 🍃
前端vue3-element-admin 🌺vue3-element-admin 🌺

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

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

相關文章

【圖片版】計算機組成原理考前復習題【第2章 運算方法和運算器-1】

目錄 前言 考前復習題&#xff08;必記&#xff09; 結尾 前言 在計算機組成原理的學習過程中&#xff0c;我們深入探索了計算機系統概述這一重要領域。計算機系統作為現代科技的核心&#xff0c;是整個計算機科學的基石。我們將學到的知識與理論轉化為了能夠解決現實問題的…

Python+unittest+requests接口自動化測試框架搭建 完整的框架搭建過程

首先配置好開發環境&#xff0c;下載安裝Python并下載安裝pycharm&#xff0c;在pycharm中創建項目功能目錄。如果不會的可以百度Google一下&#xff0c;該內容網上的講解還是比較多比較全的&#xff01; 大家可以先簡單了解下該項目的目錄結構介紹&#xff0c;后面會針對每個文…

docker 可視化工具操作說明 portainer

官網地址 https://docs.portainer.io/start/install-ce/server/docker/linux 1.First, create the volume that Port docker volume create portainer_data2.下載并安裝容器 docker run -d -p 8000:8000 -p 9443:9443 --name portainer --restartalways -v /var/run/docker…

PWN動態調試

這篇文章就是來教大家學習怎么動態調試的&#xff0c;然后我還寫了一篇關于動態調試的文章&#xff0c;不是buu上面的題&#xff0c;就是兩道簡單的棧溢出問題&#xff0c;那兩道題挺有特點的。大家可以去看看。 每日3道PWN之課外2道&#xff08;第2.5天&#xff09;-CSDN博客 …

C#暫停和恢復(Thread.Suspend()和Thread.Resume() vs AutoResetEvent()和EventWaitHandle())

目錄 一、Thread.Suspend()和Thread.Resume() 二、AutoResetEvent()和EventWaitHandle() 1.AutoResetEvent() 2.EventWaitHandle() 3.示例及生成效果 一、Thread.Suspend()和Thread.Resume() 自 .NET 2.0 以后&#xff08;含&#xff09;&#xff0c;Thread.Suspend() 和…

性能監控體系:InfluxDB Grafana Prometheus

InfluxDB 簡介 什么是 InfluxDB &#xff1f; InfluxDB 是一個由 InfluxData 開發的&#xff0c;開源的時序型數據庫。它由 Go 語言寫成&#xff0c;著力于高性能地查詢與存儲時序型數據。 InfluxDB 被廣泛應用于存儲系統的監控數據、IoT 行業的實時數據等場景。 可配合 Te…

SSD基礎架構與NAND IO并發問題探討

在我們的日常生活中&#xff0c;我們經常會遇到一些“快如閃電”的事物&#xff1a;比如那場突如其來的雨、那個突然出現在你眼前的前任、還有就是今天我們要聊的——固態硬盤&#xff08;SSD&#xff09;。 如果你是一個技術宅&#xff0c;或者對速度有著近乎偏執的追求&…

電阻知識總結與詳細選型指南

目錄 1. 基礎知識 1.1 電阻的定義和符號 1.2 電阻的公式 1.3 電阻的串聯與并聯 2. 參數選型 2.1 電阻值 2.2 功率 2.3 精度 2.4 溫度系數 2.5 電壓系數 2.6 包裝類型 2.7 耐壓 2.8 特殊應用需求 2.9 環保要求 3. 產品應用 3.1 電流限制和保護 3.2 電壓分壓和電…

【Qt開發流程】之容器類1:介紹及常用容器類和使用Java風格迭代器進行遍歷

概述 Qt庫提供了一組通用的基于模板的容器類。這些類可用于存儲指定類型的項。例如&#xff0c;如果需要一個可調整大小的QString數組&#xff0c;可以使用QVector<QString>。 這些容器類被設計成比STL容器更輕、更安全、更易于使用。如果不熟悉STL&#xff0c;或者更喜…

低多邊形3D建模石頭材質紋理貼圖

在線工具推薦&#xff1a; 3D數字孿生場景編輯器 - GLTF/GLB材質紋理編輯器 - 3D模型在線轉換 - Three.js AI自動紋理開發包 - YOLO 虛幻合成數據生成器 - 三維模型預覽圖生成器 - 3D模型語義搜索引擎 當談到游戲角色的3D模型風格時&#xff0c;有幾種不同的風格&#xf…

云計算在計算機領域的應用與發展

云計算在計算機領域的應用與發展 一、引言 隨著科技的不斷發展&#xff0c;計算機領域已經成為當今社會最為活躍和創新的領域之一。云計算作為一種新興的計算模式&#xff0c;已經在計算機領域中得到了廣泛的應用&#xff0c;并且正在不斷地推動著計算機領域的發展。本文將探…

Ultimate VFX

Ultimate VFX 構建套件:

【利用二手車數據進行可視化分析】

利用二手車數據進行可視化分析 查看原始數據去除重復數據需求分析1.統計全國總共有多少量二手車&#xff0c;用KPI圖進行展示2.統計安徽總共有多少量二手車&#xff0c;用KPI圖進行展示3.統計合肥總共有多少量二手車&#xff0c;用KPI圖進行展示4.取最貴的10輛二手車信息&#…

web,Apache簡述

一.HTTP請求訪問的完整過程 1.建立連接 2.接收請求 3.處理請求 4.訪問資源 服務器獲取請求報文中請求的資源web服務器&#xff0c;即存放了web資源的服務器&#xff0c;負責向請求者提供對方請求的靜態資源&#xff0c;或動態運行后生成的資源 靜態資源&#xff1a;不需要…

C語言 內聯函數 + 遞歸函數

函數分類 內聯函數 1&#xff09;內聯函數在編譯時將函數的代碼直接插入到調用它的地方&#xff0c;而不是通過函數調用的方式執行&#xff0c;從而減少了函數調用的開銷&#xff0c;提高了代碼的執行速度 2&#xff09;使用 inline 關鍵字來聲明 3&#xff09;將函數聲明為內聯…

小目標檢測模型設計的一點思考

1. 小目標的特性 目標之間的交疊概率比較低&#xff0c;即使有交疊&#xff0c;其IoU多數情況下也是比較小的 AI-TOD Tiny Person Dateset 小目標自身的紋理顯著度有強弱區別&#xff0c;但是總體來說紋理特征都較弱&#xff0c;很多時候需要借助一定的圖像上下文來幫助確認 …

Java解決島嶼周長問題

Java解決島嶼周長問題 01 題目 給定一個 row x col 的二維網格地圖 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陸地&#xff0c; grid[i][j] 0 表示水域。 網格中的格子 水平和垂直 方向相連&#xff08;對角線方向不相連&#xff09;。整個網格被水完全包圍&am…

ssm校園論壇管理系統項目分享

校園論壇管理系統是基于java編程語言&#xff0c;mysql數據庫&#xff0c;ssm框架和idea工具開發&#xff0c;本系統主要分為學生用戶&#xff0c;管理員兩個角色&#xff0c;其中用戶可以注冊登陸系統&#xff0c;在線發帖&#xff0c;查看欄目帖子&#xff0c;回復帖子&#…

某音上很火的圣誕樹分享

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 效果截圖&#xff08;這里不給動態了&#xff0c;某音到處都是了&#xff09;&#xff1a; 源代碼&#xff1a; <script src"…

Spring Boot 3 集成 MyBatis詳解

MyBatis是一款開源的持久層框架&#xff0c;它極大地簡化了與數據庫的交互流程。與類似Hibernate的ORM框架不同&#xff0c;MyBatis更具靈活性&#xff0c;允許開發者直接使用SQL語句與數據庫進行交互。Spring Boot和MyBatis分別是兩個功能強大的框架&#xff0c;它們的協同使用…