手寫自己的MyBatis框架-SqlSession

Leon_Jinhai_Sun發表於2020-12-14

我們已經分析了MeBatis 的主要物件和操作流程,應該從哪裡入手?

當我們在psvm 操作的時候,第一個需要的物件是SqlSession。所以我們從應用層的介面SqlSession 入手。

那麼我們先來建立一個package,它是我們手寫的MeBatis ,我們建一個包叫mebatis。

首先我們建立一個自己的SqlSession,叫SqlSession。

根據我們剛才總結的流程圖,SqlSession 需要有一個獲取代理物件的方法,那麼這個代理物件是從哪裡獲取到的呢?是從我們的配置類裡面獲取到的,因為配置類裡面有介面和它要產生的代理類的對應關係。

所以,我們要先持有一個Configuration 物件,叫GPConfiguration,我們也建立這個類。除了獲取代理物件之外,Configuration 裡面還儲存了我們的介面方法(也就是statementId)和SQL 語句的繫結關係。

第二個,我們在SqlSession 中定義的運算元據庫的方法,最後都會呼叫Executor去運算元據庫,所以我們還要持有一個Executor 物件,叫Executor,我們也建立它。

// SqlSession.java
private Configuration configuration;
private Executor executor;

除了這兩個屬性之外,我們還要定義SqlSession 的行為,也就是它的主要的方法。

第一個方法是查詢方法,selectOne(),由於它可以返回任意型別,我們把返回值定義成<T> T 泛型。selectOne()有兩個引數,一個是String 型別的statementId,我們會根據它找到SQL 語句。一個是Object 型別的parameter 引數(可以是Integer 也可以是String 等等,任意型別),用來填充SQL 裡面的佔位符。

它會呼叫Executor 的query()方法,所以我們建立Executor 類,傳入這兩個引數,一樣返回一個泛型。Executor 裡面要傳入SQL,但是我們還沒拿到,先用statementId代替。

// SqlSession.java
public <T> T selectOne(String statementId, Object parameter){
	String sql = statementId; // 先用statementId 代替SQL
	return executor.query(sql, parameter);
}
// Executor.java
public <T> T query(String sql, Object paramater ) {
	return null;
}

第二個方法是獲取代理物件的方法,我們通過這種方式去避免了statementId 的硬編碼。

我們在SqlSession 中建立一個getMapper()的方法,由於可以返回任意型別的代理類,所以我們把返回值也定義成泛型<T> T。我們是根據介面型別獲取到代理物件的,所以傳入引數要用型別Class。

// SqlSession.java
public <T> T getMapper(Class clazz){
	return null;
}

 

相關文章