java學習:Hibernate入門


相對微軟的linq-to-sql或EF框架而言,"Hibernate對於eclipse的集成開發“ 新手並不容易掌握,下面是新手上路的步驟:

一、准備工作:

1、先下載eclipse (官網 http://eclipse.org/) 注:如本機已經安裝了eclipse,可跳過

2、下載Hibernate 最新版本(目前已經到了4.X版本) (官網 http://hibernate.org/ )

3、根據你的db使用情況,下載對應的jdbc驅動包(本文使用的是oracle,本機安裝完oracle client后就能找到)

4、下載commons-logging.jar包(Hibernate內部記錄日志用的是它)  (官網 http://commons.apache.org/logging/

5、在數據庫里先創建一個測試表TMP_EMP (雖然Hibernate推薦 先設計DomainModel->再持久化到db,但是實際開發中,往往是先有表結構,再開始寫代碼的,所以還是以大多數人習慣的方式為准)

--先創建表

-- Create table
create table TMP_EMP
(
  ID       NUMBER(10) not null,
  NAME     VARCHAR2(50),
  BIRTHDAY DATE,
  SEX      CHAR(1),
  SALARY   NUMBER(8,2)
);
-- Add comments to the columns 
comment on column TMP_EMP.ID
  is '主鍵ID';
comment on column TMP_EMP.NAME
  is '姓名';
comment on column TMP_EMP.BIRTHDAY
  is '日期';
comment on column TMP_EMP.SEX
  is '性別(F女,M男)';
comment on column TMP_EMP.SALARY
  is ' 工資';
-- Create/Recreate primary, unique and foreign key constraints 
alter table TMP_EMP
  add constraint PK_TMP_EMP_ID primary key (ID);


-- 創建Sequence序列
create sequence SQ_TMP_EMP
minvalue 1
maxvalue 9999999999999999999999999
start with 201
increment by 1
cache 200;

6、安裝Hibernate Tools 插件(理論上講,這一步可以不用,但是沒這個插件,就只能純手動編寫各種hibernate配置xml了)

啟用eclipse后,如果File->New 能找到Hibernate的相關選項,說明你的機器已經安裝好了Hibernate Tools,可跳過本步驟

否則,Help->Eclipse Marketplace

Find欄輸入Hibernate,就能聯網找到相關的下載地址:

二、創建一個常規的java project,命名為HelloHibernate

創建過程中,注意導入所需的jar包,這些jar包可分為三大類:Hibernate解壓目錄中lib\required下的jar包、jdbc數據庫驅動包、common-logging.jar日志工具包

三、創建Hibernate配置文件(hibernate.cfg.xml)

如果之前沒有配置過其它db連接,可以點擊Get Values from Connection,創建一個連接

設置相關的參數,如果沒問題的話,可以點擊Test Connection測試下參數是否正常

把這個連接,命名myConn后保存,這時再點擊"Get Values from Connection",在彈出的對話框里,就能看到剛才創建的連接myConn

其實這一系列操作,無非就是為了讓ide幫我們生成下面這份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>
        <property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
        <property name="hibernate.connection.password">密碼</property>
        <property name="hibernate.connection.url">jdbc:oracle:thin:@//服務器IP:1521/orcltest</property>
        <property name="hibernate.connection.username">用戶名</property>
        <property name="hibernate.default_schema">默認Schema</property>
        <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property>
    </session-factory>
</hibernate-configuration>

里面記錄了數據庫連接的一些關鍵信息,所以hibernate運行時,就能根據這些信息,知道如何去連接db,以及如何生成sql.

弄好這一步后,還可以在Hibernate Configurations面板里驗證一下db連接是否正常,參考下圖:Window->Show View->Other  

 

輸入hiber,應該就能自動過濾出想要的記錄,選中Hibernate Configurations

然后在eclipse里,就能找到這個面板,展開Database,如果一切順利,應該能自動列出相應的表名

四、創建反向工程配置文件(hibernate.reveng.xml),自動根據表結構,生成實體類

ORM中:通常一個表對應的就是一個類,如果所有類都要手動編寫代碼,要累死人的,幸好hibernate tools提供了"根據db表結構反向生成實體類"的功能

參考下圖,創建一個 Hibernate Reverse Engineering File

參考下圖,點擊Refresh,先把所有表列出來,這里出於演示,我們只把測試表TMP_EMP包含進來(即只處理這一張表)

完成之后,可以看到還有其它很多選擇,點擊"Tables & Columns"

把TMP_EMP給Add進來

類似的,這些圖形化的操作,其實就是要生成一段xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd" >

<hibernate-reverse-engineering>
	<table-filter match-name="TMP_EMP" />
	<table name="TMP_EMP">
		<column name="ID"></column>
		<column name="NAME"></column>
		<column name="BIRTHDAY"></column>
		<column name="SEX"></column>
		<column name="SALARY"></column>
	</table>
</hibernate-reverse-engineering>

該xml的內容,相當於db表結構的元數據,有了它,hibernate就能知道:每張表(及表里的每個字段)如何生成java中的類(及類的成員)

下面就讓這些配置run起來,參考下圖:(這個很坑,貌似在菜單里找不到,只能在工具欄里點擊,而且還隱藏一個下拉菜單里)

注:如果工具欄里沒有顯示這個按鈕,可以 window -> Customize Perspective,切換到Command Groups Availablity標簽頁,把Hibernate Code Generation給勾選上

這時,會彈出Hibernate的代碼生成配置界面,比較重要的是:代碼生成的輸出目錄(output directory),以及選擇剛才創建的 reveng.xml(不選這個,hibernate就不知道要生成哪些表,以及生成的規則)

在Exporters面板里,通常我們只需要生成Domain Code(即:實體類),勾中

有時,生成java類后,eclipse不會自動刷新文件結構,建議下面這個也勾上

最后點擊Run,順利的話,就能看到新生成的java類

五、生成hibernate映射配置文件

剛才創建的反向工程配置文件,在運行時其實沒多大作用,它只是用來告訴hiernate如何根據表結構生成java實體類,對於已經存在的java類(比如純手寫的),運行時,hibernate如何知道它對應於db中哪張表呢?答案還是配置文件,參考下圖,創建Hibernate XML Mapping file(即hbm文件)

選擇實體類所對應的包(或某個具體的類)

一路Next,直到完成,這樣我們就得到了文件:TmpEmp.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 Dec 26, 2012 1:44:52 PM by Hibernate Tools 3.4.0.CR1 -->
<hibernate-mapping>
    <class name="domain.TmpEmp" table="TMP_EMP">
        <id name="id" type="long">
            <column name="ID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="birthday" type="java.util.Date">
            <column name="BIRTHDAY" />
        </property>
        <property name="sex" type="java.lang.Character">
            <column name="SEX" />
        </property>
        <property name="salary" type="java.math.BigDecimal">
            <column name="SALARY" />
        </property>
    </class>
</hibernate-mapping>

這面就記錄了每個java類與表之間的映射關系,最后一步配置相關的操作:

生成hbm文件后,hibernate如何知道去讀這個文件呢?我們總得給hibernate一些提示吧,雙擊hibernate.cfg.xml文件,找到Mappings節點,如下圖:

點擊add,把剛才創建的TmpEmp.hbm.xml給添加進來

保存之后,你會發現,其實無非就是在hibernate.cfg.xml里,自動加了一行:

  <mapping resource="domain/TmpEmp.hbm.xml"/>

最后來玩一把:創建一個帶main方法的類

package app;

import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import domain.TmpEmp;
import java.util.List;

public class Hello {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		Session ss = getSession();
		List result = ss.createQuery("from TmpEmp").list();
		for (TmpEmp t : (List<TmpEmp>) result) {
			System.out.println("Id:" + t.getId() + ",Name:" + t.getName());
		}
		ss.close();
	}

	static SessionFactory sessionFactory;

	static Session getSession() {
		if (sessionFactory == null) {
			sessionFactory = new Configuration().configure().buildSessionFactory();
		}

		return sessionFactory.openSession();
	}

}

這里只演示了最簡單的查詢,順利的話,Console面板里,就應該有結果了(如下圖)

注:Hibernate升級到4以后,原來的buildSessionFactory()方法在eclipse里會提示“過時”,最新4.3版hibernate下的正確寫法為:

 1     private static SessionFactory factory;
 2 
 3     public static SessionFactory getFactory() {
 4         Configuration configuration = new Configuration().configure();
 5         StandardServiceRegistryBuilder builder = new StandardServiceRegistryBuilder()
 6                 .applySettings(configuration.getProperties());
 7         StandardServiceRegistryImpl registry = (StandardServiceRegistryImpl) builder
 8                 .build();
 9         factory = configuration.buildSessionFactory(registry);
10 
11         return factory;
12 
13     }
14 
15     public static Session getSession() {
16         return factory.openSession();
17     }

 

使用上述代碼前,先import下面這幾個package

1 import org.hibernate.Session;
2 import org.hibernate.SessionFactory;
3 import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
4 import org.hibernate.boot.registry.internal.StandardServiceRegistryImpl;
5 import org.hibernate.cfg.Configuration;

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM