MVCC多版本併發控制
思考 https://www.zhihu.com/question/270387939/answer/360487647
https://blog.csdn.net/isea533/category_2092001.html
Mybatis 客戶端呼叫過程
// 載入配置 InputStream inputStream = Resources.getResourceAsStream("mybatis-config.xml"); // 構建核心工廠 SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream, "development"); // 建立會話 SqlSession session = sqlSessionFactory.openSession(); // 動態代理,生成Dao層介面物件 IUser userMapper = session.getMapper(IUser.class);
Executor
執行器 定義瞭如query,update,commit,rollback等資料庫操作的基本方法。
Executor是DefaultSqlSession的成員變數,在openSession時建立,可以指定使用哪個Executor的實現類,未指定預設使用ExecutorType.SIMPLE;也可以通過配置settings.defaultExecutorType屬性來指定預設執行器
CachingExecutor:二級快取執行器(settings.cacheEnabled未配置情況下,預設開啟);使用裝飾器模式,內部引用了BaseExecutor。
BaseExecutor:是SimpleExecutor,ReuseExecutor,BatchExecutor三個執行器的抽象父類。
Plugins
MyBatis 允許你在對映語句執行過程中的某一點進行攔截呼叫。預設情況下,MyBatis 允許使用外掛來攔截的方法呼叫包括:
Executor (update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
ParameterHandler (getParameterObject, setParameters)
ResultSetHandler (handleResultSets, handleOutputParameters)
StatementHandler (prepare, parameterize, batch, update, query)
通過 MyBatis 提供的強大機制,使用外掛是非常簡單的,只需實現 Interceptor 介面,並指定想要攔截的方法簽名即可。
@Intercepts({@Signature(
type= Executor.class,
method = "update",
args = {MappedStatement.class,Object.class})})
public class ExamplePlugin implements Interceptor {
private Properties properties = new Properties();
public Object intercept(Invocation invocation) throws Throwable {
// implement pre processing if need
Object returnObject = invocation.proceed();
// implement post processing if need
return returnObject;
}
public void setProperties(Properties properties) {
this.properties = properties;
}
}
<!-- mybatis-config.xml -->
<plugins>
<plugin interceptor="org.mybatis.example.ExamplePlugin">
<property name="someProperty" value="100"/>
</plugin>
</plugins>
上面的外掛將會攔截在 Executor 例項中所有的 “update” 方法呼叫, 這裡的 Executor 是負責執行底層對映語句的內部物件。
SqlSessionFactoryBuilder
// 構造器
private XMLConfigBuilder(XPathParser parser, String environment, Properties props) {
super(new Configuration()); // 建立Configuration物件
ErrorContext.instance().resource("SQL Mapper Configuration");
this.configuration.setVariables(props);
this.parsed = false;
this.environment = environment;
this.parser = parser;
}
詳細的Configuration配置及屬性含義可以參考官網 https://mybatis.org/mybatis-3/zh/configuration.html