Hibernate是中小型項(xiàng)目使用的最多的一種持久化技術(shù)。而它最重要的概念就是ORM(對(duì)象-關(guān)系映射)。對(duì)于這個(gè)概念,許多資料上的解釋都不一樣,比較大眾化的解釋是,將數(shù)據(jù)庫(kù)中的記錄映射到程序中,使其成為對(duì)象來(lái)操作,就象操作JAVA的普通類(lèi)一樣。除了這些,它還可以為我們管理連接對(duì)象,事務(wù)處理等操作。所以使用起來(lái)很方便。
首先我們來(lái)看一下一個(gè)簡(jiǎn)單的Hibernate程序的結(jié)構(gòu)。它有兩個(gè)xml文件很重要,第一個(gè)就是*.cfg.xml文件。它描述了Hibernate和數(shù)據(jù)庫(kù)之間的配置信息。比如連接池、數(shù)據(jù)源。
這里不得不說(shuō)到的一個(gè)類(lèi)就是SessionFactory類(lèi),它是Hibernate里面最重要的一個(gè)類(lèi)。基本上所有其他操作API都是從這個(gè)類(lèi)獲得實(shí)例的。而這個(gè)配置文件中,描述了SessionFactory的基本內(nèi)容,也就是連接信息,和另外一個(gè)非常重要的內(nèi)容,就是:*.hbm.xml文件。其實(shí),如果你使用工具的話(比如MyEclipse,JBuilder),這些東西都可以自動(dòng)生成。先還是講一下這些東西都描述的是些什么內(nèi)容吧。
myeclipse.connection.profile 它描述的是一個(gè)連接的名字
connection.url 它描述了連接字符串
connection.username/connection.password 描述了用戶名和密碼
connection.driver_class 描述了驅(qū)動(dòng)類(lèi)
dialect 這個(gè)東西描述了Hibernate對(duì)Oracle9i提供支持的類(lèi)
在這個(gè)文件中還可以描述事務(wù)和其他的操作。
另外一個(gè)重要的文件是*.hbm.xml文件,它描述了數(shù)據(jù)庫(kù)中的表的信息。不過(guò)在說(shuō)這個(gè)文件之前,我們先要用類(lèi)來(lái)描述數(shù)據(jù)庫(kù)中的記錄。
public class StuInfo
{
private Integer stuID;
private String stuName;
private void setStuID(Integer id){this.stuID=id;}
public Integer getStuID(){return stuID;}
public void setStuName(String name){this.stuName=name;)
public String getStuName(){return stuName;}
}
需要注意的是:在JAVA中不能用基本數(shù)據(jù)類(lèi)型去描述數(shù)據(jù)庫(kù)中的類(lèi)型。然后我們?cè)賮?lái)看看*.hbm.xml文件中是如何描述的吧。
需要說(shuō)明的是,這里使用了Oracle里面的序列來(lái)實(shí)現(xiàn)自動(dòng)增長(zhǎng),而且讓stuID字段的set方法是私有的。這是因?yàn)閟tuID字段是主鍵字段,而且又是自動(dòng)增長(zhǎng)的,所以不需要人工修改它的值。
以上這些都只是使用Hibernate的準(zhǔn)備工作,接下來(lái)就可以操作Hibernate來(lái)實(shí)現(xiàn)數(shù)據(jù)庫(kù)的邏輯。
首先必須創(chuàng)建一個(gè)Configuration對(duì)象來(lái)加載我們的*.cfg.xml文件。
Configuration cfg = new Configuaration();
cfg.configure("/cfg/hibernate.cfg.xml");//cfg包下面
然后用這個(gè)對(duì)象來(lái)創(chuàng)建SessionFactory對(duì)象。這個(gè)對(duì)象很重要,它是用來(lái)創(chuàng)建Hibernate會(huì)話和其他類(lèi)的重要類(lèi)。
SessionFactory factory = cfg.buildSessionFactory();
Session session = factory.openSession();
有了Session之后,我們就可以用它來(lái)創(chuàng)建各種操作數(shù)據(jù)庫(kù)的類(lèi)。先來(lái)說(shuō)說(shuō)查詢(xún)吧。我們需要使用一種叫做HQL的查詢(xún)語(yǔ)言,它是Hibernate特有的一中查詢(xún)語(yǔ)言,和我們熟悉的SQL很象。當(dāng)然Hibernate還提供了其他的查詢(xún)方式,等下次有機(jī)會(huì)的時(shí)候再說(shuō)吧。
Query query = session.createQuery("from StuInfo");
List list = query.list();//執(zhí)行查詢(xún)并獲得集合
//迭代數(shù)據(jù)
Iterator it = list.iterator();
while(it.hasNext()){
StuInfo stu = (StuInfo)it.next();
System.out.println(stu.getStuName());
}
這就是一個(gè)簡(jiǎn)單的查詢(xún)。這里需要注意的是,查詢(xún)語(yǔ)句中的表必須和StuInfo.hbm.xml中映射的表名一樣,其他的字段也是。下面說(shuō)說(shuō)插入、更新和刪除。
想要修改和更新,或者刪除,我們必須先得到要修改的對(duì)象。所以先要使用查詢(xún)來(lái)獲取對(duì)象。而且修改的過(guò)程當(dāng)中有可能會(huì)報(bào)錯(cuò),所以我們要使用事務(wù)處理。
Transaction trans = session.beginTransaction();
trans.begin();//開(kāi)始事務(wù)
Query query = session.createQuery("from StuInfo where stuID=1");
List list = query.list();
if (!list.isEmpty()) {
Iterator it = list.iterator();
StuInfo stu = (StuInfo) it.next();
stu.setStuname("roddick");
session.update(stu);//修改更新,刪除是session.delete(stu);
trans.commit();//提交事務(wù)
session.close();//關(guān)閉會(huì)話
}
以上就是Hibernate的簡(jiǎn)單操作,是不是很容易。需要注意的是,這里的表映射是沒(méi)有主外鍵關(guān)系的,如果表和其他表有主外鍵關(guān)系的話,在創(chuàng)建SessionFactory對(duì)象的時(shí)候是會(huì)報(bào)錯(cuò)的。要處理這種情況必須在建立映射關(guān)系的時(shí)候考慮一對(duì)多映射。這種情況我們下次有機(jī)會(huì)再說(shuō)吧。