您當前的位置:首頁 > 舞蹈

spring整合mybatis之後,如何除錯mybatis的程式碼?

作者:由 Hello world 發表于 舞蹈時間:2022-03-20

spring整合mybatis之後,如何除錯mybatis的程式碼?逗破蒼穹2022-03-20 16:42:45

一堆代理鏈,你不關心怎麼走代理鏈的情況下,那就要知道mybatis交給spring管理以後的核心元件了,首先mapper注入到容器中的物件,是MapperFactoryBean,透過getObject()獲取到mapper介面注入到容器,這裡其實已經是隻有mybatis的元件了,

spring整合mybatis之後,如何除錯mybatis的程式碼?

交給容器管理以後,sqlsession的實現類也不是DefaultSqlSession,而是SqlSessionTemplate,

spring整合mybatis之後,如何除錯mybatis的程式碼?

而SqlSessionTemplate又是透過jdk代理SqlSessionInterceptor,生成真正執行時的委託類DefaultSqlSession,繞了一圈才回到DefaultSqlSession來,到這裡就是mybatis的底層元件了

spring整合mybatis之後,如何除錯mybatis的程式碼?

spring整合mybatis之後,如何除錯mybatis的程式碼?

spring整合mybatis之後,如何除錯mybatis的程式碼?小馬學Java2022-04-01 13:53:49

mybatis原始碼解讀:transaction包(事務管理功能)

mybatis的transaction包是負責進行事務管理的包,該包內包含2個子包:jdbc子包中包含基於jdbc進行事務管理的類,managed子包中包含基於容器進行事務管理的類。

1。事務概述

事務即資料庫事務,是資料庫執行過程中的一個邏輯單元。事務有以下4個特性:

Atomicity(原子性):事務必須被作為一個整體執行,要麼全部執行, 要麼全部不執行。不允許只執行其中的一部分。

Consistency(一致性):事務應該保證資料庫從一致性狀態轉換到另一個一致性狀態。一致性狀態是指資料庫中資料的完整性約束。

Isolation(隔離性):多個事務併發執行時, 事務不會互相干擾。

Durability(永續性):一旦事務提交,則其所做的修改就會永久儲存到資料庫中。

2。事務介面及工廠

整個transaction包採用了工廠方法模式實現,TransactionFactory是所有事務工廠的介面。

public interface TransactionFactory {

/**

* 配置工廠的屬性

* @param props 工廠的屬性

*/

default void setProperties(Properties props) {

// NOP

}

/**

* 從給定的連線中獲取一個事務

* @param conn 給定的連線

* @return 獲取的事務物件

*/

Transaction newTransaction(Connection conn);

/**

* 從給定的資料來源中獲取事務,並對事務進行一些配置

* @param dataSource 資料來源

* @param level 資料隔離級別

* @param autoCommit 是否自動提交事務

* @return 獲取的事務物件

*/

Transaction newTransaction(DataSource dataSource, TransactionIsolationLevel level, boolean autoCommit);

}

TransactionFactory介面與Transaction介面都有2套實現,分別在jdbc包和managed包中。

3。jdbc事務

jdbc包中存放的是實現jdbc事務的JdbcTransaction類及其對應的工廠類,

JdbcTransaction類是jdbc事務的管理類,具體的事務操作是由JdbcTransaction類直接呼叫Connection類提供的事務方法來完成的。

public class JdbcTransaction implements Transaction {

private static final Log log = LogFactory。getLog(JdbcTransaction。class);

// 資料庫連線

protected Connection connection;

// 資料來源

protected DataSource dataSource;

// 事務隔離級別

protected TransactionIsolationLevel level;

// 是否自動提交事務

protected boolean autoCommit;

public JdbcTransaction(DataSource ds, TransactionIsolationLevel desiredLevel, boolean desiredAutoCommit) {

dataSource = ds;

level = desiredLevel;

autoCommit = desiredAutoCommit;

}

/**

* 提交事務

* @throws SQLException

*/

@Override

public void commit() throws SQLException {

// 連線存在且不會自動提交事務

if (connection != null && !connection。getAutoCommit()) {

if (log。isDebugEnabled()) {

log。debug(“Committing JDBC Connection [” + connection + “]”);

}

// 呼叫connection物件的方法提交事務

connection。commit();

}

}

/**

* 回滾事務

* @throws SQLException

*/

@Override

public void rollback() throws SQLException {

if (connection != null && !connection。getAutoCommit()) {

if (log。isDebugEnabled()) {

log。debug(“Rolling back JDBC Connection [” + connection + “]”);

}

connection。rollback();

}

}

}