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-hk/n/349393.html