Hibernate實戰
bromon原創 請尊重著作權
對象關係映射(Object Relative Mapping)簡稱ORM,是物件導向開發的一個熱點,用來解決JDBC開發中手動進行OR映射的繁雜與不便。EJB中的實體Bean在這個領域是很著名的——既因為它的先進而著名,也因為它的低效而著名。有過實體Bean開發經驗的人可能都會為實現遠程介面造成的效率低下而頭痛,在很多不大不小的項目中,使用實體Bean是否得不償失,爭論很大。一個輕量級的持久化方案也許能夠解決一些問題,Hibernate應此而生。
Hibernate是一個中介層,它的目的是把資料庫中的關係通過一定的規則映射成為對象,讓Java開發人員不用太多的考慮底層資料庫的問題,只需要像通常情況下管理對象一樣的管理資料。在關聯式資料庫仍將持續佔據市場的情況下,它很可觀。在資料持久化領域,即便是輕量級的方案也會是複雜饒舌的,也許如同周杰倫的音樂一樣不知所云。在學習它之前,最好先回想一下以前進行資料庫開發中遇到的問題和不便,想想為什麼需要一個持久化層,才能知道很多操作的目的是什麼,以及為什麼要這麼幹,在這個問題上我不想做更多的敘述,因為“長久以來……”這樣的句式通常long(不好意思,打不出來)長,會對我的鍵盤和熱情造成很大的磨損。如果讓我寫一本書,那麼我會樂意去敘述什麼是資料持久化,它有什麼好處等等。廢話少說,來了。
首先需要配置環境,下載Hibernate 2.1(www.hibernate.org),把lib下的*.jar添加到classpath,你的資料庫JDBC驅動程式也應該在classpath中。開啟hibernate.properties,針對你使用的資料庫,配置相應的資訊,比如我使用的是MS SQL Server,配置如下:
## MS SQL Server
hibernate.dialect net.sf.hibernate.dialect.SQLServerDialect
hibernate.connection.driver_class com.microsoft.jdbc.sqlserver.SQLServerDriver
hibernate.connection.url jdbc:microsoft:sqlserver://localhost:1433;DatabaseName=zizz
hibernate.connection.username sa
hibernate.connection.password
其中很大部分是已經寫好的,只需要取掉注釋即可,我自己只是修改了資料庫名稱、帳號、密碼。建立一個名為zizz的資料庫備用。
然後把這個檔案拷貝到你的應用的根目錄下。
我們談論了很多次映射,應該首先來看看這個映射是如何完成的。假設一個最簡單的應用,寫一個功能最單一的留言板,設計的資料有留言的編號、留言者名稱、留言內容,還有留言時間。足夠簡單吧,換做是你打算怎麼幹?我猜你要首先建立一個資料庫表格,名字也許叫做guestbook。No,這不是物件導向的方式,不妨首先從對象的角度來考慮。我們當然希望每一條留言都以對象的方式呈現,每個對象應該具有的屬性有:id、author、content、time。偷個懶,沒有畫UML。下面這個類應該是很容易理解的:
//GuestBook.java
package org.bromon.zizz;
import java.util.*;
public class GuestBook
{
private int id;
private String author;
private String content;
private Calendar time;
private void setId(int id)
{
this.id=id;
}
public int getId()
{
return(id);
}
public void setAuthor(String author)
{
this.author=author;
}
public String getAuthro()
{
return(author);
}
public void setContent(String content)
{
this.content=content;
}
public String getContent()
{
return(content);
}
public void setTime(Calendar time)
{
this.time=time;
}
public Calendar getTime()
{
return(time);
}
}
基本上是最簡單的Bean了,如果覺得困難的話,請你先回火星等我。
需要注意的是setId方法被指定為private,這是因為我希望用這個欄位做主鍵,它最好由系統自動產生,所以不應該由使用者來指定,這個方法專為Hibernate準備,所以是私人的。
如何把這個類與資料庫映射起來?看看Hibernate的魔法,使用一個XML檔案來描述,它應該被命名為GuestBook.hbm.xml:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"' target=_blank>http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping package="org.bromon.zizz">
<class name="GuestBook" table=”guestbook" lazy="true">
<id name="id" type="integer" unsaved-value="null">
<column name="id" sql-type="int" not-null="true"/>
<generator class="identity"/>
</id>
<property name="author" column="author" not-null="true" unique="false"/>
<property name="content" column="content" not-null="true"/>
<property name="time" column="time" not-null="true"/>
</class>
</hibernate-mapping>
雖然有點陌生,但是很易讀,仔細琢磨一下。
下面來編寫我們的應用,它的功能是插入資料:
//Operate.java
package org.bromon.zizz;
import net.sf.hibernate.*;
import net.sf.hibernate.cfg.*;
import net.sf.hibernate.tool.hbm2ddl.*;
import java.util.*;
public class Operate
{
public static void main(String args[])
{
try
{
Configuration cfg=new Configuration().addClass(GuestBook.class);
SessionFactory sessions=cfg.buildSessionFactory();
new SchemaExport(cfg).create(true,true);
Session session=sessions.openSession();
GuestBook gb=new GuestBook();
gb.setAuthor(“Bromon”);
gb.setContent(“留言的內容”);
gb.setTime(Calendar.getInstance());
Transaction ts=session.beginTransaction();
session.save(gb);
ts.commit();
session.close();
}catch(Exception e)
{
System.out.println(e);
}
}
}
編譯吧:javac –d . *.java
執行一下:java org.bromon.zizz.Operate
到資料庫裡面看看,表格已經建立好了,並且資料也已經儲存。如果把
new SchemaExport().create(true,true);
注釋掉,那麼系統不會建立表格,而只是在已有的表格中添加新的記錄,當然,如果表格不存在的話,會產生異常。
你已經看到了Hibernate神奇魔法的5%,它足夠的複雜強大,可以讓你應付複雜的應用,不過今天還是到此為止吧。