Hibernate (開源物件關係對映框架)

覆手為雲p發表於2018-06-09


一、基本介紹
1、它對JDBC進行了非常輕量級的物件封裝,它將POJO與資料庫表建立對映關係,是一個全自動的orm(物件關係對映)框架,hibernate可以自動生成SQL語句,自動執行; Hibernate可以應用在任何使用JDBC的場合。
2、持久化層:處理關係型資料庫(資料儲存層)和模型物件(object,業務邏輯模型)的對映關係的程式碼方法(ORM)
3、Hibernate是一個基於JDBC的主流持久化框架,對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼,是一個優秀的ORM實現,它很大程度的簡化了dao層編碼工作。
4、下載地址:http://www.hibernate.org/downloads
5、新建hibernate.cfg.xml或 hibernate.properties,放在專案根目錄,用於配置資料庫的相關資訊;xlm標頭檔案資訊可在hibernate-core-5.3.0.Final.jar中的dtd檔案中找到,同時一個類物件的對映xml檔案的頭也可以在這個jar包的dtd檔案中找到;

二、Hibernate的API
  一共有6個,分別為:Session、SessionFactory、Transaction、Query、Criteria和Configuration。通過這些介面,可以對持久化物件進行存取、事務控制。
    1、使用示例:

        // 使用Hibernate的API來完成將Customer資訊儲存到mysql資料庫中的操作
        Configuration config = new Configuration().configure(); // Hibernate框架載入hibernate.cfg.xml檔案
        SessionFactory sessionFactory = config.buildSessionFactory();//據庫儲存源。根據Hibernate配置檔案建立對應的資料庫儲存源。SessionFactory物件建立後,和Configuration物件再無關聯。
        Session session = sessionFactory.openSession(); // 相當於得到一個Connection
        // 開啟事務
        session.beginTransaction();

        // 使用者自己的操作,常用的還有update(),delete(),load(),get()後兩個都是查詢,get()是直接傳送sql語句查詢,load是使用代理技術,當要查詢時,代理呼叫Hiberate查詢資料庫,並初始化其他屬性;createQuery()可執行自定sql語句,但是使用的變數名是object裡邊的,具體待查;也可以使用SQLQuery物件來執行原生的sql語句;
        session.save(obj);

        // 事務提交
        session.getTransaction().commit();
        session.close();
        sessionFactory.close();

    2、session物件方法:

     Transaction beginTransaction()    開始工作單位,並返回關聯事務物件。
     void cancelQuery()                取消當前的查詢執行。
     void clear()                      完全清除該會話。
     Connection close()                通過釋放和清理 JDBC 連線以結束該會話。
     Criteria createCriteria(Class persistentClass)    為給定的實體類或實體類的超類建立一個新的 Criteria 例項。
     Criteria createCriteria(String entityName)        為給定的實體名稱建立一個新的 Criteria 例項。
     Serializable getIdentifier(Object object)         返回與給定實體相關聯的會話的識別符號值。
     Query createFilter(Object collection, String queryString)    為給定的集合和過濾字元建立查詢的新例項。
     Query createQuery(String queryString)             為給定的 HQL 查詢字元建立查詢的新例項。
     SQLQuery createSQLQuery(String queryString)       為給定的 SQL 查詢字串建立 SQLQuery 的新例項。
     void delete(Object object)                        從資料儲存中刪除持久化例項。
     void delete(String entityName, Object object)     從資料儲存中刪除持久化例項。
     Session get(String entityName, Serializable id)   返回給定命名的且帶有給定識別符號或 null 的持久化例項(若無該種持久化例項)。
     SessionFactory getSessionFactory()                獲取建立該會話的 session 工廠。
     void refresh(Object object)                       從基本資料庫中重新讀取給定例項的狀態。
     Transaction getTransaction()                      獲取與該 session 關聯的事務例項。
     boolean isConnected()                             檢查當前 session 是否連線。
     boolean isDirty()                                 該 session 中是否包含必須與資料庫同步的變化?
     boolean isOpen()                                  檢查該 session 是否仍處於開啟狀態。
     Serializable save(Object object)                  先分配一個生成的標識,以保持給定的瞬時狀態例項。
     void saveOrUpdate(Object object)                  儲存(物件)或更新(物件)給定的例項。
     void update(Object object)                        更新帶有識別符號且是給定的處於脫管狀態的例項的持久化例項。
     void update(String entityName, Object object)     更新帶有識別符號且是給定的處於脫管狀態的例項的持久化例項。

    3、Transaction物件的使用:
    封裝了事務的操作。我們做增刪改查等操作時,必須開啟事務.因為session是執行緒不安全的,這樣主要是為了執行緒安全。保證資料的正確性。
            開啟事務: Transaction ts=session.beginTransaction();
            提交事務:ts.commit();
            回滾事務:ts.rollback();
            當通過getCurrentSession獲取當前執行緒繫結的Session時,事務關閉時,會自動把Session關閉並刪除。   
    4、xxx類的對映檔案xxx.hbm.xml配置示例(這些都可以通過註解實現):

    <!DOCTYPE hibernate-mapping PUBLIC 
     "-//Hibernate/Hibernate Mapping DTD//EN"
     "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd"> 

  <hibernate-mapping>
    <!--定義從一個 Java 類到資料庫表的特定對映-->
   <class name="Employee" table="EMPLOYEE">
     <!--可選-->
      <meta attribute="class-description">
         This class contains the employee detail. 
      </meta>
      <!--主鍵,其中generator標籤可自動生成主鍵值-->
      <id name="id" type="int" column="id">
         <generator class="native"/>
      </id>
      <!--其他普通的值,name是物件中屬性名字,column是資料庫的對應的名字-->
      <property name="firstName" column="first_name" type="string"/>
      <property name="lastName" column="last_name" type="string"/>
      <property name="salary" column="salary" type="int"/>
   </class>
  </hibernate-mapping>

    5、Hibernate 註解
    使用環境:需要安裝 Hibernate 3.x 註釋包,從 Hibernate 註釋釋出中拷貝 hibernate-annotations.jar, lib/hibernate-comons-annotations.jar 和 lib/ejb3-persistence.jar 到你的 CLASSPATH。
    @Entity     志著一個類為一個實體 bean
    @table         註釋提供了四個屬性,允許您覆蓋的表的名稱,目錄及其模式,在表中可以對列制定獨特的約束
    @Id            主鍵;
    @Column        指定某一列與某一個欄位或是屬性對映的細節資訊,常用屬性有:name,length,nullable,unique;
        
    6、Hibernate中持久化類編寫規範;
       1)、必須提供無引數的預設構造方法。因為程式執行時,Hibernate會運用java的反射機制,建立實體類的例項。
       2)、所有屬性必須提供public訪問控制符的set get方法
       3)、屬性應儘量使用基本資料型別的包裝型別(如Integer)
                基本資料型別無法表達null值,所有基本資料型別的預設值都不是null,這樣就有很大的缺陷。
                例如有一個score屬性,表示學生分數,如果為0,那麼是表示該學生未參加考試還是說該學生成績為0呢?
                這時候如果用包裝型別,就可以使用null來表示空值,學生未參加考試等等。
       4)、不要用final修飾實體(將無法生成代理物件進行優化)

三、查詢語句:
1、HQL
    物件導向的類似sql的語句;
    1)、基礎示例;

    String hql = "FROM Employee";        //查詢這個Employee類的所有資料庫資料,類名前也可以使用完成的包路徑;
    Query query = session.createQuery(hql);
    List results = query.list();

    其他語法:
    FROM Employee AS E                給類建立別名
    SELECT E.firstName FROM Employee E        只查詢特定項的資料;
    FROM Employee E WHERE E.id = 10            條件查詢,類似的使用還有ORDER BY ,GROUP BY,UPDATE,DELETE,INSERT,SUM,MAX,MIN,COUNT,AVG,DISTINCT等
    2)、傳引數示例:

    String hql = "FROM Employee E WHERE E.id = :employee_id";
    Query query = session.createQuery(hql);
    query.setParameter("employee_id",10);
    List results = query.list();

    3)、分頁
    query.setFirstResult(int startPosition)         表示結果中的第幾行,從 0 行開始。
    query.setMaxResults(int maxResult)                最大檢索結果數量;
2、標準查詢(Criteria)
    當使用標準查詢時返回一個持久化物件類的例項
    1)基礎示例:

    Criteria cr = session.createCriteria(Employee.class);    
    cr.add(Restrictions.eq("salary", 2000));    //查詢所有salary=2000的結果,也可以不要此行,則查詢資料庫中所有資料;類似的條件還有gt,lt,like,ilike,between,isNull,isEmpty,isNotEmpty(以上都是替換eq來進行相同的用法)
    List results = cr.list();  

    2)邏輯條件示例:

    Criteria cr = session.createCriteria(Employee.class);

    Criterion salary = Restrictions.gt("salary", 2000);
    Criterion name = Restrictions.ilike("firstNname","zara%");

    // 或(or),與(and)
    LogicalExpression orExp = Restrictions.or(salary, name);
    cr.add( orExp );

    List results = cr.list();

    3)分頁
    public Criteria setFirstResult(int firstResult);
    public Criteria setMaxResults(int maxResults);
3、原始SQL語句查詢
    基礎示例:

    String sql = "SELECT * FROM EMPLOYEE WHERE id = :employee_id";
    SQLQuery query = session.createSQLQuery(sql);
    query.addEntity(Employee.class);//返回的是實體物件,如果setResultTransformer(Criteria.ALIAS_TO_ENTITY_MAP)則返回原始的資料;
    query.setParameter("employee_id", 10);
    List results = query.list();     

四、其他擴充套件
    1、Hiberate能實現一對一、一對多、多對一、多對多的對映;
    2、Hiberate的快取機制,批處理方法和攔截器的使用方法;
    3、附:Hiberate從實體到資料庫的型別自動對映;

相關文章