重拾Hibernate框架——入門

目錄

Hibernate入門

第一個Hibernate程序

第一步 搭建Hibernate環境
(1)創建一個Java(或Java Web)工程項目;
(2)導入Hibernate的jar包;
注:除此之外,在使用Hibernate的時候,有日誌信息的輸出,而Hibernate本身沒有包含日誌輸出的jar包,需要我們額外導入其他日誌相關的jar(log4j、slf4j-api、slf4j-log4j12);同時還需要mysql驅動的jar包。(這裏圖省事還木有導入日誌相關的包)

Hibernate框架相關jar包

第二步 創建實體類
注:使用Hibernate的時候,不需要我們自己手動創建表,Hibernate會幫把表創建出來。
如:User.java

package com.wm103.entity;

public class User {
    /*Hibernate要求實體類有一個屬性是唯一的。*/
    private int uid;
    private String username;
    private String password;
    private String address;

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }
}

第三步 配置實體類合數據庫表一一對應的關係(映射關係)
使用配置文件實現映射關係
(1)創建xml格式的配置文件
- 映射配置文件名稱和位置沒有固定要求;
- 建議在實體類所在包內創建,名稱爲:實體類名稱.hbm.xml
(2)在配置文件中引入xml約束
- 在Hibernate中引入的約束是dtd約束(約束有dtd和schema格式)

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

  其中 hibernate-mapping 表示該xml的根標籤。
(3)配置映射關係
如: User.hbm.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>

    <!--
        1. 配置類和表對應
        class標籤
            name屬性:實體類全路徑
            table屬性:數據庫中對應表的名稱
    -->
    <class name="com.wm103.entity.User" table="t_user">
        <!--
            2. 配置實體類id和表id對應
            Hibernate要求實體類有一個屬性唯一值;
            Hibernate要求表有字段作爲唯一值。
        -->
        <!--
            id標籤
                name屬性:實體類中作爲唯一標識的屬性的名稱
                column屬性:生成的表字段名稱
        -->
        <id name="uid" column="uid">
            <!--
                設置數據庫表中ID的增長策略
                native:生成表的id是主鍵自動增長的。
            -->
            <generator class="native"/>
        </id>
        <!--
            3. 配置實體類中的其他屬性與表字段對應
            property標籤
                name屬性:實體類屬性名稱
                column屬性:生成表字段名稱
        -->
        <property name="username" column="username"></property>
        <property name="password" column="password"></property>
        <property name="address" column="address"></property>
    </class>
</hibernate-mapping>

第四步 創建Hibernate的核心配置文件
(1)在src目錄下創建Hibernate核心配置文件 hibernate.cfg.xml
  核心配置文件的格式爲xml,且文件名稱和位置是固定的。
- 位置:必須在src目錄下面
- 名稱:必須爲hibernate.cfg.xml
(2)爲配置文件引入dtd文件

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

  其中 hibernate-configuration 表示該xml的根標籤。
注:Hibernate操作過程中,只會加載核心配置文件,其他配置文件不會加載,需要在覈心配置文件中進行設置。
(3)配置hibernate.cfg.xml中的信息

  • 配置數據庫信息
<!-- **配置數據庫信息(必須)** -->
<property name="connection.username">root</property>
<property name="connection.password"></property>
<property name="connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&amp;characterEncoding=UTF-8</property>
  • 配置hibernate信息
<!-- **配置hibernate信息(可選)** -->
<!--
    配置數據庫方言,如:
    在MySQL中實現分頁功能,需要使用到關鍵字limit,該關鍵字只能在MySQL中使用;
    在Oracle數據庫中則使用rownum實現分頁功能。
    以下配置是讓Hibernate框架識別不同數據庫各自特有的語句。
-->
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property><!-- 輸出底層SQL語句 -->
<property name="format_sql">true</property><!-- 格式化底層SQL語句 -->
<!--
    Hibernate需要我們進行配置後纔會幫我們自動創建對應的表。
        update:如果已存在表,則更新表,如果沒有,則進行創建。
 -->
<property name="hbm2ddl.auto">update</property>
  • 把映射文件放到核心配置文件中
<!-- **把映射文件放到核心配置文件中(必須)** -->
<mapping resource="com/wm103/entity/User.hbm.xml"/>

如: hibernate.cfg.xml

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- **配置數據庫信息(必須)** -->
        <property name="connection.username">root</property>
        <property name="connection.password"></property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&amp;characterEncoding=UTF-8</property>

        <!-- **配置hibernate信息(可選)** -->
        <!--
            配置數據庫方言,如:
            在MySQL中實現分頁功能,需要使用到關鍵字limit,該關鍵字只能在MySQL中使用;
            在Oracle數據庫中則使用rownum實現分頁功能。
            以下配置是讓Hibernate框架識別不同數據庫各自特有的語句。
        -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property><!-- 輸出底層SQL語句 -->
        <property name="format_sql">true</property><!-- 格式化底層SQL語句 -->
        <!--
            Hibernate需要我們進行配置後纔會幫我們自動創建對應的表。
                update:如果已存在表,則更新表,如果沒有,則進行創建。
         -->
        <property name="hbm2ddl.auto">update</property>

        <!-- **把映射文件放到核心配置文件中(必須)** -->
        <mapping resource="com/wm103/entity/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

實現數據庫操作

第一步 加載Hibernate核心配置文件

第二步 創建SessionFactory對象

第三步 使用SessionFactory對象創建session對象

第四步 開啓事務

第五步 編寫具體邏輯CRUD操作

第六步 提交事務

第七步 關閉資源

如: HibernateDemo.java

package com.wm103.hibernatetest;

import com.wm103.entity.User;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.junit.Test;

/**
 * Created by DreamBoy on 2017/5/19.
 */
public class HibernateDemo {

    @Test
    public void testAdd() {
        // **第一步** 加載Hibernate核心配置文件
        //            自動到src下面尋找hibernate.cfg.xml配置進行加載,封裝成對象
        Configuration cfg = new Configuration();
        cfg.configure();

        // **第二步** 創建SessionFactory對象
        //            讀取hibernate核心配置文件內容,創建sessionFactory
        //            在這個過程中,會根據配置好的映射關係,在對應的數據庫中將表創建出來
        SessionFactory sessionFactory = cfg.buildSessionFactory();

        // **第三步** 使用SessionFactory對象創建session對象
        //            類似JDBC中的Connection對象
        Session session = sessionFactory.openSession();

        // **第四步** 開啓事務
        Transaction tx = session.beginTransaction();

        // **第五步** 編寫具體邏輯CRUD操作
        User user = new User();
        user.setUsername("夢小白");
        user.setPassword("123");
        user.setAddress("China");
        session.save(user);

        // **第六步** 提交事務
        tx.commit();

        // **第七步** 關閉資源
        session.close();
        sessionFactory.close();
    }
}

Hibernate配置文件詳解

Hibernate映射配置文件

  1. 映射匹配文件的名稱和位置沒有固定的要求,但是一般將該配置文件放置同需要映射的實體類相同的包下;
  2. 映射配置文件中標籤的name屬性,屬性值與實體類相關,其中:
    (1)class標籤的name屬性值爲實體類的全路徑;
    (2)id標籤和property標籤的name屬性值爲實體類某個屬性的名稱。
  3. id標籤和property標籤,column屬性可以省略,不設置,這個時候,column屬性的默認值與name屬性值相同
  4. property標籤還有另外一個屬性type屬性,設置生成表字段的類型。不設置該屬性時,Hibernate會根據實體類屬性的類型自動確定表字段的類型。

Hibernate核心配置文件

核心配置文件名稱和位置是固定的,名稱爲hibernate.cfg.xml,位置在src目錄下。
配置內容以及要求如下:

<?xml version='1.0' encoding='utf-8'?>
<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
    <session-factory>
        <!-- **配置數據庫信息(必須)** -->
        <property name="connection.username">root</property>
        <property name="connection.password"></property>
        <property name="connection.driver_class">com.mysql.jdbc.Driver</property>
        <property name="connection.url">jdbc:mysql:///hibernate_day01?useUnicode=true&amp;characterEncoding=UTF-8</property>

        <!-- **配置hibernate信息(可選)** -->
        <!--
            配置數據庫方言,如:
            在MySQL中實現分頁功能,需要使用到關鍵字limit,該關鍵字只能在MySQL中使用;
            在Oracle數據庫中則使用rownum實現分頁功能。
            以下配置是讓Hibernate框架識別不同數據庫各自特有的語句。
        -->
        <property name="dialect">org.hibernate.dialect.MySQLDialect</property>
        <property name="show_sql">true</property><!-- 輸出底層SQL語句 -->
        <property name="format_sql">true</property><!-- 格式化底層SQL語句 -->
        <!--
            Hibernate需要我們進行配置後纔會幫我們自動創建對應的表。
                update:
         -->
        <property name="hbm2ddl.auto">create</property>

        <!-- **把映射文件放到核心配置文件中(必須)** -->
        <mapping resource="com/wm103/entity/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>

Hibernate的核心API

Configuration

// **第一步** 加載Hibernate核心配置文件
//            自動到src下面尋找hibernate.cfg.xml配置進行加載,封裝成對象
Configuration cfg = new Configuration();
cfg.configure();

SessionFactory(重點)

  SessionFactory是一個線程安全的Session工廠類,能爲不同的線程生成不同的Session。SessionFactory維護着Session相關的資源,包括數據庫連接池等、緩存數據等。
1. 通過使用configuration對象來創建SessionFactory對象,在創建過程中,如果核心配置文件配置了自動創建表的功能,如:

<!--
    Hibernate需要我們進行配置後纔會幫我們自動創建對應的表。
        update:
 -->
<property name="hbm2ddl.auto">create</property>

,則Hibernate會根據核心配置文件中的數據庫和映射文件的配置,根據映射關係,在數據庫中創建對應的表。
2. 創建sessionFactory對象過程中,非常耗資源(因爲Hibernate需要檢查實體類與數據庫中表的映射情況,甚至需要創建或更新表)。因此**在Hibernate操作中,建議一個項目一般只創建一個sessionFactory對象。
實現方式如下:
靜態代碼快在類加載時執行,且執行一次。

package com.wm103.utils;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;

/**
 * Created by DreamBoy on 2017/5/19.
 */
public class HibernateUtil {
    // 單態模式的SessionFactory
    private static final SessionFactory sessionFactory;

    static {
        Configuration cfg = new Configuration();
        sessionFactory = cfg.buildSessionFactory();
    }
    public static SessionFactory getSessionFactory() {
        return sessionFactory;
    }
}

使用:

SessionFactory sessionFactory = HibernateUtil.getSessionFactory();

Session(重點)

  1. 這裏的session對象類似於JDBC中的Connection對象;
  2. 調用session對象中的不同方法可以實現CRUD操作:
    (1)添加:save方法;
    (2)修改:update方法;
    (3)刪除:delete方法;
    (4)查詢:根據id查詢的get方法;
  3. session對象
      Session是應用程序與數據庫之間交互操作的一個單線程對象,是Hibernate運作的中心,它的主要功能是爲持久化對象提供創建、讀取和刪除的能力,所有持久化對象必須在session的管理下纔可以進行持久化操作。
      Session代表用戶的一次操作。Session的生命週期很短,在操作開始時通過SessionFactory.openSession()生成,在操作結束時通過執行session.close()關閉。Session維護着Session相關的資源,包括Transaction、當前數據庫連接等。
      Session是線程不安全的,多個併發線程同時操作一個Session實例時,就可能導致Session數據存取的混亂(方法內部定義和使用Session時,不會出現線程問題)。因此設計軟件架構時,應避免多個線程共享一個Session實例。同時它也是輕量級的,實例的創建和銷燬不需要消耗太多的資源。它還有一個緩存,即Hibernate的一級緩存,這個緩存主要用於存放當前工作單元加載的對象。

Transaction

  1. 開啓事務
Transaction tx = session.beginTransaction();
  1. 事務的提交和回滾
tx.commit();

tx.rollback();
  1. 事務的特性
    • 原子性
    • 一致性
    • 隔離性
    • 持久性
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章