今天是周六,因為 小白云 要出去寫生畫畫羽莺,我在家閑著也沒事实昨,正好來公司練習(xí)下造輪子的能力。
昨天正好跟著 詹哥 學(xué)習(xí)了基本的Mybatis原理盐固,上午首先畫個思維導(dǎo)圖鞏固一下理解荒给,吃完飯下午就開始擼代碼。
這里分享下早上畫的圖:
思維導(dǎo)圖中還有一些細節(jié)步驟沒展示出來刁卜,下面是導(dǎo)出的文本志电,可以按照流程實現(xiàn):
框架設(shè)計分析
接口如何設(shè)計
-
SqlSession接口(CRUD)
- Object selectOne(String statementId, Object param)
- void insert(String statementId, Object param)
- ...(剩余接口)
DefaultSqlSession作為實現(xiàn)類
配置文件編寫格式
-
直接參考mybatis本身配置文件的編寫
全局配置文件,配置數(shù)據(jù)源ds
-
mapper映射文件
配置SQL語句,一個SQL語句對應(yīng)一個statement執(zhí)行蛔趴,每個statement都有一個唯一的idSQL語句
參數(shù)
映射對象
讀取全局配置文件
將其中信息封裝到一個對象Configuration
- DataSource信息
- Map<String,MappedStatement>
讀取映射配置文件
-
多個MappedStatement
(對應(yīng)映射配置文件中的一個標簽)- sql語句
- statement類型
- 輸入?yún)?shù)類型
- 輸出結(jié)果類型
接口實現(xiàn)類功能如何實現(xiàn)
-
a. 獲取連接
- 通過Configuration獲取DataSource
- 通過DataSource獲取Connection
-
b. 執(zhí)行Statement操作
要考慮執(zhí)行的是哪種Statement挑辆,不同的Statement,操作不同孝情,參數(shù)設(shè)置不同鱼蝉,結(jié)果處理也不同
-
獲取Statement類型
根據(jù)StatementId去Configuration查找對應(yīng)的MappedStatement,根據(jù)Statement對象獲取statementType類型
-
通過MappedStatement獲取sql語句
SELECT * FROM user where id = #{id} and username = #{username}
SQL語句:SELECT * FROM user where id = ? and username= ?
解析占位符參數(shù)List<ParameterMapping>
ParameterMapping(參數(shù)名稱)
解析#{}中的參數(shù)名稱:id -
給SQL語句設(shè)置參數(shù)
遍歷List<ParameterMapping>挨個處理入?yún)?/p>
獲取入?yún)⒌腏ava類型箫荡,根據(jù)類型(8種基本類型魁亦、String類型、POJO類型等)判斷如何獲取參數(shù)值
比如說如果是Integer類型羔挡,則只有將入?yún)ο笾苯淤x值給SQL語句即可
preparedStatement.setObject(1, "王五");如果是POJO類型洁奈,通過反射根據(jù)參數(shù)名稱獲取POJO對象的屬性值
preparedStatement.setObject(1, "王五"); -
執(zhí)行statement
rs = preparedStatement.executeQuery();
-
處理結(jié)果集
獲取要封裝的java對象類型(Class對象)
通過MappedStatement對象獲取結(jié)果映射的Java類型遍歷結(jié)果集,取出結(jié)果集中的每條結(jié)果的列名
通過rs獲取metaData(列名)根據(jù)列名通過反射獲取java對象中的field名稱
要求:SQL語句的列名一定要和java對象中的屬性名稱一致婉弹。
通過反射給指定field賦值
-
配置文件如何解析
-
dom4j
指定要解析的配置文件的路徑(類路徑睬魂、磁盤路徑、網(wǎng)絡(luò)路徑)---Resource
通過類加載器去指定路徑加載镀赌,放入 InputStream流對象氯哮,讀取Source資源中的數(shù)據(jù)
通過InputStream流對象,去創(chuàng)建Document對象(dom4j)---此時沒有針對xml文件中的語義進行解析
DocumentReader---去加載InputStream流商佛,創(chuàng)建Document對象的
進行mybatis語義解析(全局配置文件語義解析喉钢、映射文件語義解析)
XMLConfigParser---解析全局配置文件
XMLMapperParser---解析全局配置文件
SqlSession如何創(chuàng)建
通過工廠模式SqlSessionFactory創(chuàng)建
SqlSessionFactory如何創(chuàng)建
使用構(gòu)建者模式,SqlSessionFactoryBuiler
今天花了一天時間良姆,整理加實現(xiàn)肠虽,目前只實現(xiàn)了mapper映射文件的select標簽支持,后續(xù)有時間會繼續(xù)完善玛追,原理其實都一樣的税课。這也證實了闲延,起碼框架源碼并沒有那么難讀,行動起來韩玩,總會有收獲垒玲。
感興趣的朋友可以看下我今天造的輪子: 代碼地址: https://github.com/ccgogoing/01-mybatis
水平有限,記錄自己的學(xué)習(xí)過程找颓,歡迎大家一起交流學(xué)習(xí)合愈。