1. 程式人生 > >Hibernate_入門

Hibernate_入門

學習類容
1. 使用Hibernate框架完成對客戶的增刪改查的操作

*學習目標

1. 能夠說出Hibernate的執行流程
2. 能夠獨立使用Hibernate框架完成增刪改查的操作

框架和CRM專案的整體介紹

1. 什麼是CRM
    * CRM(Customer Relationship Management)客戶關係管理,是利用相應的資訊科技以及網際網路技術來協調企業與顧客間在銷售、營銷和服務上的互動,向客戶提供創新式的個性化的客戶互動和服務的過程
    * 其最終目標是將面向客戶的各項資訊和活動整合起來,組建一個以客戶為中心的企業,實現對面向客戶的活動的全面管理

2. CRM的模組
    * CRM系統實現了對企業銷售、營銷、服務等各階段的客戶資訊、客戶活動進行統一管理。
    * CRM系統功能涵蓋企業銷售、營銷、使用者服務等各各業務流程,業務流程中與客戶相關活動都會在CRM系統統一管理。
    * 下邊列出一些基本的功能模組,包括:
        * 客戶資訊管理
        * 聯絡人管理
        * 商機管理
        * 統計分析等

3. 模組的具體功能
    * 客戶資訊管理
        * 對客戶資訊統一維護,客戶是指存量客戶或擬營銷的客戶,通過員工錄入形成公司的“客戶庫”是公司最重要的資料資源。

    * 聯絡人管理
        * 對客戶的聯絡人資訊統一管理,聯絡人是指客戶企業的聯絡人,即企業的業務人員和客戶的哪些人在打交道。

    * 客戶拜訪管理
        * 業務員要開發客戶需要去拜訪客戶,客戶拜訪資訊記錄了業務員與客戶溝通交流方面的不足、採取的策略不當、有待改進的地方或值得分享的溝通技巧等方面的資訊。

    * 綜合查詢
        * 客戶相關資訊查詢,包括:客戶資訊查詢、聯絡人資訊查詢、商機資訊查詢等

    * 統計分析
        * 按分類統計客戶資訊,包括:客戶資訊來源統計、按行業統計客戶、客戶發展數量統計等

    * 系統管理
        系統管理屬於crm系統基礎功能模組,包括:資料字典、賬戶管理、角色管理、許可權管理、操作日誌管理等

Hibernate框架的學習路線

1. 注意:Hibernate框架知識點非常多,比較雜亂,大家要做好筆記記錄的工作
2. 學習的路線
    * 第一天:主要是學習框架的入門,自己搭建框架,完成增刪改查的操作
    * 第二天:主要學習一級快取、事務管理和基本的查詢
    * 第三天:主要學習一對多和多對多的操作等
    * 第四天:基本查詢和查詢的優化

案例一:完成客戶的CRUD的操作

需求分析

1. CRM系統中客戶資訊管理模組功能包括
    * 新增客戶資訊
    * 客戶資訊查詢
    * 修改客戶資訊
    * 刪除客戶資訊

2. 要實現客戶的新增功能

技術分析之Hibernate框架的概述

Hibernate框架的概述

1. Hibernate框架的概述
    * Hibernate稱為
    * Hibernate是一個開放原始碼的物件關係對映(ORM)框架,它對JDBC進行了非常輕量級的物件封裝,使得Java程式設計師可以隨心所欲的使用物件程式設計思維來操縱資料庫。 
    * Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程式使用,也可以在Servlet/JSP的Web應用中使用。
    * Hibernate是輕量級JavaEE應用的持久層解決方案,是一個關係資料庫ORM框架

2. 記住:Hibernate是一個持久層的ORM框架!!!

什麼是ORM(物件關係對映)

1. ORM對映:Object Relational Mapping
    * O:面向物件領域的Object(JavaBean物件)
    * R:關係資料庫領域的Relational(表的結構)
    * M:對映Mapping(XML的配置檔案)

2. 簡單一句話:Hibernate使程式設計師通過操作物件的方式來操作資料庫表記錄

Hibernate優點

1. 優點
    * Hibernate對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼
    * Hibernate是一個基於jdbc的主流持久化框架,是一個優秀的orm實現,它很大程度的簡化了dao層編碼工作
    * Hibernate的效能非常好,因為它是一個輕量級框架。對映的靈活性很出色。它支援很多關係型資料庫,從一對一到多對多的各種複雜關係

技術分析之Hibernate框架的快速入門

第一步:下載Hibernate5的執行環境

1. 下載相應的jar包等
    * http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download  

2. 解壓後對目錄結構有一定的瞭解

第二步:建立表結構

1. 建表語句如下
    Create database hibernate_day01;
    Use hibernate_day01;
    CREATE TABLE `cst_customer` (
      `cust_id` bigint(32) NOT NULL AUTO_INCREMENT COMMENT '客戶編號(主鍵)',
      `cust_name` varchar(32) NOT NULL COMMENT '客戶名稱(公司名稱)',
      `cust_user_id` bigint(32) DEFAULT NULL COMMENT '負責人id',
      `cust_create_id` bigint(32) DEFAULT NULL COMMENT '建立人id',
      `cust_source` varchar(32) DEFAULT NULL COMMENT '客戶資訊來源',
      `cust_industry` varchar(32) DEFAULT NULL COMMENT '客戶所屬行業',
      `cust_level` varchar(32) DEFAULT NULL COMMENT '客戶級別',
      `cust_linkman` varchar(64) DEFAULT NULL COMMENT '聯絡人',
      `cust_phone` varchar(64) DEFAULT NULL COMMENT '固定電話',
      `cust_mobile` varchar(16) DEFAULT NULL COMMENT '行動電話',
      PRIMARY KEY (`cust_id`)
    ) ENGINE=InnoDB AUTO_INCREMENT=94 DEFAULT CHARSET=utf8;

第三步:搭建Hibernate的開發環境

1. 建立WEB工程,引入Hibernate開發所需要的jar包
    * MySQL的驅動jar包
    * Hibernate開發需要的jar包(資料/hibernate-release-5.0.7.Final/lib/required/所有jar包)
    * 日誌jar包(資料/jar包/log4j/所有jar包)

第四步:編寫JavaBean實體類

1. Customer類的程式碼如下:
    public class Customer {
        private Long cust_id;
        private String cust_name;
        private Long cust_user_id;
        private Long cust_create_id;
        private String cust_source;
        private String cust_industry;
        private String cust_level;
        private String cust_linkman;
        private String cust_phone;
        private String cust_mobile;
        // 省略get和set方法
    }

第五步:建立類與表結構的對映

1. 在JavaBean所在的包下建立對映的配置檔案
    * 預設的命名規則為:實體類名.hbm.xml
    * 在xml配置檔案中引入約束(引入的是hibernate3.0的dtd約束,不要引入4的約束)
        <!DOCTYPE hibernate-mapping PUBLIC 
            "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
            "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">

2. 如果不能上網,編寫配置檔案是沒有提示的,需要自己來配置
    * 先複製http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd --> window --> preferences --> 搜尋xml --> 選擇xml catalog --> 點選add --> 現在URI --> 貼上複製的地址 --> 選擇location,選擇本地的DTD的路徑

3. 編寫對映的配置檔案
    <?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.itheima.domain.Customer" table="cst_customer">
            <id name="cust_id" column="cust_id">
                <generator class="native"/>
            </id>
            <property name="cust_name" column="cust_name"/>
            <property name="cust_user_id" column="cust_user_id"/>
            <property name="cust_create_id" column="cust_create_id"/>
            <property name="cust_source" column="cust_source"/>
            <property name="cust_industry" column="cust_industry"/>
            <property name="cust_level" column="cust_level"/>
            <property name="cust_linkman" column="cust_linkman"/>
            <property name="cust_phone" column="cust_phone"/>
            <property name="cust_mobile" column="cust_mobile"/>
        </class>
    </hibernate-mapping>

第六步:編寫Hibernate核心的配置檔案

1. 在src目錄下,建立名稱為hibernate.cfg.xml的配置檔案
2. 在XML中引入DTD約束
    <!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

3. 開啟:資料/hibernate-release-5.0.7.Final/project/etc/hibernate.properties,可以檢視具體的配置資訊 
    * 必須配置的4大引數                 
        #hibernate.connection.driver_class com.mysql.jdbc.Driver
        #hibernate.connection.url jdbc:mysql:///test
        #hibernate.connection.username gavin
        #hibernate.connection.password

    * 資料庫的方言(必須配置的)
        #hibernate.dialect org.hibernate.dialect.MySQLDialect

    * 可選的配置
        #hibernate.show_sql true
        #hibernate.format_sql true
        #hibernate.hbm2ddl.auto update

    * 引入對映配置檔案(一定要注意,要引入對映檔案,框架需要載入對映檔案)
        * <mapping resource="com/itheima/domain/Customer.hbm.xml"/>             

4. 具體的配置如下
    <?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>
            <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
            <property name="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>
            <property name="hibernate.connection.username">root</property>
            <property name="hibernate.connection.password">root</property>
            <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

            <mapping resource="com/itheima/domain/Customer.hbm.xml"/>
        </session-factory>
    </hibernate-configuration>

第七步:編寫Hibernate入門程式碼

1. 具體的程式碼如下
    /**
     * 測試儲存客戶
     */
    @Test
    public void testSave(){
        // 先載入配置檔案
        Configuration config = new Configuration();
        // 預設載入src目錄下的配置檔案
        config.configure();
        // 建立SessionFactory物件
        SessionFactory factory = config.buildSessionFactory();
        // 建立session物件
        Session session = factory.openSession();
        // 開啟事務
        Transaction tr = session.beginTransaction();
        // 編寫儲存程式碼
        Customer c = new Customer();
        // c.setCust_id(cust_id);   已經自動遞增
        c.setCust_name("測試名稱");
        c.setCust_mobile("110");
        // 儲存客戶
        session.save(c);
        // 提交事務
        tr.commit();
        // 釋放資源
        session.close();
        factory.close();
    }

回憶:快速入門

1. 下載Hibernate框架的開發包
2. 編寫資料庫和表結構
3. 建立WEB的專案,匯入了開發的jar包
    * MySQL驅動包、Hibernate開發的必須要有的jar包、日誌的jar包
4. 編寫JavaBean,以後不使用基本資料型別,使用包裝類
5. 編寫對映的配置檔案(核心),先匯入開發的約束,裡面正常配置標籤
6. 編寫hibernate的核心的配置檔案,裡面的內容是固定的
7. 編寫程式碼,使用的類和方法

技術分析之:Hibernate常用的配置檔案

Hibernate配置檔案之對映配置檔案

1. 對映檔案,即Stu.hbm.xml的配置檔案
    * <class>標籤     -- 用來將類與資料庫表建立對映關係
        * name          -- 類的全路徑
        * table         -- 表名.(類名與表名一致,那麼table屬性也可以省略)
        * catalog       -- 資料庫的名稱,基本上都會省略不寫

    * <id>標籤            -- 用來將類中的屬性與表中的主鍵建立對映,id標籤就是用來配置主鍵的。
        * name          -- 類中屬性名
        * column        -- 表中的欄位名.(如果類中的屬性名與表中的欄位名一致,那麼column可以省略.)
        * length        -- 欄位的程度,如果資料庫已經建立好了,那麼length可以不寫。如果沒有建立好,生成表結構時,length最好指定。

    * <property>        -- 用來將類中的普通屬性與表中的欄位建立對映.
        * name          -- 類中屬性名
        * column        -- 表中的欄位名.(如果類中的屬性名與表中的欄位名一致,那麼column可以省略.)
        * length        -- 資料長度
        * type          -- 資料型別(一般都不需要編寫,如果寫需要按著規則來編寫)
            * Hibernate的資料型別    type="string"
            * Java的資料型別     type="java.lang.String"
            * 資料庫欄位的資料型別    <column name="name" sql-type="varchar"/>

Hibernate配置檔案之核心配置檔案

1. 核心配置檔案的兩種方式
    * 第一種方式是屬性檔案的形式,即properties的配置檔案
        * hibernate.properties
            * hibernate.connection.driver_class=com.mysql.jdbc.Driver
        * 缺點
            * 不能載入對映的配置檔案,需要手動編寫程式碼去載入

    * 第二種方式是XML檔案的形式,開發基本都會選擇這種方式
        * hibernate.cfg.xml
            * <property name="hibernate.connection.driver_class" >com.mysql.jdbc.Driver</property>
        * 優點
            * 格式比較清晰
            * 編寫有提示
            * 可以在該配置檔案中載入對映的配置檔案(最主要的)

2. 關於hibernate.cfg.xml的配置檔案方式
    * 必須有的配置
        * 資料庫連線資訊:
            hibernate.connection.driver_class           -- 連線資料庫驅動程式
            hibernate.connection.url                    -- 連線資料庫URL
            hibernate.connection.username               -- 資料庫使用者名稱
            hibernate.connection.password               -- 資料庫密碼

        * 方言:
            hibernate.dialect                           -- 操作資料庫方言

    * 可選的配置
        * hibernate.show_sql                            -- 顯示SQL
        * hibernate.format_sql                          -- 格式化SQL
        * hibernate.hbm2ddl.auto                        -- 通過對映轉成DDL語句
            * create                -- 每次都會建立一個新的表.---測試的時候
            * create-drop           -- 每次都會建立一個新的表,當執行結束之後,將建立的這個表刪除.---測試的時候
            * update                -- 如果有表,使用原來的表.沒有表,建立一個新的表.同時更新表結構.
            * validate              -- 如果有表,使用原來的表.同時校驗對映檔案與表中欄位是否一致如果不一致就會報錯.

    * 載入對映
        * 如果XML方式:<mapping resource="cn/itcast/hibernate/domain/User.hbm.xml" />

技術分析之Hibernate常用的介面和類

Configuration類和作用

1. Configuration類
    * Configuration物件用於配置並且啟動Hibernate。
    * Hibernate應用通過該物件來獲得物件-關係對映檔案中的元資料,以及動態配置Hibernate的屬性,然後建立SessionFactory物件。

    * 簡單一句話:載入Hibernate的配置檔案,可以獲取SessionFactory物件。

2. Configuration類的其他應用(瞭解)
    * 載入配置檔案的種類,Hibernate支援xml和properties型別的配置檔案,在開發中基本都使用XML配置檔案的方式。
        * 如果採用的是properties的配置檔案,那麼通過Configuration configuration = new Configuration();就可以假裝配置檔案
            * 但是需要自己手動載入對映檔案
            * 例如:config.addResource("cn/itcast/domain/Student.hbm.xml");

        * 如果採用的XML的配置檔案,通過Configuration configuration = new Configuration().configure();載入配置檔案

SessionFactory:重要

1. 是工廠類,是生成Session物件的工廠類
2. SessionFactory類的特點
    * 由Configuration通過載入配置檔案建立該物件。
    * SessionFactory物件中儲存了當前的資料庫配置資訊和所有對映關係以及預定義的SQL語句。同時,SessionFactory還負責維護Hibernate的二級快取。
        * 預定義SQL語句
            * 使用Configuration類建立了SessionFactory物件是,已經在SessionFacotry物件中快取了一些SQL語句
            * 常見的SQL語句是增刪改查(通過主鍵來查詢)
            * 這樣做的目的是效率更高

    * 一個SessionFactory例項對應一個數據庫,應用從該物件中獲得Session例項。
    * SessionFactory是執行緒安全的,意味著它的一個例項可以被應用的多個執行緒共享。
    * SessionFactory是重量級的,意味著不能隨意建立或銷燬它的例項。如果只訪問一個數據庫,只需要建立一個SessionFactory例項,且在應用初始化的時候完成。
    * SessionFactory需要一個較大的快取,用來存放預定義的SQL語句及實體的對映資訊。另外可以配置一個快取外掛,這個外掛被稱之為Hibernate的二級快取,被多執行緒所共享

3. 總結
    * 一般應用使用一個SessionFactory,最好是應用啟動時就完成初始化。

編寫HibernateUtil的工具類

1. 具體程式碼如下
    public class HibernateUtil {
        private static final Configuration cfg;
        private static final SessionFactory factory;
        static{
            // 給常量賦值 
            // 載入配置檔案
            cfg = new Configuration().configure();
            // 生成factory物件
            factory = cfg.buildSessionFactory();
        }
        // 獲取Session物件
        public static Session openSession(){
            return factory.openSession();
        }
    }

Session介面

1. 概述
    * Session是在Hibernate中使用最頻繁的介面。也被稱之為持久化管理器。它提供了和持久化有關的操作,比如新增、修改、刪除、載入和查詢實體物件
    * Session 是應用程式與資料庫之間互動操作的一個單執行緒物件,是 Hibernate 運作的中心
    * Session是執行緒不安全的
    * 所有持久化物件必須在 session 的管理下才可以進行持久化操作
    * Session 物件有一個一級快取,顯式執行 flush 之前,所有的持久化操作的資料都快取在 session 物件處
    * 持久化類與 Session 關聯起來後就具有了持久化的能力

2. 特點
    * 不是執行緒安全的。應避免多個執行緒使用同一個Session例項
    * Session是輕量級的,它的建立和銷燬不會消耗太多的資源。應為每次客戶請求分配獨立的Session例項
    * Session有一個快取,被稱之為Hibernate的一級快取。每個Session例項都有自己的快取

3. 常用的方法
    * save(obj)
    * delete(obj)  
    * get(Class,id)
    * update(obj)
    * saveOrUpdate(obj)                 -- 儲存或者修改(如果沒有資料,儲存資料。如果有,修改資料)
    * createQuery()                     -- HQL語句的查詢的方式

Transaction介面

1. Transaction是事務的介面
2. 常用的方法
    * commit()              -- 提交事務
    * rollback()            -- 回滾事務

3. 特點
    * Hibernate框架預設情況下事務不自動提交.需要手動提交事務
    * 如果沒有開啟事務,那麼每個Session的操作,都相當於一個獨立的事務

開發步驟

1. 準備環境
    * 在資料/crm/ui/WebRoot下所有的檔案,拷貝到工程中
    * 引入JSTL的標籤庫,JSP頁面會報錯

編寫程式碼