手寫MyBatis框架-Java高級架構(gòu)師

今天是周六,因為 小白云 要出去寫生畫畫羽莺,我在家閑著也沒事实昨,正好來公司練習(xí)下造輪子的能力。

昨天正好跟著 詹哥 學(xué)習(xí)了基本的Mybatis原理盐固,上午首先畫個思維導(dǎo)圖鞏固一下理解荒给,吃完飯下午就開始擼代碼。

這里分享下早上畫的圖:

mybatis框架梳理

思維導(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都有一個唯一的id

      SQL語句
      參數(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í)合愈。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市击狮,隨后出現(xiàn)的幾起案子佛析,更是在濱河造成了極大的恐慌,老刑警劉巖彪蓬,帶你破解...
    沈念sama閱讀 211,817評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件寸莫,死亡現(xiàn)場離奇詭異,居然都是意外死亡寞焙,警方通過查閱死者的電腦和手機储狭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,329評論 3 385
  • 文/潘曉璐 我一進店門互婿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捣郊,“玉大人,你說我怎么就攤上這事慈参∏荷” “怎么了?”我有些...
    開封第一講書人閱讀 157,354評論 0 348
  • 文/不壞的土叔 我叫張陵驮配,是天一觀的道長娘扩。 經(jīng)常有香客問我,道長壮锻,這世上最難降的妖魔是什么琐旁? 我笑而不...
    開封第一講書人閱讀 56,498評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮猜绣,結(jié)果婚禮上灰殴,老公的妹妹穿的比我還像新娘。我一直安慰自己掰邢,他們只是感情好牺陶,可當(dāng)我...
    茶點故事閱讀 65,600評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著辣之,像睡著了一般掰伸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上怀估,一...
    開封第一講書人閱讀 49,829評論 1 290
  • 那天狮鸭,我揣著相機與錄音合搅,去河邊找鬼。 笑死歧蕉,一個胖子當(dāng)著我的面吹牛历筝,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播廊谓,決...
    沈念sama閱讀 38,979評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼梳猪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了蒸痹?” 一聲冷哼從身側(cè)響起春弥,我...
    開封第一講書人閱讀 37,722評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎叠荠,沒想到半個月后匿沛,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,189評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡榛鼎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,519評論 2 327
  • 正文 我和宋清朗相戀三年逃呼,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片者娱。...
    茶點故事閱讀 38,654評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡抡笼,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出黄鳍,到底是詐尸還是另有隱情推姻,我是刑警寧澤,帶...
    沈念sama閱讀 34,329評論 4 330
  • 正文 年R本政府宣布框沟,位于F島的核電站藏古,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏忍燥。R本人自食惡果不足惜拧晕,卻給世界環(huán)境...
    茶點故事閱讀 39,940評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望梅垄。 院中可真熱鬧厂捞,春花似錦、人聲如沸哎甲。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,762評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽炭玫。三九已至奈嘿,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吞加,已是汗流浹背裙犹。 一陣腳步聲響...
    開封第一講書人閱讀 31,993評論 1 266
  • 我被黑心中介騙來泰國打工尽狠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人叶圃。 一個月前我還...
    沈念sama閱讀 46,382評論 2 360
  • 正文 我出身青樓袄膏,卻偏偏與公主長得像,于是被迫代替她去往敵國和親掺冠。 傳聞我的和親對象是個殘疾皇子沉馆,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,543評論 2 349

推薦閱讀更多精彩內(nèi)容

  • 1. 簡介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL德崭、存儲過程以及高級映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,455評論 0 4
  • Mybatis相關(guān) 1.Mybatis是什么? 2.為什么選擇Mybatis? 3斥黑、#{}和${}的區(qū)別是什么? ...
    夢殤_fccd閱讀 980評論 0 5
  • 之前在面試工作的時候眉厨,我當(dāng)時用的是hibernate锌奴,但是現(xiàn)在互聯(lián)網(wǎng)項目并發(fā)量大,一般都會選擇使用Mybatis,...
    唐偉耀閱讀 551評論 1 0
  • 參考:MyBatis結(jié)構(gòu)和組件 http://www.reibang.com/p/75a6a2297c69MyB...
    莫小歸閱讀 649評論 0 8
  • 1. Mybatis的介紹 MyBatis 本是apache的一個開源項目iBatis, 2010年這個項目由ap...
    itzhouq的筆記閱讀 657評論 0 5