spring整合mybatis之後,如何除錯mybatis的程式碼?
一堆代理鏈,你不關心怎麼走代理鏈的情況下,那就要知道mybatis交給spring管理以後的核心元件了,首先mapper注入到容器中的物件,是MapperFactoryBean,透過getObject()獲取到mapper介面注入到容器,這裡其實已經是隻有mybatis的元件了,
交給容器管理以後,sqlsession的實現類也不是DefaultSqlSession,而是SqlSessionTemplate,
而SqlSessionTemplate又是透過jdk代理SqlSessionInterceptor,生成真正執行時的委託類DefaultSqlSession,繞了一圈才回到DefaultSqlSession來,到這裡就是mybatis的底層元件了
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();
}
}
}
上一篇:溼疹可以吃中藥嗎?
下一篇:教師結構化面試真題(1-5套)