MyBatis 簡介

MyBatis 簡介

MyBatis 是一款優秀的持久層框架,它支持定制化 SQL、存儲過程以及高級映射,能夠幫助開發者將 Java 對象與數據庫表進行靈活映射,簡化數據持久化操作。以下從多個維度詳細介紹 MyBatis:

一、核心定位與優勢
  1. 輕量級框架:相比 Hibernate 等全自動 ORM 框架,MyBatis 更“輕”,開發者需手動編寫 SQL 語句,靈活性更高,便于優化性能。
  2. ORM 映射功能:通過 XML 或注解方式,將 Java 對象與數據庫表字段映射,減少手動編寫 JDBC 代碼的繁瑣工作。
  3. 性能優化友好:開發者可完全控制 SQL 語句,便于針對復雜查詢或性能瓶頸進行優化,適合對性能要求高的項目。
  4. 兼容多種數據庫:支持 MySQL、Oracle、SQL Server 等主流數據庫,通過切換方言實現跨數據庫適配。
二、核心組件與架構
  1. SqlSessionFactory
    • 負責創建 SqlSession 實例,是 MyBatis 的入口,通過讀取配置文件(如 mybatis-config.xml)初始化。
  2. SqlSession
    • 提供數據庫操作方法(如 selectOneinsert 等),是 MyBatis 執行 SQL 的核心接口,類似 JDBC 中的 Connection
  3. Mapper 接口與映射文件
    • Mapper 接口:定義數據庫操作方法(如 User selectById(int id))。
    • 映射文件(XML 或注解):實現接口方法與 SQL 的綁定,例如在 XML 中配置 selectinsert 等標簽。
  4. TypeHandler
    • 處理 Java 類型與數據庫類型的轉換,支持自定義類型轉換邏輯。
三、核心工作流程
  1. 初始化階段
    • 讀取 MyBatis 配置文件,創建 SqlSessionFactory
  2. 數據庫操作階段
    • 通過 SqlSessionFactory 獲取 SqlSession
    • 調用 Mapper 接口方法,MyBatis 解析映射文件,將方法參數與 SQL 語句綁定(如 #{id} 替換為實際參數)。
    • 執行 SQL 并返回結果,結果通過映射規則轉換為 Java 對象。
  3. 資源釋放階段
    • 關閉 SqlSession,釋放數據庫連接。
四、關鍵特性
  1. 動態 SQL
    • 通過 ifwhereforeach 等標簽在 XML 中編寫動態 SQL,適配不同查詢條件(例如根據參數是否為空拼接 WHERE 子句)。
  2. 結果映射(ResultMap)
    • 處理復雜的對象關系映射,如一對一(association)、一對多(collection)關聯查詢,避免手動封裝結果集。
  3. 緩存機制
    • 一級緩存:基于 SqlSession 的本地緩存,默認開啟,提高同一會話內的重復查詢效率。
    • 二級緩存:基于 namespace 的全局緩存,需手動配置,適用于頻繁查詢且數據更新頻率低的場景。
  4. 插件擴展(Interceptor)
    • 支持自定義插件(如分頁插件、SQL 性能監控插件),擴展 MyBatis 功能(如 PageHelper 插件實現分頁查詢)。
五、應用場景
  • 復雜業務場景:需要編寫復雜 SQL(如多表聯合查詢、存儲過程)的項目。
  • 性能敏感系統:開發者可手動優化 SQL,避免全自動 ORM 框架的性能損耗。
  • 遺留系統改造:適配已有數據庫結構,無需強制修改表設計。
六、與其他框架對比
框架MyBatisHibernateSpring JDBC
SQL 控制手動編寫,靈活性高全自動生成,靈活性低手動編寫,類似 JDBC
學習成本中等(需掌握 SQL 和映射規則)高(需掌握 ORM 概念和 HQL)低(接近 JDBC)
性能優(手動優化 SQL)中(自動生成 SQL 可能存在冗余)優(直接操作 JDBC)
適合場景復雜查詢、性能要求高快速開發、簡單 CRUD輕量級項目、底層工具封裝
七、入門示例(XML 配置方式)
  1. pom.xml 依賴
    <dependency>  <groupId>org.mybatis</groupId>  <artifactId>mybatis</artifactId>  <version>3.5.10</version>  
    </dependency>  
    
  2. mybatis-config.xml 配置
    <configuration>  <environments default="development">  <environment id="development">  <transactionManager type="JDBC" />  <dataSource type="POOLED">  <property name="driver" value="com.mysql.jdbc.Driver" />  <property name="url" value="jdbc:mysql://localhost:3306/test" />  <property name="username" value="root" />  <property name="password" value="123456" />  </dataSource>  </environment>  </environments>  <mappers>  <mapper resource="mapper/UserMapper.xml" />  </mappers>  
    </configuration>  
    
  3. Mapper 接口與映射文件
    // UserMapper.java  
    public interface UserMapper {  User selectById(int id);  
    }  
    
    <!-- UserMapper.xml -->  
    <mapper namespace="com.example.mapper.UserMapper">  <select id="selectById" resultType="com.example.entity.User">  SELECT id, name, age FROM user WHERE id = #{id}  </select>  
    </mapper>  
    
  4. 代碼調用
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsStream("mybatis-config.xml"));  
    try (SqlSession sqlSession = factory.openSession()) {  UserMapper mapper = sqlSession.getMapper(UserMapper.class);  User user = mapper.selectById(1);  System.out.println(user);  
    }  
    
八、發展與生態

MyBatis 最初由 Apache 孵化,后獨立為 MyBatis-GitHub 項目,目前最新版本為 3.5.x。其生態豐富,包括:

  • Spring Boot 集成:通過 mybatis-spring-boot-starter 簡化配置。
  • 代碼生成工具:如 MyBatis Generator(MBG)自動生成實體類、Mapper 接口和映射文件。
  • 社區插件:PageHelper(分頁)、MyBatis-Plus(增強版,簡化 CRUD)等。

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

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

相關文章

自監督學習在合成孔徑聲吶目標識別中的應用之論文閱讀

自監督學習在合成孔徑聲吶目標識別中的應用 BW Sheffield 美國巴拿馬城海軍水面作戰中心 1 引言 在自主水下航行器(AUVs)中應用計算機視覺面臨著獨特的挑戰,因為海洋環境往往條件不可預測且極為嚴苛。傳統計算機視覺研究主要依賴光學相機成像,而在光照不足、懸浮沉積物及水…

進程間通信2(命名管道)linux

1 命名管道 前面講到匿名管道&#xff0c;有一個很大的限制&#xff0c;那就是只有具有相同祖先&#xff08;具有親緣關系&#xff09;的進程間才能進行通信&#xff0c;但是如果想實現不同進程間的通信&#xff0c;這個時候命名管道就發揮著巨大作用。 命名管道是一種特殊類…

簡單通過SenseVoice給自己配置一個語音轉文字服務

首先把代碼下載下來 gitgithub.com:FunAudioLLM/SenseVoice.git 然后寫一個docker文件 FROM ubuntu:latestRUN apt-get update -y RUN apt-get install -y python3-full python3-pip RUN mkdir -p /SenseVoice WORKDIR /SenseVoice RUN python3 -m venv . ENV USE_CUDA0 EXP…

網絡釣魚攻擊

?根據2023年Proofpoint年度網絡釣魚報告顯示&#xff1a;91%的針對性攻擊始于釣魚郵件&#xff0c;平均每30秒就有一個企業成為攻擊目標&#xff0c;全球損失超過$6.5B? 一、釣魚攻擊技術深度解析 1. 釣魚攻擊核心技術架構 2. 現代釣魚技術演進 ?攻擊向量升級路線? ?當前…

uvicorn api:app --host 0.0.0.0 --port 7777容器運行失敗

docker logs pycorrector-container-gpu 你這個報錯的核心是&#xff1a; ERROR: Error loading ASGI app, Could not import module "api".這說明&#xff1a; uvicorn api:app 沒有找到 api.py 文件&#xff0c;或者沒法導入 app 對象。 &#x1f50d; 一步步排查…

熱成像儀測MOSFET溫度

熱成像儀測MOSFET溫度 根據提供的搜索結果&#xff0c;熱測量方法主要分為非接觸式和接觸式兩大類&#xff0c;針對不同材料特性和測量場景各有優勢。以下是核心方法的總結及關鍵技術要點&#xff1a; &#x1f525; 一、非接觸式熱測量方法 紅外熱成像技術 原理&#xff1a;通…

Dagster資產元數據與標簽:數據治理的利器

在現代數據棧中&#xff0c;有效的數據治理至關重要。Dagster作為領先的數據編排平臺&#xff0c;提供了強大的資產元數據和標簽功能&#xff0c;幫助團隊更好地理解、組織和跟蹤數據資產。本文將深入探討Dagster中的資產元數據和標簽功能&#xff0c;展示如何利用這些功能提升…

基于物聯網的智能飲水機系統設計

標題:基于物聯網的智能飲水機系統設計 內容:1.摘要 隨著物聯網技術的快速發展&#xff0c;智能設備在日常生活中的應用越來越廣泛。本研究的目的是設計一種基于物聯網的智能飲水機系統&#xff0c;以提高飲水機的使用便捷性和智能化程度。方法上&#xff0c;通過傳感器實時監測…

DP讀書:NEC年終小結和顯示器【明基rd28u】

一點真實體驗_寫在ROBOCON2025國賽前 很久沒有寫這種關于感受的博客了&#xff0c;就用真實感受的角度來看看一次眾測的經歷&#xff0c;哈哈^ 差不多一個月前&#xff0c;我收到了明基的28寸顯示器&#xff0c;體驗了差不多2周左右&#xff0c;一直把顯示器掛在實驗室倉庫La…

Solana 一鍵冷分倉機制詳解:如何用技術手段構建健康的持倉結構

在 Solana 的快速發幣環境中&#xff0c;許多項目方在成功部署代幣后&#xff0c;會面臨一個共通問題——如何避免持倉結構過于集中。無論是初始鑄造的 Token、流動性預留份額&#xff0c;還是空投分發的準備金&#xff0c;如果長時間停留在單一錢包地址中&#xff0c;將在鏈上…

【智能體】dify部署本地步驟

從git克隆倉庫到本地 git clone https://github.com/langgenius/dify.git設置環境變量 cd dify cd docker cp .env.example .envdocker啟動 docker compose up -d在瀏覽器打開網址 http://localhost/install 登錄后即可使用

開源鴻蒙6.0 Beta1版本發布!深圳觸覺智能即將適配RK3566/RK3568/RK3576/RK3588等芯片

開放原子開源鴻蒙&#xff08;OpenAtom OpenHarmony&#xff0c;簡稱“開源鴻蒙”或“OpenHarmony”&#xff09;6.0 Beta1版本正式發布。相比5.1.0 Release版本進一步增強ArkUI組件能力&#xff0c;提供更安全、更靈活的組件布局&#xff1b;增強分布式數據管理能力&#xff0…

機器學習 (ML) 基礎入門指南

一、機器學習概述 &#xff08;一&#xff09;定義 在當今科技飛速發展的時代&#xff0c;機器學習作為人工智能的一個重要分支&#xff0c;正深刻地改變著我們的生活和工作方式。根據機器學習泰斗、卡耐基梅隆大學的湯姆米切爾 (Tom Mitchell) 教授的定義&#xff0c;機器學…

基于ARM ubuntu如何進行交叉編譯

場景總結&#xff1a; 平臺&#xff1a;x86 主機 工具鏈&#xff1a;aarch64-linux-gnu-gcc&#xff08;用于編譯 64-bit ARM 程序&#xff09; 目標&#xff1a;讓 gcc 自動使用 ARM Ubuntu rootfs 中的頭文件和庫&#xff08;位于 /opt/arm64-ubuntu&#xff09; 不希望每…

java+vue+SpringBoo社區藥房系統(程序+數據庫+報告+部署教程+答辯指導)

源代碼數據庫LW文檔&#xff08;1萬字以上&#xff09;開題報告答辯稿ppt部署教程代碼講解代碼時間修改工具 技術實現 開發語言&#xff1a;后端&#xff1a;Java 前端&#xff1a;vue框架&#xff1a;springboot數據庫&#xff1a;mysql 開發工具 JDK版本&#xff1a;JDK1.…

VS2022打Unity中的腳本斷點時出現當前不會命中斷點,找不到相應位置

今天遇到一個很傻的問題&#xff0c; 在新電腦中安裝了Unity和VS2022后&#xff0c;在Unity中打開一個新腳本&#xff0c;打斷點時報警告&#xff0c;如下&#xff1a; 原來在Unity中新建的腳本&#xff0c;如果沒有被使用&#xff0c;就會出現找不到位置的錯誤&#xff01; 反…

UVA489劊子手游戲

UVA489 劊子手的游戲 Hangman Judge - 洛谷 #include <bits/stdc.h> using namespace std;bool arr[26]; int main() {int n;while (cin >> n && n ! -1){string s1, s2;memset(arr, 0, sizeof(arr));cout << "Round " << n <&l…

bat腳本抓取android日志

一 通過bat腳本抓取日志到windows電腦本地 1 通過包名抓取日志 echo off chcp 65001 >nul echo 獲取 com.starauto.ac 的 PID… FOR /F “delims” %%i IN (‘adb shell pidof com.starauto.ac’) DO set PID%%i echo 當前 PID: %PID% echo 開始抓取日志&#xff0c;僅限…

java開發為什么要分層

在 Java 開發中,分層架構(Layered Architecture)是一個常見的設計模式,它將系統分為不同的層級(如表示層、業務邏輯層、數據訪問層等),每個層次都有不同的職責和功能。分層架構的設計能夠帶來很多好處,下面是一些主要原因: 1. 提高代碼的可維護性 模塊化:通過將系統…

通達信 主力攻擊信號系統幅圖指標

通達信 主力攻擊信號系統幅圖指標 用法說明: 該指標用于識別股票或交易品種在短期內的主力資金介入信號,結合趨勢強度及多維度技術條件,幫助投資者捕捉潛在的上漲機會。 核心邏輯: 趨勢確認:要求價格處于20日均線之上,且均線呈上升態勢,確保短期趨勢偏多。 多信號共振…