Hibernate框架知識點複習之一

1 什麼是CRM? 

    客戶關係管理,面向客戶,以客戶爲中心的企業客戶管理

     客戶關係管理的具體內容爲:

                         客戶信息管理,聯繫人管理,客戶拜訪管理,綜合查詢,統計分析,系統管理

                         具體分析如下:

                         綜合查詢:客戶信息查詢,聯繫人信息查詢,商機信息查詢

                         統計分析:按客戶來源,按行業,按客戶數量

                         系統管理:數據字典,賬戶管理,角色管理,權限管理,操作日誌管理

2 什麼是CRUD?

       增(create)查(retrieve)改(update)刪(delete)

   

3 JavaEE開發三層架構:

                                    web層                                         業務邏輯層                                      持久層

    早期爲:                  jsp+servlet                                     javaBean                                          jdbc

    現在: SSH             Struts2(Struts1+webwork)             spring                                              hibernate springJDBC的模板

            SSM                 SpringMvc                                  spring                                              Mybatis

     

4 Hibernate框架簡述:

                 Hibernate是一個開源全自動的,基於JDBC的持久化,ORM(對象關係映射)框架,它對象JDBC進行輕量級封裝,封裝後好處爲:

                 它將POJO與數據庫建立映射關係,可以自動生成sql語句,自動執行,使之可以用面向對象思維操作數據庫。

                 注:POJO:plain Ordinary Java Object簡單的Java對象,其命名是爲了與EJB(Enterprise JavaBean 編好核心代碼的java類)的命名區分開來

                 除此之外,它可以應用在 使用JDBC的客戶端程序和WEB應用程序。

                 最具有革命意義的是,Hibernate可以在應用EJB的JavaEE架構中取代CMP,來完成數據持久化


5 Hibernate與傳統的JDBC:

     (1) 爲什麼要使用Hibernate?

                     JDBC適合小型應用程序開發,大型應用開發需要使用Hibernate(它提高數據訪問層效率,也就是操作數據庫的效率)

    

     (2) Hibernate是ORM框架,何爲ORM(對象關係映射)?

                     它是描述java對象和關係型數據庫表之間的元數據,可以自動把java對象持久化到關係型數據庫表中(通過操作java對象完成數據庫表操作)

                     它相當於java對象和關係型數據庫中的一個紐帶,如下:

    

                     業務邏輯模型                  持久層                    數據存儲層

                    

                     javaBean對象   <--->    O/R映射(ORM)    <-->     關係型數據庫

                    

                     速記:ORM O Object代表Java對象; R Relation關係 代表關係型數據庫; M Mapping映射 代表一種映射關係 

    

     (3) Hibernate和其他操作數據庫的技術相比的優勢:

                    1>對JDBC訪問數據庫代碼進行輕量級封裝,它簡化了DAO層(data access object 數據訪問層)操作   (從而減少內存消耗,加快運行效率)

                    2>Hibernate映射性能好,支持很多種關係型數據庫,且代碼開源可擴展。

6 Hibernate目錄簡要介紹:

                     documentation文件夾:存放Hibernate相關的API參考文檔

                     lib文件夾:  存放 Hibernate編譯和運行所依賴的jar包,其子目錄required下爲 運行Hibernate框架必備的jar包

                     project文件夾:  存放Hibernate框架源代碼

7 Hibernate使用POJO進行持久化 POJO(plain ordinary java object 簡單的java對象)

                     (1)何爲持久化類?

                        持久化類是應用程序中的業務實體類,這裏的持久化是指該類的對象可以被持久化保存到數據庫中

                     (2)POJO持久化類

                     POJo持久化類對象中包含與數據庫表的字段相對應的屬性,這些屬性通過 getter/setter方法進行訪問,對外部隱藏了實現細節

8 Hibernate相關配置之實體類映射文件配置(Xxx.hbm.xml,存放在POJO包下):

     概述:創建完POJO實體類並不馬上具備持久化操作能力,Hibernate框架需要知道該實體類映射到關係型數據庫中那個表,以及類中屬性對應庫表中哪個字段

            這都需要在映射文件中進行配置

     實體類映射文件配置(反映了持久化類和數據庫表的映射信息):

     (1)導入Hibernate框架約束:

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

     (2)orm元數據配置:

         1>頭標籤 <hibernate-mapping package="xxx"></hibernate-mapping>

            package屬性:  填寫包名,在元素內部凡是需要書寫完整類名的屬性,使用其後可以直接寫簡單類名

   

         2>子標籤<class name="" table="" catalog=""></class>

            配置實體類和表對應的關係

            name屬性:  實體全類名

            table屬性:  對應的表名

            catalog屬性:  對應的數據庫名(一般可以省略)

            

         3><class></class>下的子標籤:

                             1. <id name="" column="" length="" type="" length=""></id> 

                             主鍵屬性的映射:

                             name(必寫):與主鍵對應的實體類中的屬性名

                             column(可選):表中主鍵對應的列名

                             length(可選):表中對應字段最大長度

                             type(可選):表中對應字段類型

                             其子標籤<generator class=""></generator>主鍵生成策略,class默認值爲 native

                             注: 可選項,若沒有填寫,Hibernate會進行默認值設置

                             2.<property name="" column="" length="" type="" length="" not-null=""></property>

                             普通屬性映射:

                             name(必寫): 與主鍵對應的實體類中的屬性名

                             column(可選): 表中主鍵對應的列名

                             length(可選): 表中對應字段最大長度

                             not-null(可選): 配置該表中列(屬性)是否不能爲空,默認值爲:false(即可以爲空)

                             type(可選): 填寫表中列(屬性)的類型,若不填寫,hibernate會自動檢測出 實體的屬性類型

                                                   若填寫,則有三種類型寫法: java類型|hibernate類型|數據庫類型(只做瞭解,不建議自己填寫)

                                                     java類型 :<property ... type="String"></property>

                                                     hibernate類型:<property...type="string"></property>

                                                     數據庫類型(較特殊),格式如下:

                                                     <property ..>

                                                     <column name="cust_name" sql-type="varchar"></column>

                                                     </property>

        4>模版示例:

                             <!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="cn.XXX.domain.Customer" table="cst_customer" >

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

                             <generator class="native" ></generator>

                             </id>

                             <property name="cust_name" column="cust_name" ></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>

9 Hibernate相關配置之核心配置文件配置(hibernate-cfg.xml,存放到src下):

   概述: Hibernate(核心)主配置文件主要用於配置數據庫連接和Hibernate運行時所需屬性

    方式一:XML配置

         (1)導入約束:

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

         (2)主配置:

         1>主標籤<hibernate-configuration></hibernate-configuration>

         2>子標籤<session-factory></session-factory>:

         其子標籤下進行的數據庫連接配置:

         必選配置(5項):

                                <!--數據庫驅動-->

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

                             <!--數據庫url-->

                             <property name="hibernate.connection.url">jdbc:mysql:///數據庫名</property>

                             <!--數據庫用戶名-->

                             <property name="hibernate.connection.username">數據庫用戶名</property>

                             <!--數據庫密碼-->

                             <property name="hibernate.connection.password">數據庫密碼</property>

                             <!--數據庫方言

                             不同的數據庫中,sql語法略有區別,指定方言可以讓hibernate框架針對數據庫的方言生成sql語句

                             所有的數據庫語言都遵循 sql99標準

                             hibernate.dialect org.hibernate.dialect.MySQLDialect

                             hibernate.dialect org.hibernate.dialect.MySQLInnoDBDialect

                             hibernate.dialect org.hibernate.dialect.MySQLMyISAMDialect

                             注意:MYSQL在選擇方言時:請選擇最短的方言

                             -->

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

                             可選項配置(3項):

                             <!--將hibernate生成的sql語句打印到控制檯-->

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

                             <!--將hibernate生成的sql語句格式化(語法縮進,否則就很長的一行顯示)-->

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

                             <!--

                             auto schema export 自動導出表結構,根據實體自動建表

                             hibernate.hbm2ddl.auto    create  自動建表且每次框架運行完後都會創建出新的表,以前的表會被覆蓋掉,表數據會丟失(通常只在開發環境的測試中才使用)

                             hibernate.hbm2ddl.auto    create-drop 自動建表且每次框架運行完都會把所有表刪除(通常只在開發環境的測試中才使用)

                             hibernate.hbm2ddl.auto    update(推薦使用) 自動生成表,如果已經存在則不會再生成,如果表有變動,則自動更新表(不會刪除任何數據)

                             hibernate.hbm2ddl.auto    validate 校驗,不自動生成表(框架每次啓動 會校驗數據庫中表是否正確)校驗失敗會拋出異常

                             -->

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

             (2)引入orm元數據:

                             <!--路徑書寫:填寫src下 orm配置文件(Customer.hbm.xml)的路徑-->

                             <mapping resource="cn/itheima/domain/Customer.hbm.xml"/>

                            

                             方式二: hibernate.properties文件屬性配置

                                 把數據庫連接數據寫入hibernate.properties文件,然後在hibernate.cfg.xml配置文件裏進行配置

                             但在實際開發中,一般使用xml配置方式,因爲xml的配置格式更易於修改,當改變底層應用配置時不需要重新改變和編譯代碼

                             而properties的文件不具備這樣的優點

10 Hibernate相關的API

                             (1)Configuration(配置對象)  ------加載核心配置文件

                             概述: Configuration類的作用主要是對Hibernate框架進行配置,以及啓動。

                                     在Hibernate框架啓動時,首先會創建Configuration類實例(該實例主要用於啓動,加載,管理hibernate的配置文件信息)

                             Configuration類實例會首先定位主配置文件(hibernate.cfg.xml)的位置, 讀取其中配置後,就會創建一個SessionFactory對象後完成使命

                             具體細節:

                                     創建實例代碼

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

                             此種方式默認會到src下讀取 hibernate.cfg.xml文件,如想使用指定目錄下的配置文件,則需要在configure()方法中傳遞一個文件路徑,如下:

                             Configuration config=new Configuration().configure("hibernate.cfg.xml所在路徑");

                             擴展理解: 如果主配置中未引入映射配置,可進行手動加載, 如下:

                             conf.addResource(resourceName)

                             conf.addClass(persistentClass 持久化類)

                             (2)SessionFactory(Session工廠類)

                                 概述: SessionFactory接口負責Hibernate框架的初始化和創建Session對象,它不是輕量級的,一個項目只需一個SessionFactory就夠了, 操作多個數據庫時可爲每一個庫指定一個

                             它在Hibernate框架中起到一個緩衝區作用,Hibernate可以將自動生成的sql語句,映射語句,以及某些可重複利用的數據放在這個緩衝區

                             同時它還保存了對數據庫配置的所有映射關係,維護了當前的二級緩存

                             具體細節: 

                             通過Configuration獲取SessionFactory 

                             SessionFactory sessionFactory=config.buildSessionFactory();

                             釋放資源--把它看作JDBC的連接池對象會更好理解

                             sessionFactory.close()

                             特點:

                                     1>它是重量級的,不能隨意創建和銷燬它的實例

                                     2>它是線程安全的,同一個實例可以提供多個線程共享

                             衍生出的工具類:

                             由於Hibernate的特點,一個項目只需一個SessionFactory,當應用程序中存在多個數據源,才爲每個數據源指定SessionFactory實例,

                             爲此,在實際開發中,通常會抽取一個HibernateUtils工具類來提供Session對象

                             HibernateUtils的代碼如下:

                             public class HibernateUtils {

                                                                                 /* 工廠對象 SessionFactory負責保存和使用所有配置信息,消耗內存資源非常大,開發中要保證它只能被創建一次

                                                                                 * 所以使用了 static{}讓它在類加載器中只創建一次

                                                                                 */

                                                                                 private static final SessionFactory factory;

                                                                                 static {

                                                                                 //1 獲取 配置加載類 Configuration。並讀取src下的主配置文件

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

                                                                                 //2 獲取 hiberate數據庫核心對象 session 的工廠

                                                                                 factory = conf.buildSessionFactory();

                                                                                 }

                                                                                 //獲得全新session

                                                                                 public static Session openSession() {

                                                                                 // 3 獲取 hibernate核心對象 session

                                                                                 Session openSession = factory.openSession();

                                                                                 return openSession;

                                                                                 }

                                                                                 //獲得與線程綁定的session

                                                                                 public static Session getCurrentSession() {

                                                                                 // 3 獲取 hibernate核心對象 session

                                                                                 Session currentSession = factory.getCurrentSession();

                                                                                 return currentSession ;

                                                                                 }

                                                                        }

                     (3)Session(應用程序與數據庫之間交互操作的一個單線程對象,是Hibernate框架操作數據庫的核心對象)

                     注:(它和會話技術的用戶session和javaMail的session沒半點毛線關係,Session類似於JDBC年代的Connection)

                     概述:Session接口負責執行持久化對象的CRUD操作(對持久化對象的創建,讀取,刪除),所有持久化對象必須在Session管理下才可進行持久化操作

                     具體細節:

                     通過SessionFactory工廠類獲取Session

                     方式一:獲取全新的Session實例,使用完畢需要調用close()方法進行手動關閉

                     Session newSession=sessionFactory.openSession( )

                     方式二:獲取與當前線程綁定的Session實例,它在事務提交或回滾時會自動關閉

                     Session currentSession=sessionFactory.getCurrentSession()

                     特點分析:

                         1 Session線程不安全,多個併發線程同時操作一個Session實例易導致Session數據存取的混亂,因此設計軟件架構時,應要避免多個線程共享一個Session實例

                     2 Session是輕量級的,Session實例的創建和銷燬不需耗費太多內存

                     3 Session擁有Hibernate的一級緩存,這個緩存主要存放當前工作單元加載的對象

                    

                     session的增刪改查:

                     1.增---向數據庫表中增加一個名爲 xxx 的Customer對象

                     Customer c=new Customer();

                     c.setCust_name("xxx");

                     session.save(c);

                     2.刪---刪除id爲1的Customer對象

                     //1 獲得要刪除的對象

                     Customer c=session.get(Customer.class,1l);

                     //3 執行 刪除

                     session.delete(c);

                     3.改--修改id爲1的Customer對象的name屬性 

                     //1 獲得要修改的對象

                     Customer c=session.get(Customer.class,1l);

                     //2 進行修改操作

                     c.setCust_name("YYY");

                     //3 執行 update

                     session.update(c);

                     4.查--查詢id爲1的Customer對象

                     //通過 數據庫的主鍵獲取指定的 實體(Customer)

                     Customer customer = session.get(Customer.class,1l);

                     System.out.println(customer);

                    

                     Session的API擴展:

                     1 save() , update() 和 saveOrUpdate()方法,用於增加和修改對象

                     2 delete()方法 用於刪除對象

                     3 get() 和 load()方法,根據主鍵查詢

                     4 createQuery() 和 createSQLQuery() 方法 用於數據庫操作

                     5 createCriteria()方法:條件查詢

                    

                     (4)Transaction(用於管理事務)

                     概述:它是Hibernate的數據庫事務接口,對底層的事務接口進行了封裝。

                            使用Session對數據庫操作後,要使用Transaction接口的commit()方法進行事務提交,才能真正將數據同步到數據庫.發生異常時,可通過Transaction的rollback()

                        事務回滾方法,避免數據錯誤。

                        在進行持久化操作後,如果沒有開啓事務,則每一個Session操作都相當一個獨立操作。

                     具體細節:

                         創建並開啓事務方式一:

                     Transaction transaction=session.getTransaction();

                     transaction.begin();    ---開啓事務

                     創建並開啓事務方式二(建議使用):

                     Transaction transaction=session.beginTransaction()

                     事務提交

                     transaction.commit();

                     事務回顧

                     transaction.rollback();

                     釋放資源

                     transaction.close();

                    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章