前言: 對象-關係映射(ORM),是隨著物件導向的軟體開發方法發展而產生的一種為瞭解決物件導向與關聯式資料庫存在的互不匹配的現象的技術,本質上就是將資料庫從一種形式轉換到另外一種形式。ORM是通過使用描述對象和資料庫之間映射的中繼資料,將java程式中的獨享自動持久化到關聯式資料庫中。Hibernate是實現ORM的架構,是這種思想的一個很好的體現。
Hibernate的幾種映射:
完成Hibernate映射主要用到的檔案有: 1、映射類(*.java):它是描述資料庫表得結構,表中的欄位在類中被描述成屬性,將來就可以實現把表中的記錄映射成為該類的對象了。 2、對應檔(*.hbm.xml):它是指定資料庫表和映射類之間的關係,包括映射類和資料庫表的對應關係、表欄位和類屬性類型的對應關係以及表欄位和類屬性的對應關係等。 3、hibernate核心設定檔(*.properties/*.cfg.xml):它指定hibernate的一些核心配置,包含與資料庫連接時需要的串連資訊,比如串連哪種資料庫、登入資料庫的使用者名稱、登入密碼、連接字串等,以及對應檔的地址資訊。
基本映射
java對象:User類
package com.xuxiaoguai.hibernate; import java.util.Date; public class User { private int id; private String name; private String password; public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
關聯式模式:
對應檔: 實體類——表,採用<class>標籤映射 實體類中的普通屬性(不包括集合、自訂類和數組)——表欄位,採用<property>標籤映射 注意:當實體類的名字如果和資料庫的一些關鍵字重了,將會有問題,這個表將會不能匯出,這時可以考慮採用table column對其進行重新命名。
對應檔具體說明:
<!-- XML檔案的聲明 --> <?xml version="1.0"?> <!-- hibernate DTD檔案的聲明 --> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- 對應檔的根節點 --> <hibernate-mapping package="com.jialin.hibernate"> <!-- 對象關係映射的開始:class元素表示類和資料庫中的表的映射關係。 name屬性指定持久化類(或者介面)的Java全限定名; table屬性指定要映射的對應的資料庫表名,如果省略,則以name作為表名 --> <class name="User" table="t_user"> <!-- 持久化類對象的物件識別碼(OID)和表的主鍵的映射關聯: name屬性指定類中作為OID的屬性名稱; column屬性工作表中主鍵欄位的名字;如果省略,則以name作為欄位名 --> <id name="id" column="id"> <!-- 指定物件識別碼產生器:class屬性指定產生器的類別名 --> <generator class="native" /> </id> <!-- 普通屬性的映射: name屬性:屬性的名字,以小寫字母開頭; column屬性:對應的資料庫欄位名.如果省略,則以name作為欄位名 type屬性:指定Hibernate的映射類型、如果省略,則自動匹配 --> <property name="name" column="user_name" type="string"/> <property name="password" /> </class> </hibernate-mapping>
hibernate核心設定檔:
<! 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" >com.mysql.jdbc.Driver </property > <property name= "hibernate.connection.url">jdbc:mysql:localhost:3306/hibernate_first </property > <property name= "hibernate.connection.username">root</property > <property name= "hibernate.connection.password">123456</property > <property name= "hibernate.dialect">org.hibernate.dialect.MySQLDialect </property > <property name ="hibernate.show_sql"> true</ property> <property name ="hibernate.format_sql"> true</ property> <!-- 引入User類的對應檔 --> <mapping resource ="com/bjpowernode/hibernate/User.hbm.xml"/> </session-factory ></hibernate-configuration>
實體類的設計原則: 實現無參的預設的建構函式 提供一個標識 建議不要使用final修飾實體類 建議為實體類產生getter setter方法
基本的hibernate配置已經完成,接下來就是如何產生表到資料庫中,首先要有可以讀取hibernate核心設定檔的類,然後建立SessionFactory,所有的操作都要放到一個線程內,所以要有線程的開閉,這樣一個Utils類,如下:
public class HibernateUtils { private static SessionFactory factory; static{ try{ //預設讀取hibernate.cfg.xml檔案 Configuration cfg= new Configuration().configure(); //建立SessionFactory factory=cfg.buildSessionFactory(); } catch(Exception e){ e.printStackTrace(); } } public static Session getSession(){ return factory.openSession(); } public static void closeSession(Session session){ if(session != null){ if(session.isOpen()){ session.close(); } } } public static SessionFactory getSessionFactory(){ return factory; } }
在調用方法的時候要有事務的開始,關閉,以及出錯的時候的復原。
public class basicTest extends TestCase { public void testSvae1(){ Session session= null; try{ session=HibernateUtils. getSession(); session.beginTransaction(); //對資料庫表的增刪改查等 session.getTransaction().commit(); } catch(Exception e){ e.printStackTrace(); session.getTransaction().rollback(); } finally{ HibernateUtils. closeSession(session); } }} 這樣到此為止,從配置hibernate的基本映射的流程就完成了。就是把ORM的映射機制放到了實體類對應檔中,通過標籤來實現這種思想,將java的類持久化到資料庫中。hibernate的基本映射針對的是一個類,以後的學習中會涉及到多個類,即多對一、一對一等等,而基本映射是一個基礎,其他的在這個基礎上通過不同的標籤實現各種關聯映射。