mybatis介面程式設計原理解析一
一、介面程式設計的引入
在mybatis引入介面程式設計之前,我們可以回顧一下mybatis程式設計開始的幾大步驟:
1、通過SqlSessionFactoryBuilder建立SqlSessionFactory物件:
這裡巢狀使用了建造者模式,主要涉及到兩個建造者類:XMLConfigBuilder、SqlSessionFactoryBuilder。我們可以看下面一段原始碼:
上面紅色方框中標出來的就是兩個建造者的建造方法,首先是XMLConfigBuilder通過parse()方法對mybatis的配置檔案進行解析,建造Configuration物件;將這個配置物件作為SqlSessionFactoryBuilder建造者build()方法的入參,構建SqlSessionFactory物件,注意這裡最後建立的是SqlSessionFactory的一個實現類物件DefaultSqlSessionFactory物件。
2、通過上面的SqlSessionFactory例項物件建立SqlSession物件:
這裡採用的工廠方法,看下面的原始碼:
通過工廠方法最終建立一個SqlSession的實現類物件DefaultSqlSession物件。
3、得到SqlSession物件後就可以通過其介面方法呼叫相應的sql語句去執行:
這裡以selectOne(String statement, Object parameter)方法為例,在這個方法中我們需要傳入SQL的id,是一個字串型別的引數,而SQL的id是在mapper配置檔案中以namespace+id的形式進行標識的,這也是之所以要求mapper配置檔案中namespace+id要唯一的原因。第二個是需要傳入的引數,注意這裡是一個Object物件,也就是說我們傳入任何引數都是可以通過編譯的,但是如果我們傳入的引數與最終mapper配置檔案中的執行SQL語句所需要的引數不匹配,那麼在執行時就會報錯,也就是說無法將風險暴露在編譯期。
二、引入介面程式設計的原因
相信有了上面步驟3的論述,引入介面程式設計的原因就很清楚了,使用介面程式設計可以規避傳參型別的風險,介面方法中需要什麼型別的引數你就得傳什麼型別的引數,不然在編譯期就會報錯,同時,上面使用sqlsession物件的方式程式設計對應用程式的編寫者來說非常不直觀,而對Object物件的封裝也要遵循mybatis規範,而介面式程式設計完全面向物件,所以優勢明顯。
思考:我們在mybatis介面程式設計中只定義了介面,沒有定義介面的實現類,最終卻呼叫的是介面的方法,這不就違背了java語法了嗎?答案肯定是沒有違背java語法的,既然能正常執行,一定是符合語法規範的,至於為什麼我們可以猜想肯定是mybatis給我們做了特殊處理,在這裡我們先說出這個特殊處理的核心:反射與動態代理。下一篇文章中將會詳細解析其是怎麼實現的。