方便門外的學(xué)習(xí)者,給一個簡單的入門例子。
如果你有用過其他持久架構(gòu) 轉(zhuǎn)到hibernate其實(shí)很簡單。一些原理方面就不講了,
robbin講的肯定比我好的多,自己去精華版看看。
我所給的只是我當(dāng)初剛開始接觸hibernate時候很想要的一個簡單例子和設(shè)置方法。
一直沒有找到,所以現(xiàn)在放到這里給大家看看,(只給想要入門的一個直觀的感應(yīng),呵呵)
首先當(dāng)然要新建一個項(xiàng)目
然后在Project Properties->Paths->Required Libraries->add->new 這里定義hibernate的類庫 把hibernate的lib下面的所有jar包進(jìn)去 當(dāng)然還有hibernate2.jar也要
然后一路ok下去就可以了。
再來就是hibernate.properties
從hibernate的src下面找到
把它拷到你項(xiàng)目的src目錄下
(什么,你的項(xiàng)目沒有src目錄,新建一個隨便的類就有src目錄了)
這樣一個JB下面的hibernate的開發(fā)環(huán)境就好了
然后在hibernate.properties里面設(shè)置你的數(shù)據(jù)庫連接
默認(rèn)是HypersonicSQL
嗯 接下來的是你最想要做的事情了 其實(shí)很簡單
新建一個類Message.java
代碼如下
package hello;
import java.io.Serializable;
/**
* @author getdown
* @version 1.0
*/
public class Message implements Serializable {
private Long id;
private String text;
//定義一個簡單鏈表 指向另外的一個Message
private Message nextMessage;
public Message() {}
public Message(Long id) {
this.id = id;
}
public Message(String text) {
this.text = text;
}
public Message(Long id, String text) {
this.id = id;
this.text = text;
}
public Long getId() {
return id;
}
private void setId(Long id) {
this.id = id;
}
public String getText() {
return text;
}
public void setText(String text) {
this.text = text;
}
public Message getNextMessage() {
return nextMessage;
}
public void setNextMessage(Message nextMessage) {
this.nextMessage = nextMessage;
}
}
接下來是這個類對應(yīng)的hibernate的配置文件 Message.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 2.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<!--定義類和表的對應(yīng)-->
<class
name="hello.Message"
table="Messages"
>
<!--定義ID字段和生成ID的策略 這里采用identity-->
<id name="id"
column="MESSAGE_ID"
>
<generator class="identity"/>
</id>
<!--定義里面的text字段-->
<property
name="text"
type="string">
<!--定義text字段在數(shù)據(jù)庫里面生成的方法-->
<column
name="TEXT"
length="100"
not-null="true"
/>
</property>
<!--定義對象關(guān)聯(lián)之間的對應(yīng)關(guān)系和關(guān)聯(lián)的字段-->
<many-to-one
name="nextMessage"
cascade="all"
column="NEXT_MESSAGE_ID"
/>
</class>
</hibernate-mapping>
然后就是測試類
package hello;
import net.sf.hibernate.cfg.Configuration;
import net.sf.hibernate.SessionFactory;
import net.sf.hibernate.tool.hbm2ddl.SchemaExport;
import net.sf.hibernate.Session;
import net.sf.hibernate.Query;
import net.sf.hibernate.Hibernate;
import net.sf.hibernate.type.LongType;
import net.sf.hibernate.Transaction;
/**
* @author getdown
* @version 1.0
*/
public class Hello {
public Hello() {
}
public static void main(String[] args) throws Exception {
Configuration cfg = new Configuration().addClass(Message.class);
/** 顧名思義 構(gòu)建表。。。第一次運(yùn)行的時候運(yùn)行下面語句可以在數(shù)據(jù)庫生成表
* 之后可以把下面這句去掉
* */
// new SchemaExport(cfg).create(true, true);
//先生成sessionFactory
SessionFactory sessions = cfg.buildSessionFactory();
//再從sessionFactory得到一個session
Session session = sessions.openSession();
//啟動事務(wù)
Transaction tx = session.beginTransaction();
//開始對數(shù)據(jù)庫的操作
/*----對數(shù)據(jù)庫的創(chuàng)建操作--------*/
Message message = new Message("helloWorld");
//創(chuàng)建一條記錄
session.save(message);
//存入記錄
session.flush();
//提交事務(wù)
tx.commit();
/*---對數(shù)據(jù)庫的查詢操作---------------*/
// Message message = new Message();
// Query q = session.createQuery("from Message as message where message.id=1");
// message = (Message) q.list().get(0);
// message.getNextMessage().setText("helloNext");
// session.flush();
// session.close();
// Long id = new Long(1);
// Message message = (Message) session.find("from Message as message where
message.id=?", id, Hibernate.LONG).get(0);
// System.out.println(message.getText());
// /*-------事務(wù)的處理----------------*/
// try {
// Message message = new Message("hello");
// session.save(message);
// session.flush();
// message = new Message("hello");
// session.save(message);
// session.flush();
// tx.commit();
// }
// catch (HibernateException ex) {
// tx.rollback();
// }
/*-------添加1000條記錄時間--------------*/
// long start = System.currentTimeMillis();
// for(int i = 0; i < 1000; i ++) {
// Message message = new Message("hello");
// session.save(message);
// session.flush();
// }
// tx.commit();
// long end = System.currentTimeMillis();
// System.out.println("添加1000條記錄時間---" + (end-start)/1000 + "s");
session.close();
}
}
ok了 運(yùn)行一下Hello看看出來什么吧
怎么樣 比起CMP的持久 hibernate的持久是不是顯得很輕量級。。
還可以試試看hibernate的性能 把Hello.java的最后一段注釋去掉運(yùn)行看看
當(dāng)然hibernate最重要的還是它的原理,還有很多很好的,很有趣的功能和O/RM設(shè)計(jì)思想等著你自己發(fā)掘。
多看看它自己的文檔,可以學(xué)到很多東西,它的文檔真的非常好。