國內(nèi)b2b電商平臺seo專業(yè)課程
MyBatis簡介
本節(jié)首先會介紹什么是ORM、什么是MyBatis、MyBatis的特點(diǎn)以及核心概念,最后介紹MyBatis是如何啟動(dòng)、如何加載配置文件的?
1.什么是ORM
ORM(Object Relational Mapping,對象關(guān)系映射)是為了解決面向?qū)ο笈c關(guān)系數(shù)據(jù)庫存在的互不匹配現(xiàn)象的一種技術(shù)。簡單地說,ORM通過使用描述對象和數(shù)據(jù)庫之間映射的元數(shù)據(jù)將程序中的對象自動(dòng)持久化到關(guān)系數(shù)據(jù)庫中。
當(dāng)我們開發(fā)應(yīng)用程序時(shí),需要編寫大量的數(shù)據(jù)訪問層代碼,用來操作數(shù)據(jù)庫中的數(shù)據(jù),這些代碼要么是大量重復(fù)的代碼,要么操作特別煩瑣。針對這些問題,ORM提供了完善的解決方案,簡化了將對象持久化到關(guān)系數(shù)據(jù)庫中的操作。
ORM框架的本質(zhì)是簡化編程中操作數(shù)據(jù)庫的編碼,Java領(lǐng)域發(fā)展到現(xiàn)在,ORM框架層出不窮,但是,基本上還是Hibernate和Mybatis兩個(gè)比較流行并被廣泛使用。
Hibernate:全自動(dòng)的框架,強(qiáng)大、復(fù)雜、笨重、學(xué)習(xí)成本較高。
Mybatis:半自動(dòng)的框架(需要開發(fā)者了解數(shù)據(jù)庫),必須要自己寫SQL。
Hibernate宣稱可以不用寫一句SQL,而MyBatis以動(dòng)態(tài)SQL見長,兩者各有特點(diǎn),開發(fā)者可以根據(jù)需求靈活使用。
有一個(gè)有趣的現(xiàn)象:傳統(tǒng)企業(yè)大多喜歡使用Hibernate,而互聯(lián)網(wǎng)行業(yè)則通常使用MyBatis。
2.什么是MyBatis
MyBatis是一款優(yōu)秀的數(shù)據(jù)持久層ORM框架,被廣泛地應(yīng)用于應(yīng)用系統(tǒng)。最早是Apache的一個(gè)開源項(xiàng)目iBatis,2010年這個(gè)項(xiàng)目由Apache Software Foundation遷移到了Google Code,并且改名為MyBatis,2013年11月又遷移到了GitHub。
MyBatis支持定制化的SQL、存儲過程和高級映射,能夠非常靈活地實(shí)現(xiàn)動(dòng)態(tài)SQL,可以使用簡單的XML或注解來配置和映射原生信息,能夠輕松地將Java的POJO(Plain Ordinary Java Object,普通的Java對象)與數(shù)據(jù)庫中的表和字段進(jìn)行映射關(guān)聯(lián)。
MyBatis作為一款使用廣泛的開源軟件,它的特點(diǎn)如下:
易學(xué)易用,沒有任何第三方依賴。
SQL被統(tǒng)一提取出來,便于統(tǒng)一管理和優(yōu)化。
SQL和代碼解耦,將業(yè)務(wù)邏輯和數(shù)據(jù)訪問邏輯分離,使系統(tǒng)的設(shè)計(jì)更清晰,更易維護(hù),更易進(jìn)行單元測試。
靈活動(dòng)態(tài)的SQL,支持各種條件來動(dòng)態(tài)生成不同的SQL。
提供映射標(biāo)簽,支持對象與數(shù)據(jù)庫的ORM關(guān)系映射。
提供對象關(guān)系映射標(biāo)簽,支持對象關(guān)系組件維護(hù)。
3.MyBatis的核心概念
MyBatis由Mapper配置文件、Mapper接口、執(zhí)行器、會話等組件組成。下面就來介紹這些非常重要的組件和概念。
1)Mapper配置文件:可以使用基于XML的Mapper配置文件來實(shí)現(xiàn),也可以使用基于Java注解的MyBatis注解來實(shí)現(xiàn),甚至可以直接使用MyBatis提供的API來實(shí)現(xiàn)。
2)Mapper接口:是指自定義的數(shù)據(jù)操作接口,類似于通常所說的DAO接口。早期的Mapper接口需要自定義去實(shí)現(xiàn),現(xiàn)在MyBatis會自動(dòng)為Mapper接口創(chuàng)建動(dòng)態(tài)代理對象。Mapper接口的方法通常與Mapper配置文件中的select、insert、update、delete等XML節(jié)點(diǎn)一一對應(yīng)。
3)Executor(執(zhí)行器):MyBatis中所有SQL語句的執(zhí)行都是通過Executor進(jìn)行的,Executor是MyBatis的一個(gè)核心接口。
4)SqlSession(會話):MyBatis的關(guān)鍵對象,類似于JDBC中的連接(Connection),SqlSession對象完全包含數(shù)據(jù)庫相關(guān)的所有執(zhí)行SQL操作的方法,它的底層封裝了JDBC連接,可以用SqlSession實(shí)例來直接執(zhí)行被映射的SQL語句。
5)SqlSessionFactory(會話工廠):MyBatis的關(guān)鍵對象,它是單個(gè)數(shù)據(jù)庫映射關(guān)系經(jīng)過編譯后的內(nèi)存鏡像。SqlSessionFactory對象的實(shí)例可以通過SqlSessionFactoryBuilder對象類獲得。
6)SqlSessionFactoryBuilder構(gòu)建器:用于解析配置文件,包括屬性配置、別名配置、攔截器配置、數(shù)據(jù)源和事務(wù)管理器等,可以從XML配置文件或一個(gè)預(yù)定義的配置實(shí)例進(jìn)行構(gòu)建。
4.MyBatis的啟動(dòng)流程
MyBatis的使用雖然簡單,但是,它屬于高度封裝的框架,因此,我們必須熟悉MyBatis的啟動(dòng)和執(zhí)行過程。具體的工作流程如圖所示。
1)加載Mapper配置的SQL映射文件,或者注解的相關(guān)SQL內(nèi)容。
2)創(chuàng)建會話工廠。MyBatis通過讀取配置文件的數(shù)據(jù)源信息來構(gòu)造會話工廠(SqlSessionFactory)。
3)創(chuàng)建會話。MyBatis可以通過會話工廠來創(chuàng)建會話對象(SqlSession),會話對象是一個(gè)接口,該接口中包含對數(shù)據(jù)庫操作的增、刪、改、查方法。
4)創(chuàng)建執(zhí)行器。因?yàn)闀拰ο蟊旧聿荒苤苯硬僮鲾?shù)據(jù)庫,所以它使用了一個(gè)叫作數(shù)據(jù)庫執(zhí)行器(Executor)的接口來幫它執(zhí)行操作。
5)封裝SQL對象。在這一步,執(zhí)行器將待處理的SQL信息封裝到一個(gè)對象(MappedStatement)中,該對象包括SQL語句、輸入?yún)?shù)映射信息(Java簡單類型、HashMap或POJO)和輸出結(jié)果映射信息。
6)操作數(shù)據(jù)庫。擁有了執(zhí)行器和SQL信息封裝對象就可以使用它們訪問數(shù)據(jù)庫,最后返回操作結(jié)果,結(jié)束流程。
總結(jié)起來,MyBatis主要有兩大核心組件:SqlSessionFactory和Mapper。SqlSessionFactory負(fù)責(zé)創(chuàng)建數(shù)據(jù)庫會話,Mapper主要提供SQL映射。