Mybatis

一、JDBC弊端

  1. 重復(fù)創(chuàng)建鏈接和釋放鏈接蝌诡,造成資源浪費(fèi)溉贿。解決方式:使用連接池
  2. 出現(xiàn)硬編碼,體現(xiàn)在數(shù)據(jù)庫驅(qū)動(dòng)浦旱,url宇色、用戶名密碼、sql颁湖。解決方式:使用配置文件
  3. 結(jié)果獲取不方便宣蠕。解決方式:把結(jié)果放到一個(gè)POJO中

二、Mybatis的介紹

MyBatis 本是apache的一個(gè)開源項(xiàng)目iBatis甥捺,2010年這個(gè)項(xiàng)目由apache software foundation 遷移到了google code抢蚀,并且改名為MyBatis 。2013年11月遷移到Github镰禾。iBATIS一詞來源于“internet”和“abatis”的組合皿曲,是一個(gè)基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAOs)吴侦。當(dāng)前屋休,最新版本是MyBatis 3.5.1 ,其發(fā)布時(shí)間是2019年4月8日备韧。

MyBatis 是一款支持普通 SQL查詢劫樟,存儲(chǔ)過程和高級(jí)映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集的檢索盯蝴。MyBatis 使用簡(jiǎn)單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Ordinary Java Objects听怕,普通的 Java對(duì)象)映射成數(shù)據(jù)庫中的記錄捧挺。

每個(gè)MyBatis應(yīng)用程序主要都是使用SqlSessionFactory實(shí)例的,一個(gè)SqlSessionFactory實(shí)例可以通過SqlSessionFactoryBuilder獲得尿瞭。SqlSessionFactoryBuilder可以從一個(gè)xml配置文件或者一個(gè)預(yù)定義的配置類的實(shí)例獲得闽烙。

用xml文件構(gòu)建SqlSessionFactory實(shí)例是非常簡(jiǎn)單的事情。推薦在這個(gè)配置中使用類路徑資源(classpath resource),但你可以使用任何Reader實(shí)例黑竞,包括用文件路徑或file://開頭的url創(chuàng)建的實(shí)例捕发。MyBatis有一個(gè)實(shí)用類----Resources,它有很多方法很魂,可以方便地從類路徑及其它位置加載資源扎酷。

三、Mybatis架構(gòu)

Mybatis架構(gòu).jpg
  1. mybatis配置 SqlMapConfig.xml遏匆,此文件作為mybatis的全局配置文件法挨,配置了mybatis的運(yùn)行環(huán)境等信息。mapper.xml文件即sql映射文件幅聘,文件中配置了操作數(shù)據(jù)庫的sql語句凡纳。此文件需要在SqlMapConfig.xml中加載。
  2. 通過mybatis環(huán)境等配置信息構(gòu)造SqlSessionFactory即會(huì)話工廠帝蒿。
  3. 由會(huì)話工廠創(chuàng)建sqlSession即會(huì)話荐糜,操作數(shù)據(jù)庫需要通過sqlSession進(jìn)行。
  4. mybatis底層自定義了Executor執(zhí)行器接口操作數(shù)據(jù)庫葛超,Executor接口有兩個(gè)實(shí)現(xiàn)暴氏,一個(gè)是基本執(zhí)行器、一個(gè)是緩存執(zhí)行器巩掺。
  5. Mapped Statement也是mybatis一個(gè)底層封裝對(duì)象偏序,它包裝了mybatis配置信息及sql映射信息等。mapper.xml文件中一個(gè)sql對(duì)應(yīng)一個(gè)Mapped Statement對(duì)象胖替,sql的id即是Mapped statement的id研儒。
  6. Mapped Statement對(duì)sql執(zhí)行輸入?yún)?shù)進(jìn)行定義,包括HashMap独令、基本類型端朵、pojo,Executor通過Mapped Statement在執(zhí)行sql前將輸入的java對(duì)象映射至sql中燃箭,輸入?yún)?shù)映射就是jdbc編程中對(duì)preparedStatement設(shè)置參數(shù)冲呢。
  • 輸入映射(傳入的參數(shù))
    支持的數(shù)據(jù)類型:
    基本數(shù)據(jù)類型:基礎(chǔ)類型以及包裝類、String
    POJO
    Map
    包裝的POJO:一個(gè)pojo中有pojo屬性
  1. Mapped Statement對(duì)sql執(zhí)行輸出結(jié)果進(jìn)行定義招狸,包括HashMap敬拓、基本類型、pojo裙戏,Executor通過Mapped Statement在執(zhí)行sql后將輸出結(jié)果映射至java對(duì)象中乘凸,輸出結(jié)果映射過程相當(dāng)于jdbc編程中對(duì)結(jié)果的解析處理過程。
  • 輸出映射(產(chǎn)生的結(jié)果類型)
    基本數(shù)據(jù)類型:基礎(chǔ)類型以及包裝類累榜、String
    POJO
    Map
    List

四营勤、MyBatis xml配置文件層次結(jié)構(gòu)

MyBatis配置文件層次結(jié)構(gòu).jpg

properties元素

properties是一個(gè)配置屬性的元素,讓開發(fā)者能在配置文件的上下文中使用它,MyBatis提供3種配置方式:

  1. property子元素葛作。
  2. properties配置文件寿羞。
  3. SqlSessionFactoryBuilder使用Properties文件構(gòu)建。

property子元素

 <property name="driver" value="com.mysql.jdbc.Driver"/>

properties配置文件
一般會(huì)使用一個(gè)單獨(dú)的properties配置文件來配置屬性值赂蠢,以方便在多個(gè)配置文件中重復(fù)使用它們绪穆,也方便日后維護(hù)和隨時(shí)修改】湍辏可以通過${key}的形式霞幅,取出在配置文件中配置的值。

<configuration>
    <!-- 引入配置文件 -->
    <properties resource="datasource.properties"/>

    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <!-- 使用配置文件中的屬性 -->
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
            </dataSource>
        </environment>
    </environments>
</configuration>

SqlSessionFactoryBuilder使用Properties文件構(gòu)建
出于安全考慮量瓜,properties配置文件中的賬號(hào)密碼等元素可能是加密的司恳,這個(gè)時(shí)候就需要對(duì)加密的元素進(jìn)行處理。

    public static void func() throws Exception {
        Properties properties = new Properties();
        properties.load(Resources.getResourceAsStream("datasource.properties"));
        // 對(duì)原賬號(hào)密碼解密
        properties.setProperty("username", decode(properties.getProperty("username")));
        properties.setProperty("password", decode(properties.getProperty("password")));

        InputStream is = Resources.getResourceAsStream("mybatis-config.xml");
        // SqlSessionFactoryBuilder可以使用一個(gè)InputStream和一個(gè)Properties構(gòu)建SqlSessionFactory
        SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(is, properties);
    }

三種方式的優(yōu)先級(jí)
MyBatis支持的3種配置方式可能同時(shí)出現(xiàn)绍傲,并且屬性還會(huì)重復(fù)配置扔傅,MyBatis將按照下面的順序來加載:

  1. 在properties元素體內(nèi)指定的屬性首先被讀取。
  2. 根據(jù) properties元素中的resource屬性讀取類路徑下屬性文件烫饼,或者根據(jù)url屬性指定的路徑讀取屬性文件猎塞,并覆蓋已讀取的同名屬性。
  3. 讀取作為build()方法參數(shù)傳遞的屬性杠纵,并覆蓋已讀取的同名屬性荠耽。

因此,通過build()方法參數(shù)傳遞的屬性具有最高優(yōu)先級(jí)比藻,resource/url屬性中指定的配置文件次之铝量,最低優(yōu)先級(jí)的是 properties屬性中指定的屬性。因此银亲,我們盡量不要使用混合的方式來定義配置慢叨,首選的方式是使用properties文件。

五务蝠、environments環(huán)境變量

配置環(huán)境可以注冊(cè)多個(gè)環(huán)境拍谐,每一個(gè)環(huán)境分為兩大部分:一個(gè)是數(shù)據(jù)庫源(dataSource)的配置,另外一個(gè)是數(shù)據(jù)庫事務(wù)(transactionManager)的配置馏段。

    <environments default="dev">
        <environment id="dev">
            <transactionManager type="JDBC"/>
            <dataSource type="POOLED">
                <property name="driver" value="${driver}"/>
                <property name="url" value="${url}"/>
                <property name="username" value="${username}"/>
            </dataSource>
        </environment>
    </environments>
  1. default:表示默認(rèn)使用哪個(gè)數(shù)據(jù)源
  2. id:表示數(shù)據(jù)源的名稱
  3. transactionManager的事務(wù)類型type一共有三種:JDBC轩拨,采用JDBC方式管理事務(wù),獨(dú)立編碼中我們常常使用院喜;MANAGED亡蓉,采用容器方式管理事務(wù),在JNDI數(shù)據(jù)源中常用够坐;自定義寸宵,由使用者自定義數(shù)據(jù)庫事務(wù)管理辦法,適用于特殊應(yīng)用元咙。
  4. property元素配置數(shù)據(jù)源的各類屬性
  5. dataSource的type屬性是提供我們對(duì)數(shù)據(jù)厙連接方式的配置:UNPOOLED(非連接池?cái)?shù)據(jù)庫)梯影、POOLED(連接池?cái)?shù)據(jù)庫)、JNDI(JNDI數(shù)據(jù)源)庶香、自定義數(shù)據(jù)源甲棍。

六、數(shù)據(jù)源

MyBatis內(nèi)部為我們提供了3種數(shù)據(jù)源的實(shí)現(xiàn)方式:

  • UNPOOLED赶掖,使用org.apache.ibatis.datasource.unpooled.UnpooledDataSource實(shí)現(xiàn)感猛。
  • POOLED,使用org.apache.ibatis.datasource.pooled.PooledDataSource實(shí)現(xiàn)奢赂。
  • JNDI陪白,使用org.apache.ibatis.datasource.jndi.JndiDataSourceFactory實(shí)現(xiàn)。

七膳灶、數(shù)據(jù)庫事務(wù)

數(shù)據(jù)庫事務(wù)是交由SqlSession去控制的咱士,我們可以通過SqlSession提交或者回滾。在大部分的工作環(huán)境下轧钓,我們都會(huì)使用 Spring框架來控制它序厉。

八、Mybatis解決jdbc編程的問題

  1. 數(shù)據(jù)庫鏈接創(chuàng)建毕箍、釋放頻繁造成系統(tǒng)資源浪費(fèi)從而影響系統(tǒng)性能弛房,如果使用數(shù)據(jù)庫鏈接池可解決此問題。
    解決:在SqlMapConfig.xml中配置數(shù)據(jù)鏈接池而柑,使用連接池管理數(shù)據(jù)庫鏈接文捶。
  2. Sql語句寫在代碼中造成代碼不易維護(hù),實(shí)際應(yīng)用sql變化的可能較大牺堰,sql變動(dòng)需要改變java代碼拄轻。
    解決:將Sql語句配置在XXXXmapper.xml文件中與java代碼分離。
  3. 向sql語句傳參數(shù)麻煩伟葫,因?yàn)閟ql語句的where條件不一定恨搓,可能多也可能少,占位符需要和參數(shù)一一對(duì)應(yīng)筏养。
    解決:Mybatis自動(dòng)將java對(duì)象映射至sql語句斧抱,通過statement中的parameterType定義輸入?yún)?shù)的類型。
  4. 對(duì)結(jié)果集解析麻煩渐溶,sql變化導(dǎo)致解析代碼變化辉浦,且解析前需要遍歷,如果能將數(shù)據(jù)庫記錄封裝成pojo對(duì)象解析比較方便茎辐。
    解決:Mybatis自動(dòng)將sql執(zhí)行結(jié)果映射至java對(duì)象宪郊,通過statement中的resultType定義輸出結(jié)果的類型掂恕。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市弛槐,隨后出現(xiàn)的幾起案子懊亡,更是在濱河造成了極大的恐慌,老刑警劉巖乎串,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件店枣,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡叹誉,警方通過查閱死者的電腦和手機(jī)鸯两,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來长豁,“玉大人钧唐,你說我怎么就攤上這事〗辰螅” “怎么了逾柿?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)宅此。 經(jīng)常有香客問我机错,道長(zhǎng),這世上最難降的妖魔是什么父腕? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任弱匪,我火速辦了婚禮,結(jié)果婚禮上璧亮,老公的妹妹穿的比我還像新娘萧诫。我一直安慰自己,他們只是感情好枝嘶,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布帘饶。 她就那樣靜靜地躺著,像睡著了一般群扶。 火紅的嫁衣襯著肌膚如雪及刻。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天竞阐,我揣著相機(jī)與錄音缴饭,去河邊找鬼。 笑死骆莹,一個(gè)胖子當(dāng)著我的面吹牛颗搂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播幕垦,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼丢氢,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼傅联!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起疚察,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤纺且,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后稍浆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡猜嘱,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年衅枫,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片朗伶。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡弦撩,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出论皆,到底是詐尸還是另有隱情益楼,我是刑警寧澤,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布点晴,位于F島的核電站感凤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏粒督。R本人自食惡果不足惜陪竿,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望屠橄。 院中可真熱鬧族跛,春花似錦、人聲如沸锐墙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽溪北。三九已至桐绒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間之拨,已是汗流浹背掏膏。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留敦锌,地道東北人馒疹。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像乙墙,于是被迫代替她去往敵國(guó)和親颖变。 傳聞我的和親對(duì)象是個(gè)殘疾皇子生均,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359

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

  • 1. 簡(jiǎn)介 1.1 什么是 MyBatis ? MyBatis 是支持定制化 SQL腥刹、存儲(chǔ)過程以及高級(jí)映射的優(yōu)秀的...
    笨鳥慢飛閱讀 5,527評(píng)論 0 4
  • 1. Mybatis的介紹 MyBatis 本是apache的一個(gè)開源項(xiàng)目iBatis, 2010年這個(gè)項(xiàng)目由ap...
    itzhouq的筆記閱讀 672評(píng)論 0 5
  • MyBatis 理論篇 [TOC] 什么是MyBatis ?MyBatis是支持普通SQL查詢,存儲(chǔ)過程和高級(jí)映射...
    有_味閱讀 2,908評(píng)論 0 26
  • 之前在面試工作的時(shí)候马胧,我當(dāng)時(shí)用的是hibernate,但是現(xiàn)在互聯(lián)網(wǎng)項(xiàng)目并發(fā)量大衔峰,一般都會(huì)選擇使用Mybatis,...
    唐偉耀閱讀 558評(píng)論 1 0
  • 天意熏熏風(fēng)草樹佩脊,吾獨(dú)離群望兵步。 閑處該時(shí)逢稚子垫卤,攜予浦英付我笑威彰。 一笑當(dāng)思?jí)羰辏晡嵘胸澢嘞x穴肘。 青蟲季季尤可...
    柳尋川閱讀 158評(píng)論 0 2