如果只考慮這三點,很容易實現壹個簡單的ORM框架,加上壹些反射和正則表達式就可以了。
那麽如果參考Mybatis,我們來看看它的幾個環節是怎麽設計的:
其實大致思路是壹樣的。妳需要壹個數據結構來存儲所有的變量,並通過接口代理調用Sqlsession中的內置方法。不同的是,真正的執行器又加了壹層,就是執行器,然後通過原來的JDBC把數據返回給調用者。當然,真正的Mybatis包括很多設計模式、數據源、緩存、動態SQL、數據庫事務、延遲加載處理等等。
為了驗證mybatis的執行過程,使用了兩種方式調用接口,如下所示:
& gt
這裏有壹個小點需要強調,真正的執行者是` ` Executor ` ` `,我們每次都使用下面的代碼:
通過查看源代碼,還可以看到SqlSession接口的默認實現類是DefaultSqlSession。
以及方法的實際執行,如selectList方法:
& gt
# {}是預編譯處理,$ {}是字符串替換。當Mybatis處理# {}時,會將sql中的# {}替換為?數字,調用準備好的報表的
設置分配值的方法;
Mybatis在處理的時候,是替換時間,也就是用壹個變量的值替換{}。
使用# {}可以有效防止SQL註入,提高系統安全性。
PS: MyBatis執行的本質是SQL,所以回歸本質可以簡單理解為PreparedStatement和相應的語句。
Dao接口是映射器接口,接口的全限定名是映射文件中namespace的值;接口的方法名是映射文件中映射器的語句的id值;接口方法中的參數是傳遞給sql的參數。
實現原理:mapper接口的工作原理是JDK動態代理。mybatis會為每個Mapper代理生成壹個mapperProxy對象,代理對象會攔截接口方法,接口方法會自動對應sqlsession,最後由' Executor '執行。
``不同的參數,方法不能重載``,為什麽?
如上所述,mybatis有壹個解析XML文件或接口的鏈接,它會構建壹個名為mapperStatement的對象來存儲Mapper的相關信息。每個dao接口方法在執行時是如何定位並找到對應的MapperStatement的?
源邏輯圖: