Hibernate學習(一)

1. Hibernate簡單介紹

Hibernate是一個持久層的ORM(Object Relational Mapping)框架,通過編寫XML映射文件使得Java對象與數(shù)據(jù)庫表產(chǎn)生關聯(lián),并且Hibernate幾乎支持所有的關系型數(shù)據(jù)庫(RDBMS),如MySQL、Oracle等等。

image

2. 配置Hibernate運行環(huán)境

2.1 下載地址:http://hibernate.org/orm/releases/5.2/
2.2 引入所需的jar包
  • 數(shù)據(jù)庫驅動jar包(這里我用的是MySQL)
  • Hibernate的jar包(在解壓文件夾的lib->required
  • 日志控制jar包用戶輸出日志(log4j,slf4j

3. 創(chuàng)建表結構

create table t_user(
    uid bigint(32) not null auto_increment,
    uname varchar(32),
    phone varchar(32),
    primary key (uid)
);

4. 創(chuàng)建Java對象

public class User
{
    private Long uid;
    private String uname;
    private String phone;
    ...
}

5. 創(chuàng)建類與表的映射文件(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>
    <class name="com.example.hibernate.User" table="t_user">
        <id name="uid" column="uid">
            <generator class="native"/>
        </id>
        <property name="uname" column="uname" length="20" type="java.lang.String"/>
        <property name="phone" column="phone" length="11" type="java.lang.String"/>
    </class>

</hibernate-mapping>

類與表的映射文件標簽介紹

  • <class> 將類和表建立映射關系

    • name 類的全路徑
    • table 表名(如果類名和表名一致,可以省略不寫)
    • catalog 數(shù)據(jù)庫名稱(可以省略不寫)
  • <id> 將類中的屬性與表中主鍵進行映射

    • name 類中的屬性
    • column 表中字段(如果和name一致,可以省略不寫)
    • length 指定字段數(shù)據(jù)的長度(如果沒有創(chuàng)建表,最好要指定數(shù)據(jù)長度)
  • <generator> 主鍵的生成策略

策略 描述
increment 適用于short、int、long作為主鍵,不是使用的數(shù)據(jù)庫的自動增長機制,Hibernate提供的一種增長機制(先查詢到id的最大值+1在作為新的主鍵插入,但是不能再集群環(huán)境或者并發(fā)訪問的情況下使用)。
identity 適用于short、int、long作為主鍵,但是使用的數(shù)據(jù)庫底層必須有自動增長的機制(如MySQLauto_increment),而Oracle是沒有的。
sequence 適用于short、int、long作為主鍵,底層使用的是序列的增長方式,Oracle需要自己創(chuàng)建序列。
uuid 適用于char、varchar類型作為主鍵(使用的是隨機的字符串作為主鍵)
native 適用于short、int、long作為主鍵,用來自動生成主鍵值;將屬性值設置為native使得Hibernate可以使用identitysequence等算法根據(jù)底層數(shù)據(jù)庫的情況來創(chuàng)建主鍵(如MySQL使用的idenitiy,Oracle使用的是sequence)
assigned 主鍵的生成不用Hibernate來進行管理,必須手動設置主鍵
  • <property> 將類中普通的屬性與表中字段進行映射
    • name 類中的屬性
    • column 表中字段
    • length 數(shù)據(jù)長度
    • type 數(shù)據(jù)類型(需要按照規(guī)則來定義)
      • Hibernate數(shù)據(jù)類型:type="string"
      • Java數(shù)據(jù)類型:type="java.lang.String"
      • 數(shù)據(jù)庫的數(shù)據(jù)類型:添加子標簽<column name="" sql-type="varchar">

6. 創(chuàng)建Hibernate核心配置文件(hibernate.cfg.xml)

<?xml version="1.0" encoding="UTF-8"?>

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

<hibernate-configuration>
    <session-factory>
        <!--必須的配置-->
        <!--數(shù)據(jù)庫驅動程序-->
        <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
        <!--連接數(shù)據(jù)庫URL,后面拼接的上防止讀寫時中文亂碼-->
        <property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/hbmdb?useUnicode=true&amp;characterEncoding=utf-8</property>
        <!--數(shù)據(jù)庫用戶名-->
        <property name="hibernate.connection.username">root</property>
        <!--數(shù)據(jù)庫密碼-->
        <property name="hibernate.connection.password">123456</property>
        <!--數(shù)據(jù)庫方言-->
        <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

        <!--可選配置-->
        <!--控制臺打印sql日志-->
        <property name="hibernate.show_sql">true</property>
        <!--打印的日志的時候格式化-->
        <property name="hibernate.format_sql">true</property>
        <!--通過映射文件自動創(chuàng)建數(shù)據(jù)庫表-->
        <property name="hibernate.hbm2ddl.auto">update</property>

        <!--配置session ,可以通過ThreadLocal存儲-->
        <property name="hibernate.current_session_context_class">thread</property>

        <!--引入類的映射文件-->
        <mapping resource="com/example/hibernate/User.hbm.xml"/>
    </session-factory>
</hibernate-configuration>
  • hbm2ddl.auto通過映射文件自動創(chuàng)建數(shù)據(jù)庫表
  • create:每次都會創(chuàng)建一個新的表
  • create-drop:每次都會創(chuàng)建一個新的表,當執(zhí)行結束后刪除
  • update:如果表不存在會創(chuàng)建
  • validate:如果表存在,使用原來的表;同時校驗映射文件與表中的字段是否一致,如果不一致則會報錯

7. 編寫代碼測試保存數(shù)據(jù)

public class JunitTest
{
    @Test
    public void save()
    {
        //加載配置文件,默認加載src目錄下的hibernate.cfg.xml,也可以自己指定路徑
        Configuration config = new Configuration().configure();
        //創(chuàng)建SessionFactory對象
        SessionFactory factory = config.buildSessionFactory();
        //創(chuàng)建session對象
        Session session = factory.openSession();
        //開啟事務
        Transaction transaction = session.beginTransaction();

        try
        {
            //保存數(shù)據(jù)
            User user = new User();
            user.setUname("許渺");
            user.setPhone("12345678906");
            session.save(user);
            //提交事務
            transaction.commit();
        } catch (Exception e)
        {
            e.printStackTrace();
            //出現(xiàn)異常事務回滾
            transaction.rollback();
        } finally
        {
            //釋放資源
            session.close();
            factory.close();
        }
    }
}

執(zhí)行單元測試

image

查看表中數(shù)據(jù)

image

8. Hibernate常用類描述

Configurationd對象

Configuration對象用于配置并啟動Hibernate框架,獲取SessionFactory對象。

SessionFactory對象

是生成Session對象的工廠類,SessionFactory 是一個線程安全對象并由應用程序所有的線程所使用。
SessionFactory 是一個重量級對象所以通常它都是在應用程序啟動時創(chuàng)造然后留存為以后使用。每個數(shù)據(jù)庫需要一個 SessionFactory 對象使用一個單獨的配置文件。所以如果你使用多種數(shù)據(jù)庫那么你要創(chuàng)造多種 SessionFactory 對象。

Session對象
  • Session是在Hibernate中使用最頻繁的接口。也被稱之為持久化管理器。它提供了和持久化有關的操作,比如添加、修改、刪除、加載和查詢實體對象
  • Session 是應用程序與數(shù)據(jù)庫之間交互操作的一個單線程對象,是 Hibernate 運作的中心
  • Session是線程不安全的
  • 所有持久化對象必須在 session 的管理下才可以進行持久化操作
  • Session 對象有一個一級緩存,顯式調用 flush 方法之前,所有的持久化操作的數(shù)據(jù)都緩存在 session 對象中
  • 持久化類與 Session 關聯(lián)起來后就具有了持久化的能力
Transaction接口

Transaction是處理事務的接口,如提交事務 commit 以及事務回滾 rollback ,Hibernate框架默認事務不自動提交,需要手動提交事務;如果沒有開啟事務,那么每個Session的操作,都相當于一個獨立的事務。

image
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

  • Hibernate: 一個持久化框架 一個ORM框架 加載:根據(jù)特定的OID,把一個對象從數(shù)據(jù)庫加載到內存中OID...
    JHMichael閱讀 2,089評論 0 27
  • 本文包括: 1、CRM 項目的整體介紹 2、Hibernate 框架概述 3、Hibernate 快速入門 4、H...
    廖少少閱讀 3,521評論 9 66
  • 本文中我們介紹并比較兩種最流行的開源持久框架:iBATIS和Hibernate,我們還會討論到Java Persi...
    大同若魚閱讀 4,428評論 4 27
  • Hibernate是一個開放源代碼的對象關系映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數(shù)據(jù)庫...
    蘭緣小妖閱讀 1,273評論 1 18
  • 丙申猴年農歷五月十三,晚上八點出頭,剛吃過飯,本亮發(fā)來消息,叫我過去。我本有約,將去琴房逛逛。 本亮說,喝茶去。我...
    陸子飛閱讀 4,062評論 18 273

友情鏈接更多精彩內容