Mybatis系列(一)入門

地址:http://blog.csdn.net/chris_mao/article/details/48803545

Mybatis系列之入門

簡介

MyBatis 是支持定制化 SQL、存儲過程以及高級映射的優(yōu)秀的持久層框架叙赚。MyBatis 避免了幾乎所有的 JDBC 代碼和手動設(shè)置參數(shù)以及獲取結(jié)果集弄息。MyBatis 可以對配置和原生Map使用簡單的 XML 或注解侣诺,將接口和 Java 的 POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄名扛。

安裝

要使用Mybatis只需要到官網(wǎng)下載Mybatis的Jar包裁赠,并復(fù)制到ClassPath下即可蹈集。如果您是使用Maven來構(gòu)建Java項目闺兢,那只需要在其pom.xml文件中加入Mybatis的依賴關(guān)系即可。

[html]view plaincopy

org.mybatis

mybatis

3.3.0

連接數(shù)據(jù)庫

在使用Mybatis之前帽揪,我們要先確保其可以正確連接到我們要使用的目標(biāo)數(shù)據(jù)庫硝清。Mybatis連接數(shù)據(jù)庫也是非常的簡單,和JDBC類似转晰,只需要在XML文件中指定要使用的數(shù)據(jù)庫驅(qū)動芦拿、連接字符串、數(shù)據(jù)庫用戶名和密碼信息即可查邢。

[html]view plaincopy


PUBLIC?"-//mybatis.org//DTD?Config?3.0//EN"

"http://mybatis.org/dtd/mybatis-3-config.dtd">

Mybatis允許我們在同一個配置文件中指定多個數(shù)據(jù)庫連接信息防嗡,實際工作中也是需要這樣的。開發(fā)環(huán)境侠坎,我們需要一個用于開發(fā)的數(shù)據(jù)庫;測試環(huán)境裙盾,我們需要一個用于系統(tǒng)測試的數(shù)據(jù)庫实胸;生產(chǎn)環(huán)境,我們需要一個保存真實數(shù)據(jù)的生產(chǎn)數(shù)據(jù)庫番官。在Mybatis中庐完,使用enviroments標(biāo)簽即可定義多個環(huán)境中需要使用的數(shù)據(jù)庫連接信息,并使用default關(guān)鍵字指示出當(dāng)前使用的環(huán)境信息徘熔。

數(shù)據(jù)庫連接配置寫好之后门躯,我們就可以開始編寫操作數(shù)據(jù)庫的Java代碼了。大家可以回想一下酷师,使用JDBC是如何操作數(shù)據(jù)庫的呢讶凉?熟悉Java開發(fā)模式的同學(xué)一定知道染乌,我們需要在DAO層編寫以下功能代碼:

加載數(shù)據(jù)庫驅(qū)動類 Class.forName(“com.mysql.jdbc.driver”);

獲得數(shù)據(jù)庫連接 DeriverManager.getConnection(url, username, password)

執(zhí)行SQL語句

獲取查詢結(jié)果,進行封裝

返回封裝后的結(jié)果

其中前兩步懂讯,通常我們會提取出來荷憋,封裝在一個專門數(shù)據(jù)與數(shù)據(jù)庫連接的類DBUtils中。為什么這樣做呢褐望?因為DAO層要做的只是后面三步的工作勒庄,至于如何連接數(shù)據(jù)庫、連接哪個數(shù)據(jù)庫瘫里,DAO層是不關(guān)心的实蔽。她需要的是一個能夠與數(shù)據(jù)庫交互,交執(zhí)行SQL語句的對象谨读。在使用JDBC時局装,就是Connection對象。那么在Mybatis中有沒有這樣一個對象呢漆腌?又是如何向DAO層提供這個對象的呢贼邓?

在正式開始編寫Java代碼之前,我們先了解一下Mybatis的相關(guān)基礎(chǔ)知識闷尿。

答案是肯定的塑径,在Mybatis中向DAO層提供的這個能夠與數(shù)據(jù)庫交互并執(zhí)行SQL語句的對象叫做SqlSession。這個是Mybatis最核心的一個對象填具。SqlSession完全包含了面向數(shù)據(jù)庫執(zhí)行SQL命令所需的全部方法统舀。

那么如何獲得這個對象呢?分為三步劳景。

通過配置文件獲取數(shù)據(jù)庫連接相關(guān)信息

通過配置信息創(chuàng)建SqlSessionFactory對象誉简。一眼就可以看出這是一個工廠類,負責(zé)創(chuàng)建SqlSession對象實例

使用SqlSessionFactory創(chuàng)建SqlSession對象盟广,打開一個數(shù)據(jù)庫會話闷串。

下面的代碼展示了數(shù)據(jù)庫連接實踐。

[java]view plaincopy

Reader?reader;

SqlSessionFactory?sqlSessionFactory;

try{

//讀取配置文件

reader?=?Resources.getResourceAsReader("mybatis.xml");

}catch(IOException?e)?{

e.printStackTrace();

}

//創(chuàng)建SqlSessionFactory對象實例

sqlSessionFactory?=newSqlSessionFactoryBuilder().build(reader);

//獲得數(shù)據(jù)庫會話對象實例

SqlSession?session?=?sqlSessionFactory.openSession();

try{

//數(shù)據(jù)庫操作

……

}finally{

//關(guān)閉數(shù)據(jù)庫會話

session.close();

}

范圍和生命周期

這里順帶提一下上述代碼中使用到的幾個主要對象的范圍和生命周期筋量。

SqlSessionFactoryBuilder

這個類可以被實例化烹吵、使用和丟棄,一旦創(chuàng)建了 SqlSessionFactory桨武,就不再需要它了肋拔。因此 SqlSessionFactoryBuilder 實例的最佳范圍是方法范圍(也就是局部方法變量)。你可以重用 SqlSessionFactoryBuilder 來創(chuàng)建多個 SqlSessionFactory 實例呀酸,但是最好還是不要讓其一直存在以保證所有的 XML 解析資源開放給更重要的事情凉蜂。

SqlSessionFactory

SqlSessionFactory 一旦被創(chuàng)建就應(yīng)該在應(yīng)用的運行期間一直存在,沒有任何理由對它進行清除或重建。使用 SqlSessionFactory 的最佳實踐是在應(yīng)用運行期間不要重復(fù)創(chuàng)建多次窿吩,多次重建 SqlSessionFactory 被視為一種代碼“壞味道(bad smell)”茎杂。因此 SqlSessionFactory 的最佳范圍是應(yīng)用范圍。有很多方法可以做到爆存,最簡單的就是使用單例模式或者靜態(tài)單例模式蛉顽。

SqlSession

每個線程都應(yīng)該有它自己的 SqlSession 實例。SqlSession 的實例不是線程安全的先较,因此是不能被共享的携冤,所以它的最佳的范圍是請求或方法范圍。絕對不能將 SqlSession 實例的引用放在一個類的靜態(tài)域闲勺,甚至一個類的實例變量也不行曾棕。也絕不能將 SqlSession 實例的引用放在任何類型的管理范圍中,比如 Serlvet 架構(gòu)中的 HttpSession菜循。如果你現(xiàn)在正在使用一種 Web 框架翘地,要考慮 SqlSession 放在一個和 HTTP 請求對象相似的范圍中。換句話說癌幕,每次收到的 HTTP 請求衙耕,就可以打開一個 SqlSession,返回一個響應(yīng)勺远,就關(guān)閉它橙喘。這個關(guān)閉操作是很重要的,你應(yīng)該把這個關(guān)閉操作放到 finally 塊中以確保每次都能執(zhí)行關(guān)閉胶逢。

通過本篇的學(xué)習(xí)厅瞎,我們對Mybatis有了一個大體的了解。后續(xù)我還會和大家一起分享我的Mybatis學(xué)習(xí)路程初坠。靜請期待和簸。

附錄

Mybatis系列(二)配置

Mybatis系列(三)簡單示例

Mybatis系列(四)映射文件

Mybatis系列(五)動態(tài)SQL

Mybatis系列(六)接口式編程

Mybatis系列(七)關(guān)聯(lián)映射

Mybatis系列(八)集合映射

Mybatis系列(九)Spring & Mybatis整合

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市碟刺,隨后出現(xiàn)的幾起案子锁保,更是在濱河造成了極大的恐慌,老刑警劉巖半沽,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件身诺,死亡現(xiàn)場離奇詭異,居然都是意外死亡抄囚,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門橄务,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幔托,“玉大人,你說我怎么就攤上這事≈靥簦” “怎么了嗓化?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長谬哀。 經(jīng)常有香客問我刺覆,道長,這世上最難降的妖魔是什么史煎? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任谦屑,我火速辦了婚禮,結(jié)果婚禮上篇梭,老公的妹妹穿的比我還像新娘氢橙。我一直安慰自己,他們只是感情好恬偷,可當(dāng)我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布悍手。 她就那樣靜靜地躺著,像睡著了一般袍患。 火紅的嫁衣襯著肌膚如雪坦康。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天诡延,我揣著相機與錄音滞欠,去河邊找鬼。 笑死孕暇,一個胖子當(dāng)著我的面吹牛仑撞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播妖滔,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼隧哮,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了座舍?” 一聲冷哼從身側(cè)響起沮翔,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎曲秉,沒想到半個月后采蚀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡承二,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年榆鼠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片亥鸠。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡妆够,死狀恐怖识啦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情神妹,我是刑警寧澤颓哮,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站鸵荠,受9級特大地震影響冕茅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜蛹找,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一姨伤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧熄赡,春花似錦姜挺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拧篮,卻和暖如春词渤,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背串绩。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工缺虐, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人礁凡。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓高氮,卻偏偏與公主長得像,于是被迫代替她去往敵國和親顷牌。 傳聞我的和親對象是個殘疾皇子剪芍,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,792評論 2 345

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