Mybatis執行原生SQL

Mybatis作為一款優秀的ORM框架,除了支持對象與關係數據庫之間映射外,還支持開發人員自由編寫SQL語句。本文將以Mybatis執行原生SQL為中心,從鎖、SQL語句的執行、Mybatis執行原理以及執行流程這四個方面進行詳細闡述。

一、鎖

在多個並發事務同時修改同一數據時,數據庫需要通過一定的方法來維持事務的隔離性,防止數據異常。鎖是維護數據庫並發事務細粒度和隔離性的重要手段之一,為了保證數據的正確性和一致性,應盡量使用鎖。Mybatis支持使用數據庫提供的鎖形式來進行並發控制。

Mybatis支持在Mapper.xml文件中通過select … for update的方式實現悲觀鎖和樂觀鎖,對於需要鎖定的數據,在SQL語句中要使用FOR UPDATE子句,如下例:

  
  <select id="selectForUpdate" parameterType="java.lang.Integer" 
  resultType="com.example.demo.model.User">
    select * from user where id = #{id} for update
  </select>
  

這種方式適用於需要鎖住一部分數據,使其不被其他事務修改的場景,和防止讀臟數據的情況發生。

二、SQL語句的執行

Mybatis將SQL的執行過程分為解析階段、綁定階段、執行階段、結果集處理階段四個步驟。

1. 解析階段

解析Mapper.xml文件中定義的SQL語句,將SQL語句分解成各個部分,如:語法關鍵字、表名、where子句等。

2. 綁定階段

將SQL語句中的參數進行綁定,Mybatis在綁定時,會將參數值替換到SQL語句中對應的位置,從而構造出可執行的SQL語句。

3. 執行階段

Mybatis通過JDBC連接數據庫,並調用JDBC API執行SQL語句。在執行SQL語句前,Mybatis會進行表前綴和後綴的配置、分頁查詢、多表查詢、存儲過程調用等功能。

4. 結果集處理階段

Mybatis會將JDBC返回的數據轉換為Java對象,並通過映射文件或註解將數據封裝到對象中,最後返回給上層調用者。

三、Mybatis執行原理

Mybatis執行原理是通過調用SqlSession對象的API來實現的。執行原生SQL一般分為以下幾步:

1. 獲取SqlSessionFactory對象

SqlSessionFactory是創建SqlSession實例的工廠類,Mybatis的啟動過程中加載Mapper解析配置文件,生成SqlSession工廠實例。

  
  String resource = "mybatis-config.xml";
  InputStream inputStream = Resources.getResourceAsStream(resource);
  SqlSessionFactory sqlSessionFactory = new 
       SqlSessionFactoryBuilder().build(inputStream);
  

2. 打開SqlSession

通過SqlSessionFactory打開一個數據連接,SqlSession就是進行數據庫操作的關鍵對象。操作完後一定要記得關閉。

  
  SqlSession sqlSession = sqlSessionFactory.openSession();
  

3. 執行查詢

SqlSession有多個方法對應不同的查詢方式。我們可以通過selectOne或selectList來執行查詢,其中selectOne返回單個對象,selectList返回對象列表。

  
  User user = sqlSession.selectOne("com.example.demo.UserMapper.selectById", 1);
  List userList = sqlSession.selectList("com.example.demo.UserMapper.selectAll");
  

4. 提交事務、關閉SqlSession

當數據庫操作結束後,需要提交事務,也就是確認對數據庫的修改。如果SqlSession未提交,則所做的修改不會被寫入到數據庫。最後一定要關閉SqlSession。

  
  sqlSession.commit();
  sqlSession.close();
  

四、Mybatis執行原理流程

Mybatis執行原理的整個流程如下圖所示:

從圖中可以看出,Mybatis執行原理的流程比較簡單,可以輕鬆理解和掌握。

總結

本文從鎖、SQL語句的執行、Mybatis執行原理以及執行流程這四個方面詳細闡述了Mybatis執行原生SQL的相關知識。在實際的開發中,需要根據具體的情況選擇獲取SqlSessionFactory對象、打開SqlSession、執行查詢以及提交事務等操作。同時,在SQL語句的編寫中,也需要注意防止SQL注入攻擊等問題,保證代碼的安全性。

原創文章,作者:DHQIN,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/349393.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
DHQIN的頭像DHQIN
上一篇 2025-02-15 17:09
下一篇 2025-02-15 17:10

相關推薦

  • Hibernate日誌打印sql參數

    本文將從多個方面介紹如何在Hibernate中打印SQL參數。Hibernate作為一種ORM框架,可以通過打印SQL參數方便開發者調試和優化Hibernate應用。 一、通過配置…

    編程 2025-04-29
  • 使用SQL實現select 聚合查詢結果前加序號

    select語句是數據庫中最基礎的命令之一,用於從一個或多個表中檢索數據。常見的聚合函數有:count、sum、avg等。有時候我們需要在查詢結果的前面加上序號,可以使用以下兩種方…

    編程 2025-04-29
  • 理解Mybatis中的SQL Limit用法

    Mybatis是一種非常流行的ORM框架,提供了SQL映射配置文件,可以使用類似於傳統SQL語言的方式編寫SQL語句。其中,SQL的Limit語法是一個非常重要的知識點,能夠實現分…

    編程 2025-04-29
  • SQL預研

    SQL預研是指在進行SQL相關操作前,通過數據分析和理解,確定操作的方法和步驟,從而避免不必要的錯誤和問題。以下從多個角度進行詳細闡述。 一、數據分析 數據分析是SQL預研的第一步…

    編程 2025-04-28
  • SQL Server Not In概述

    在今天的軟件開發領域中,數據庫查詢不可或缺。而SQL Server的”Not In”操作符就是這個領域中非常常用的操作符之一。雖然”Not In…

    編程 2025-04-25
  • GORM SQL注入詳解

    GORM是一個非常優秀的Go語言ORM框架,它的目標是簡化數據庫操作,提高開發效率,但是在使用的過程中,也難免會遇到SQL注入的問題。本文將從多個方面來詳細解析GORM SQL注入…

    編程 2025-04-25
  • SQL ROW_NUMBER 函數用法

    一、實現排序 SQL ROW_NUMBER 函數是 SQL Server 數據庫實現分組排序功能的一種方法,允許您根據一個或多個列進行排序。這是 SQL ROW_NUMBER 的一…

    編程 2025-04-25
  • SQL Server時間差詳解

    一、DATEDIFF函數 DATEDIFF函數可用於計算兩個時間之間的差值,其語法如下: DATEDIFF (datepart, startdate, enddate) 其中,da…

    編程 2025-04-25
  • SQL AND OR 優先級詳解

    一、AND 和 OR 的應用場景 AND 和 OR 作為 SQL 查詢語句中最常用的邏輯運算符,它們可以幫助我們更快、更方便地篩選出相應條件下的數據。AND 主要用於多條件的組合查…

    編程 2025-04-25
  • TrimSql:一個SQL構建器的探究

    一、簡介 TrimSql是一個用於構建SQL語句的Java庫。它具有極高的可讀性和可維護性,同時提供了多種構建SQL語句的方法,包括動態參數、命名參數等。它還支持多種數據庫,並且易…

    編程 2025-04-25

發表回復

登錄後才能評論