Hibernate 馬上入門(一)

1Hibernate框架介紹:

簡述Hibernate(冬眠)的作用:ORMObject Relational Mapping,對象關係映射。將java程序中的對象自動持久化到關係數據庫中。而Hibernate 的作用好比就是在java 對象與關係數據庫之間的一座橋樑,它主要負責兩者之間的映射。在Hibernate 內部封裝了JDBC技術(但只是一個輕量級的封裝,因而可以讓程序設計人員更方便的以面向對象的思想操縱數據庫),並向外提供API 接口。 常見的ORMapping框架: hibernatetoplinkojb等。

 

 

2Hibernate框架結構:

源碼包結構(可以在www.hibernate.org下載): * |- doc API references (參考手冊)

java persistence with hibernate (Gavin King) |- eg hibernate框架開發例子(拍賣行) *|- etc 配置文件 |- grammar hql語法目錄 *|- lib 第三方jar |- src 源代碼目錄 |- test 測試目錄 *|- hibernate3.jar

 

3Hibernate框架開發概述:

1)搭建開發環境: a) 導入jar包: 1 hibernate3.jar 2 第三方jar 3 ojdbc14.jar (驅動文件) b)導入配置文件: Ahibernate.cfg.xml (etc) 作用: 配置hibernate運行相關的參數 名字:hibernate.cfg.xml 放置位置:src根下面

具體內容:a)連接相關的參數 <hibernate-configuration> <session-factory> <property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost/hibernate</property> <property name="connection.username">root</property> <property name="connection.password">root</property> …… </session-factory> </hibernate-configuration>

c) Hibernate自身屬性相關的參數 dialect方言:通過方言告知hibernate連接的是那種數據庫,hibernate會根據這種數據庫的特點,進行性能調優。 show_sql :true|false會把hibernate運行過程中執行的sql語句顯示在控制檯中。 format_sql: true|false會把hibernate在控制檯中執行的sql語句格式化輸出。 <propertyname="dialect">org.hibernate.dialect.MySQLDialect</property> <property name="show_sql">true</property> <property name="format_sql">true</property> Bxxx.hbm.xml (映射文件): 書寫ORMapping:類 ---- 表; 名字:.hbm.xml結尾; 放置位置:隨便。

 

2) Hibernate CORE API (簡述): a) Configuration (讀取配置文件) b) Session .save() update() delete() get() |- Transaction(事務) 要求: save() update() delete() 必須手工控制事務 |- Query 複雜插敘(非主鍵的查詢) c) SessionFactory 創建Session

 

3) hibernate開發過程O-R-Ma) O 創建Entity Object b) R 創建實體對應的表 c) M (mapping) 映射文件 ORM映射原則 4)映射文件的註冊: 在hibernate.cfg.xml 中配置: <mapping resource="xxx.hbm.xml" /> 5) HibernateAPI 編程: a) 讀取配置文件 Configurationb) 獲得SessionFactoryc) 獲得Sessionsave() update() delete() get()。 注意:事務處理(Transaction)。

 

4Hibernate_CORE_API(高級ADV):

1)Configuration讀取配置文件: a)配置文件: 1) hibernate.cfg.xml 2) xxx.hbm.xml 映射文件 b) hibernate程序一啓動,就需要應用Configuration讀取配置文件 2)SessionFactory (接口): *重量級對象(資源);特點: 大量侵佔內存資源,功能強。 功能:1 創建Session 2 二級緩存 、、、、、、

注意:在一個應用中,只創建一個SessionFactorySessionFactory內部處理多

線程訪問的問題 3) Session 提供通用的API進行: 輕量級(對象)資源 注意: 每一次用戶操作,都要創建一個新的Session完成,不能被多用戶共享。 ACRUD 增刪改查。 BSession 內部封裝了 Jdbc Connection

 

4) Hibernate查詢,應用非主鍵進行查詢: SQLStructured query language)結構化的查詢語言: select * from t_teacher_suns where name= ? HQLhibernate query language): 例如: sql: select * from t_teacher_suns; hqlfrom Teacher sql: select * from t_teacher_suns where t_name = 'suns'; hql:from Teacher as t where t.name='suns' sql:select * from t_teacher_suns where t_name = 'suns' and t_age = 10; hql:from Teacher as t where t.name='suns' and t.age = 10;

 

HQL 特點: 1類似於SQL 2沒有select關鍵字 3 from類名 4如果有條件進行判斷 通過 as 定義類的別名;通過別名.屬性訪問操作數據。 使用Query對非主鍵進行查詢: 例如: Query query = session.createQuery("from Teacher"); List<Teacher> teachers = query.list(); Query query = session.createQuery("from Teacher as t where t.name = ? and t.age= ? "); query.setString(0,"xiaohei"); query.setInteger(1, 10); List<Teacher> teachers = query.list();

 

5Hibernate實體間關聯關係:

1)實體關聯關係分爲: 1:1 1:* *:1 *:* 一對一 一對多 多對一 多對多 2)例如:Hibernate 處理有關聯關係的實體(O R M) 1O 對象 處理有關聯關係的實體:

Person (人) Passport(護照) id id name serial age expiry Passport pp Person pp 關係屬性:把關係的一方,作爲一個屬性,存儲在本方,從而表達出兩個對象之間的關係;

關係的方向性: 根據具體的需求而定; 單向關係: 只能從關係的一方找到另一個方; 雙向關係: 關係的雙方彼此都可以找到對方; 傳遞性持久化(級聯):對關係的一方進行操作關係的另一方同時也會級聯操作。 例如: session.save(Person); 自動把Passport一起保存; session.save(Passport); 自動把Person一起保存; session.get(Person.class,pk); 自動把Passport一起查詢。

 

2R 數據庫 處理關聯關係: 外鍵:一張表的主鍵內容到另外一張表中充當外鍵,從而保證兩張表的關係; 關係的方向性:雙向關係; 注意: 沒有外鍵 父表 1 先插入父表 有外鍵 子表 * 先刪除子表 例如(表結構): t_user 沒有外鍵 父表 1 先插入父表 id name age 1 suns 30 2 liyi 32 t_order 有外鍵 子表 * 先刪除子表 id order_no price u_id 1 2001 10 1 2 2002 20 1 3 2003 30 2

 

3M 映射文件:

A.一對一,主鍵同時作爲外鍵的映射文件xxx.hbm.xml:

 

<class name="Person" table="t_person"> <id name="id" column="t_id" type="java.lang.Integer"> <generator class="increment"/> </id> <property name="name" column="t_name" type="java.lang.String"/> <property name="birthday" column="t_birthday" type="java.util.Date"/> <one-to-one name="p" class="Passport" cascade="all"></one-to-one> </class> <class name="Passport" table="t_passport"> <id name="id" column="t_id" type="java.lang.Integer"> <generator class="foreign"> <param name="property">p</param> </generator>

</id> <property name="serial" column="t_serial" type="java.lang.String"></property> <property name="exprity" column="t_expiry" type="java.lang.Integer"></property> <one-to-one name="p" class="Person" cascade="all" constrained="true"/>

</class>

 

B.一對一,關聯表有獨立外鍵的映射文件xxx.hbm.xml:

<class name="Company" table="t_company"> <id name="id" column="t_id" type="java.lang.Integer"> <generator class="increment"></generator> </id> <property name="name" column="t_name" type="java.lang.String"></property> <property name="open" column="t_open" type="java.util.Date"></property> <one-to-one name="address" class="Address" property-ref="company" cascade="save-update"></one-to-one> </class> <class name="Address" table="t_address"> <id name="id" column="t_id" type="java.lang.Integer"> <generator class="increment"></generator> </id> <property name="city" column="t_city" type="java.lang.String"></property> <property name="street" column="t_street" type="java.lang.String"></property> <property name="zipCode" column="t_zip_code" type="java.lang.String"></property> <many-to-one unique="true" name="company" class="Company" column="c_id" cascade="save-update"></many-to-one>

</class>

C.一對多,映射文件xxx.hbm.xml(注意:inverse="true":

<class name="Dept" table="t_dept"> <id name="id" column="t_id" type="java.lang.Integer"> <generator class="increment"/> </id> <property name="name" column="t_name" type="java.lang.String"/> <property name="code" column="t_code" type="java.lang.String"/> <property name="open" column="t_open" type="java.util.Date"/> <set inverse="true" name="employees" cascade="save-update"> <key column="d_id"/> <one-to-many class="Employee"/> </set> </class> <class name="Employee" table="t_employee"> <id name="id" column="t_id" type="java.lang.Integer">

<generator class="increment"/>

</id> <property name="name" column="t_name" type="java.lang.String"/> <property name="birthday" column="t_birthday" type="java.util.Date"/> <property name="age" column="t_age" type="java.lang.Integer"/> <property name="salary" column="t_salary" type="java.lang.Double"/> <many-to-one name="dept" class="Dept" column="d_id" cascade="save-update"></many-to-one>

</class>

D.多對多,映射文件xxx.hbm.xml:

 

<class name="Student" table="t_student"> <id name="id" type="java.lang.Integer"> <generator class="increment"> </generator> </id> <property name="name" type="java.lang.String"></property> <property name="age" type="java.lang.Integer"></property> <set name="courses" cascade="save-update" table="t_s_c" > <key column="s_id"/> <many-to-many column="c_id" class="Course"></many-to-many> </set> </class> <class name="Course" table="t_course"> <id name="id" type="java.lang.Integer"> <generator class="increment"></generator> </id> <property name="name" type="java.lang.String"></property> <property name="score" type="java.lang.Integer"></property> <set inverse="true" name="students" cascade="save-update" table="t_s_c"> <key column="c_id"/> <many-to-many column="s_id" class="Student"></many-to-many> </set>

</class>

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章