Java EE五大框架之 Hibernate 1

0   前言 

學習框架之前,首先再來回顧一下EE開發三層結構:



1   Hibernate的概述

1.1    什麼是框架

框架是軟件的半成品,已經完成了相應部分的內容了.只需要實現自己業務即可.


1.2    什麼是Hibernate

Hibernate是一個開放源代碼的對象關係映射框架,它對JDBC進行了非常輕量級的對象封裝,它將POJO與數據庫表建立映射關係,是一個全自動的orm框架,hibernate可以自動生成SQL語句,自動執行,使得Java程序員可以隨心所欲的使用對象編程思維來操縱數據庫。 Hibernate可以應用在任何使用JDBC的場合,既可以在Java的客戶端程序使用,也可以在Servlet/JSP的Web應用中使用,最具革命意義的是,Hibernate可以在應用EJB的J2EE架構中取代CMP,完成數據持久化的重任。


Hibernate就是一個持久層的ORM的框架.

ORM :Object Relational Mapping.對象關係映射.


1.3    Hibernate的優點

      Hibernate對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重複性代碼

      Hibernate是一個基於jdbc的主流持久化框架,是一個優秀的orm實現,它很大程度的簡化了dao層編碼工作
      Hibernate的性能非常好,因爲它是一個輕量級框架。映射的靈活性很出色。它支持很多關係型數據庫,從一對一到多對多的各種複雜關係


2     Hibernate的入門

2.1   下載Hibernate5

http://sourceforge.net/projects/hibernate/files/hibernate-orm/5.0.7.Final/hibernate-release-5.0.7.Final.zip/download

導入required中的包。

project--etc 配置文件

2.2   創建表

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 DEFAULTCHARSET=utf8;

2.3   引入Hibernate的開發包

數據庫驅動包:

Hibernate/lib/required/*

引入日誌記錄的包:

 

2.4   創建實體 

//JavaBean實體類

public class Customer {   //是引用包裝類,默認類型爲null

    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;

...

}

 

2.5   創建映射

(約束在core包的,mapping dtd中)

<hibernate-mapping>

    <!--class標籤用來創建 實體類和表的映射 -->

    <classname="com.itheima.domain.Customer"  table="cst_customer">

        <!--設置表中的主鍵與類中的某個屬性的映射name是類中的屬性名  column表中字段名。這也是名字可以不同的原因 -->

        <id  name="cust_id"  column="cust_id">

            <!--只要是主鍵 需要有一個主鍵的生成策略: -->

            <generator  class="native"/>

        </id>

       

        <!--非主鍵的屬性都使用property標籤配置映射 name是類中的屬性名  column表中字段名 -->

        <property  name="cust_name"  column="cust_name"></property>

        <property  name="cust_user_id"  column="cust_user_id"></property>

        <property  name="cust_create_id"  column="cust_create_id"></property>

        <property  name="cust_source"  column="cust_source"></property>

        <property  name="cust_industry"  column="cust_industry"></property>

        <property  name="cust_level"  column="cust_level"></property>

        <property  name="cust_linkman"  column="cust_linkman"></property>

        <property  name="cust_phone"  column="cust_phone"></property>

        <property  name="cust_mobile"  column="cust_mobile"></property>

    </class>

</hibernate-mapping>

2.6   創建Hibernate的核心配置文件

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

<!DOCTYPE hibernate-configuration PUBLIC

    "-//Hibernate/HibernateConfiguration DTD 3.0//EN"

    "http://www.hibernate.org/dtd/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

    <session-factory>

        <!--必須的配置 -->

        <!--配置連接數據庫的基本的信息:-->

        <propertyname="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

        <propertyname="hibernate.connection.url">jdbc:mysql:///hibernate_day01</property>

        <propertyname="hibernate.connection.username">root</property>

        <propertyname="hibernate.connection.password">123</property>

       

        <!--數據庫的方言: -->

        <propertyname="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

       

        <!--Hibernate的可選項 -->

       

        <!--加載映射 -->

        <mappingresource="com/itheima/domain/Customer.hbm.xml"/>

    </session-factory>

 

</hibernate-configuration>

2.7   編寫代碼

public class HibernateDemo1 {

    /**

     * 使用Hibernate保存數據

     */

    @Test

    public  void  demo1(){

        // 1.加載配置文件:默認加載src目錄下hibernate.cfg.xml

        Configuration   cfg = new  Configuration().configure();

        // 2.創建一個SessionFactory:

        SessionFactory  sessionFactory = cfg.buildSessionFactory();

        // 3.創建Session對象.Session對象類似Connection.

        Session  session = sessionFactory.openSession();

        // 4.開啓事務:

        Transaction  tx = session.beginTransaction();

        // 5.執行相關操作

        Customer  customer = new  Customer();

        customer.setCust_name("小王");

        customer.setCust_source("小廣告");

        session.save(customer);

        // 6.事務提交

        tx.commit();

        // 7.釋放資源

        session.close();

    }


2.8   Hibernate核心配置文件中的可選項

在控制檯顯示SQL語句

<property  name="hibernate.show_sql">true</property>


在控制檯格式化顯示SQL語句

<property  name="hibernate.format_sql">true</property>


數據庫表相關

(1) update: 如果沒有表結構,創建表結構。如果存在,不會創建,添加數據。可以在表中加入列,但是不能刪除列

<property  name="hibernate.hbm2ddl.auto">update</property>

(2) 其他參數還有 create, create-drop, validate。都不常用。


另外,用xml作爲核心配置文件可以直接引入映射配置文件。相比properties作爲核心配置文件更好。


3   Hibernate的相關API

3.1 Configuration:加載配置文件

* Configuration對象用於配置並且啓動Hibernate。
* Hibernate應用通過該對象來獲得對象-關係映射文件中的元數據,以及動態配置Hibernate的屬性,然後創建SessionFactory對象。
* 簡單一句話:加載Hibernate的配置文件,可以獲取SessionFactory對象。

* 加載配置文件的種類,Hibernate支持xml和properties類型的配置文件,在開發中基本都使用XML配置文件的方式。
* 如果採用的是properties的配置文件,那麼通過Configuration configuration = new Configuration();就可以加載配置文件
* 但是需要自己手動加載映射文件
* 例如:config.addResource("cn/itcast/domain/Student.hbm.xml");

* 如果採用的XML的配置文件,通過Configuration configuration = new Configuration().configure();加載配置文件


3.2 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,最好是應用啓動時就完成初始化。


         


3.3 Session(CRUD)

1. 概述
* Session是在Hibernate中使用最頻繁的接口。也被稱之爲持久化管理器。它提供了和持久化有關的操作,比如添加、修改、刪除、加載和查詢實體對象
* Session 是應用程序與數據庫之間交互操作的一個單線程對象,是 Hibernate 運作的中心
* Session是線程不安全的
* 所有持久化對象必須在 session 的管理下纔可以進行持久化操作
* Session 對象有一個一級緩存,顯式執行 flush 之前,所有的持久化操作的數據都緩存在 session 對象處
* 持久化類與 Session 關聯起來後就具有了持久化的能力

2. 特點
* Session不是線程安全的。應避免多個線程使用同一個Session實例
* Session是輕量級的,它的創建和銷燬不會消耗太多的資源。應爲每次客戶請求分配獨立的Session實例
* Session有一個緩存,被稱之爲Hibernate的一級緩存。每個Session實例都有自己的緩存

3. 常用的方法
* save(obj)
* delete(obj)     //實現刪除功能
* get(Class,id)    //實現查詢功能。  參數0是 .class文件,利用反射機制
* update(obj)
* saveOrUpdate(obj) -- 保存或者修改(如果沒有數據,保存數據。如果有,修改數據)

* createQuery() -- HQL語句的查詢的方式


3.4 Transaction接口

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

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

發佈了49 篇原創文章 · 獲贊 13 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章