Hibernate是ORM的解決方案,其底層對資料庫的操作依賴於JDBC,所以您必須先取得JDBC驅動程式,在這邊所使用的是MySQL,所以您必須至 MySQL® Connector/J 取得MySQL的JDBC驅動程式。
接下來至 Hibernate 官方網站 取得Hibernate 3.2、Hibernate Annotations 3.2。
您必須安裝JDK 5.0才可以使用Hibernate Annotations的功能。
解開Hibernate 3.2的zip檔案後,當中的hibernate3.jar是必要的,而在lib目錄中還包括了許多jar檔案,您可以在 Hibernate 3.0官方的參考手冊 上找到這些jar的相關說明,其中必要的是 antlr、dom4j、CGLIB、asm、Commons Collections、Commons Logging、 EHCache,Hibernate底層還需要Java Transaction API,所以您還需要jta.jar。
解開Hibernate Annotations 3.2的zip檔案後,您需要hibernate-annotations.jar、ejb3-persistence.jar這兩個檔案。
到這邊為止,總共需要以下的jar檔案:
Hibernate可以運行於單機之上,也可以運行於Web應用程式之中,如果是運行於單機,則將所有用到的jar檔案(包括JDBC驅動程式)設定至CLASSPATH中,如果是運行於Web應用程式中,則將jar檔案置放於WEB-INF/lib中。
如果您還需要額外的Library,再依需求加入,例如JUnit、Proxool等等,接下來可以將etc目錄下的 log4j.properties複製至Hibernate專案的Classpath下,並修改一下當中的 log4j.logger.org.hibernate為error,也就是只在在錯誤發生時顯示必要的訊息。
接著設置基本的Hibernate配置文件,可以使用XML或Properties檔案,這邊先使用XML,檔名預設為hibernate.cfg.xml:
<?xml version="1.0" encoding="utf-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <!-- 顯示實際操作資料庫時的SQL --> <property name="show_sql">true</property> <!-- SQL方言,這邊設定的是MySQL --> <property name="dialect">org.hibernate.dialect.MySQLDialect</property> <!-- JDBC驅動程式 --> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <!-- JDBC URL --> <property name="connection.url">jdbc:mysql://localhost/demo</property> <!-- 資料庫使用者 --> <property name="connection.username">root</property> <!-- 資料庫密碼 --> <property name="connection.password">123456</property> <!-- 以下設置物件與資料庫表格映射類別 --> <mapping class="onlyfun.caterpillar.User"/> </session-factory> </hibernate-configuration>
這邊以一個簡單的單機程式來示範Hibernate的配置與功能,首先作資料庫的準備工作,在MySQL中新增一個demo資料庫,並建立user表格:
CREATE TABLE user (
id INT(11) NOT NULL auto_increment PRIMARY KEY,
name VARCHAR(100) NOT NULL default '',
age INT
);
對於這個表格,您有一個User類別與之對應,表格中的每一個欄位將對應至User實例上的Field成員。
package onlyfun.caterpillar;
import javax.persistence.*;
@Entity
@Table(name="user") // 非必要,在表格名稱與類別名稱不同時使用
public class User {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
@Column(name="name") // 非必要,在欄位名稱與屬性名稱不同時使用
private String name;
@Column(name="age")
private Integer age; // 非必要,在欄位名稱與屬性名稱不同時使用
// 必須要有一個預設的建構方法
// 以使得Hibernate可以使用Constructor.newInstance()建立物件
public User() {
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
其中id是個特殊的屬性,Hibernate會使用它來作為主鍵識別,您可以定義主鍵產生的方式,這邊設定為自動產生主鍵,可以看到,實體標識,主鍵生成,以及相關映射,都可以使用Annotation來完成。
接下來撰寫一個測試的程式,這個程式直接以Java程式設計人員熟悉的語法方式來操作物件,而實際上也直接完成對資料庫的操作,程式將會將一筆資料存入表格之中:
package onlyfun.caterpillar;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.AnnotationConfiguration;
import org.hibernate.cfg.Configuration;
public class HibernateAnnotationDemo {
public static void main(String[] args) {
// 需要AnnotationConfiguration讀取Annotation訊息
Configuration config = new AnnotationConfiguration().configure();
// 根據 config 建立 SessionFactory
// SessionFactory 將用於建立 Session
SessionFactory sessionFactory = config.buildSessionFactory();
// 將持久化的物件
User user = new User();
user.setName("caterpillar");
user.setAge(new Integer(30));
// 開啟Session,相當於開啟JDBC的Connection
Session session = sessionFactory.openSession();
// Transaction表示一組會話操作
Transaction tx= session.beginTransaction();
// 將物件映射至資料庫表格中儲存
session.save(user);
tx.commit();
session.close();
sessionFactory.close();
System.out.println("新增資料OK!請先用MySQL觀看結果!");
}
}
注意,使用Annotation時,需要的是AnnotationConfiguration類別。
如您所看到的,程式中只需要直接操作User物件,並進行Session與Transaction的相關操作,Hibernate就會自動完成對資料庫的操作,您看不到任何一行JDBC或SQL的陳述,撰寫好以上的各個檔案之後,各檔案的放置位置如下:
接著可以開始運行程式,結果如下:
Hibernate: insert into user (name, age) values (?, ?) 新增資料OK!請先用MySQL觀看結果!
執行結果中顯示了Hibernate所實際使用的SQL,由於這個程式還沒有查詢功能,所以要進入MySQL中看看新增的資料,如下:
mysql> select * from user; +----+-------------+------+ | id | name | age | +----+-------------+------+ | 1 | caterpillar | 30 | +----+-------------+------+ 1 row in set (0.03 sec)