手写自己的MyBatis框架-SqlSession
我們已經分析了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 代替SQLreturn 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; }?
總結
以上是生活随笔為你收集整理的手写自己的MyBatis框架-SqlSession的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 手写自己的MyBatis框架-操作流程
- 下一篇: 手写自己的MyBatis框架-Confi