Hibernate框架原理及使用

阿木俠發表於2017-05-10

Hibernate實現了物件導向的方式進行資料庫操作,是對JDBC進行輕量級封裝的成果,方法是將POJO物件和資料庫表建立關係。簡單的來說,使用Hibernate之後,運算元據庫就不需要像之前的JDBC那樣進行復雜的操作了。

使用hibernate的好處是:

1、更加物件化,以物件化的思維運算元據庫,我們只需要操作物件就可以了,開發更加物件化,符合Java物件導向的思想。
2、移植性高,因為Hibernate做了持久層的封裝,不直接運算元據庫,所有的程式碼都具有可複用性。
3、Hibernate是一個沒有侵入性的框架,沒有侵入性的框架我們稱為輕量級框架。對比Struts的Action和ActionForm,都需要繼承,離不開Struts。Hibernate不需要繼承任何類,不需要實現任何介面。

Hibernate實體類中有三種狀態:

瞬時狀態:使用new剛剛建立,還沒有被持久化,且不處於session的快取中
持久狀態:已經被持久化了,而且加入到了Session的快取中
遊離狀態:已經被持久化了,但是不再處於Session的快取中

那麼如何使用Hibernate呢?

配置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">

<!-- Generated by MyEclipse Hibernate Tools.                   -->
<hibernate-configuration>

    <session-factory>
        <property name="dialect">org.hibernate.dialect.Oracle9Dialect</property>
        <property name="connection.url">jdbc:oracle:thin:@603-4:1521:orcl</property>
        <property name="connection.username">root</property>
        <property name="connection.password">root</property>
        <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>
        <property name="myeclipse.connection.profile">mydriver</property>
    
    </session-factory>

</hibernate-configuration>
配置*.hbm.xml對映檔案,也就是POJO和Table的對映:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<!-- 
    Mapping file autogenerated by MyEclipse Persistence Tools
-->
<hibernate-mapping>
    <class name="com.pojo.Dh12Info" table="STU_INFO" schema="xxx">
        <id name="SId" type="java.lang.Long"> 此ID為類中的屬性
            <column name="S_ID" precision="30" scale="0" />--此處的ID是表中的欄位
            <generator class="sequence" /> --ID的生成策略是sequence進行
        </id>
        <property name="SName" type="java.lang.String"> --實體列
            <column name="S_NAME" length="30" /> -- 表中的欄位
        </property>
        <property name="SSex" type="java.lang.Integer">
            <column name="S_SEX" precision="1" scale="0" />
        </property>
        <property name="SBri" type="java.util.Date">
            <column name="S_BRI" length="7" />
        </property>
        <property name="SAdd" type="java.lang.String">
            <column name="S_ADD" length="500" />
        </property>
        <property name="STel" type="java.lang.String">
            <column name="S_TEL" length="15" />
        </property>
        <property name="SQq" type="java.lang.String">
            <column name="S_QQ" length="30" />
        </property>
    </class>
</hibernate-mapping>

使用Hibernate運算元據的流程是:

讀取並解析配置檔案 -----讀取並解析對映檔案,建立SessionFactory------開啟session-------開啟一個事務-------運算元據庫--------提交或者回滾事務-------關閉session。

下面用一個例子來展示如何運算元據庫:

public class AddTest extends TestCase {
	Configuration conf = null;
	SessionFactory sessionFactory = null;
	Session session = null;
	Transaction tran = null;
	protected void setUp() throws Exception {
		//完成1234步驟
		//第一步:讀取並解析配置檔案
		conf = new Configuration().configure();
		//第二步:讀取並解析對映檔案
		sessionFactory = conf.buildSessionFactory();
		//第三步:開啟session
		session = sessionFactory.openSession();
		//第四步:開啟一個事務
		tran = session.beginTransaction();
	}
	protected void tearDown() throws Exception {
		//完成7步驟
		//第七步:關閉回話
		session.close();
	}
	public void add(){
		//真正完成資料庫的操作
		StuInfo pojo = new StuInfo("張三",1,new Date(),"山西省太原市","137227839","5445567858");
		try {
			session.save(pojo);
			tran.commit();//提交
		} catch (Exception e) {
			tran.rollback();
			e.printStackTrace();
			// TODO: handle exception
		}
	}

}
使用Hibernate,少量的程式碼便實現了資料的插入 ,session.save(pojo);,是對SQL的封裝,實現插入資料。

對於修改和刪除來說,我們要先進行資料庫查詢操作:使用Hibernate實現資料庫的查詢操作,Session中提供了兩種的載入資料的方式
Object get(Class c,id):通過ID載入資料,返回實體類物件,使用get載入資料的時候,如果資料不存在則返回null
Object load(Class c ,id): 通過ID載入資料,返回實體類物件,如果資料不存在,則會丟擲異常

如下:

public void update(){
		//真正完成資料庫的操作
		StuInfo pojo = (StuInfo)session.get(StuInfo.class,new Long(1));
		pojo.setSName("李四");
		try {
			session.update(pojo);
			tran.commit();//提交
		} catch (Exception e) {
			tran.rollback();
			e.printStackTrace();
			// TODO: handle exception
		}
	}

刪除操作同理:

public void delete(){
		StuInfo pojo = (StuInfo)session.get(StuInfo.class,new Long(1));
		try {
			session.delete(pojo);//刪除
			tran.commit();//提交
		} catch (Exception e) {
			tran.rollback();
			e.printStackTrace();
			// TODO: handle exception
		}
	}

以上就是對資料進行增刪改查的方法。(提示)本例中沒有使用main方法,而是使用Junit單元測試,所以要匯入相應的包。





相關文章