地址: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
在使用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í)路程初坠。靜請期待和簸。