由於目前我在學校的一個實驗室跟老師學習Java EE開發,老師用的是Seam架構接活做項目,所以這一系列的文章將會向Seam方向寫。。路線大致應該是 : JSP --> Servlet --> Hibernate --> JSF --> EJB3 --> Seam
在開始之前,去www.hibernate.org下載 hibernate4.final.zip ,並將所有依賴的jar檔案放到classpath下
一、Hibernate簡介
持久化,是指將記憶體中的資料儲存到可以永久儲存資料的高裝置中,如硬碟。
Hibernate是一個開放原始碼的對象關係映射(ORM)架構,它對JDBC進行了輕量級的封閉,使得程式員能從繁雜的JDBC操作中徹底解放出來。Hibernate使用hibernate.cfg.xml完成資料庫的配置,使用 *.hbm.xml檔案定義從對象到資料庫的映射規則。
資料庫的配置 : hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN""http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <!-- MySql JDBC驅動類 --> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <!-- MySql DB使用者密碼 --> <property name="hibernate.connection.password">0000</property> <!-- MySql 串連URL --> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/test</property> <!-- MySql DB使用者名稱 --> <property name="hibernate.connection.username">root</property> <!-- MySql JDBC方言 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <!-- 在控制台列印自動產生的SQL語句 --> <property name="hibernate.show_sql">true</property> <!-- 執行個體Bean映射定義檔案 --> <mapping resource="dev/entity/UserBean.hbm.xml"/> </session-factory></hibernate-configuration>
<mapping resource="dev/entity/UserBean.hbm.xml"/>是指定映射規則檔案的路徑。UserBean.hbm.xml定義了從UserBean這個類到關聯式資料庫的映射規則。該檔案應該放在與UserBean.class 同級的目錄下。UserBean這個執行個體bean定義如下:
package dev.entity;public class UserBean{private int id; //用做主鍵private String name;private String pwd;//省略get和set方法}
我們要做的就是將UserBean這個類儲存到資料庫的一張名叫USERBEAN的表中。UserBean的每個屬性都對應著資料表中的一個欄位。首先建立USERBREAN資料表:
create table USERBEAN(ID int key auto_increment,NAME varchar(40),PWD varchar(40));
注意,主鍵 ID欄位必須設定成auto_increment,即自增類型。下面通過UserBean.hbm.xml來定義從類到資料庫的映射規則。
<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN""http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"><!-- Generated Jun 29, 2013 2:13:53 PM by Hibernate Tools 3.4.0.CR1 --><hibernate-mapping> <class name="dev.entity.UserBean" table="USERBEAN"> <id name="id" type="int"> <column name="ID" /> <generator class="native" /> </id> <property name="name" type="java.lang.String" length="40"> <column name="NAME" /> </property> <property name="pwd" type="java.lang.String" length="40"> <column name="PWD" /> </property> </class></hibernate-mapping>
關於這些xml檔案的說明,可以查看官方文檔。上面的xml應該很容易理解,如table屬性指的就是表名,id元素定義了主鍵等等。這裡不再說明
好了,一切準備就緒,下面就開始持久化我們的第一個類吧!
二、使用Hibernate持久化類的流程
構造Configuration對象 --> 構造ServiceRegistry對象 --> 得到SessionFactory對象 -->使用SessionFactory得到Session對象。
得到Session對象後,首先要調用beginTransaction()方法來開啟一個事務,然後調用save()方法將UserBean的執行個體做為參數傳遞進去,再調用Transaction的commit()方法提交事務,這時候UserBean對象才會被儲存到資料庫中。如果調用完save()方法後沒有調用commit(),則不會進行任何的儲存工作,只有當事務關閉或者調用了flush方法後才會真正地將對象持久化。
package dev;import java.rmi.registry.Registry;import org.hibernate.Session;import org.hibernate.SessionFactory;import org.hibernate.cfg.Configuration;import org.hibernate.service.ServiceRegistry;import org.hibernate.service.ServiceRegistryBuilder;import dev.entity.*;public class Main{/** * @param args */public static void main(String[] args){// TODO Auto-generated method stubConfiguration cfg = new Configuration().configure(); //載入設定檔ServiceRegistry registry = new ServiceRegistryBuilder().applySettings(cfg.getProperties()).buildServiceRegistry(); //在得到SessionFactory之前要先進行註冊,Hibernate4新特性SessionFactory factory = cfg.buildSessionFactory(registry);Session session = factory.openSession(); //開啟一個session//填充執行個體beanUserBean user = new UserBean();user.setId(1);user.setName("bruce");user.setPwd("1234567");session.beginTransaction(); //開始一個事務session.save(user); //儲存執行個體對象session.getTransaction().commit(); //提交事務,user會被持久化session.close();}}
注意,如果使用的是Hibernate3或之前的版本,則不需要註冊這一步,即main方法中第二行代碼可以省略,cfg.buildSessionFactory()方法不需要參數。
運行程式,持久化完成。