Hibernate基礎知識

1、Hibernate初識java

一、ORM:(Object/Relationship Mapping)--對象/關係映射mysql

二、寫SQL語句的缺點:sql

  a.不一樣的數據庫使用的SQL語法不一樣。好比:PL/SQL(oracle數據庫)與T/SQL(微軟版本)數據庫

  b.一樣的功能在不一樣的數據庫中有不一樣的實現方式。好比分頁SQL,Oracle--rownumber、MySQL---使用關鍵字limit、SQLServer----還可使用top關鍵字windows

  c.程序過度依賴SQL對程序的一直及擴展,維護等帶來很大的麻煩。瀏覽器

三、Hibernate是一種可以減小對SQL語句依賴,可行的ORM框架技術。session

  1)Hibernate簡介oracle

    Hibernate是java領域的一款開源的ORM框架技術app

    Hibernate對JDBC進行了很是輕量級的對象封裝框架

  2)Hibernate在咱們的應用程序中充當着什麼樣的角色呢?

    舉例,以下圖所示:咱們要開發不一樣的系統

    持久化層 --- 處於業務邏輯層和數據庫之間的一個角色

    做用 -- 把程序中生成的對象持久化到數據庫中,換句話說,就是把這些對象經過對象關係映射保存到數據庫的表中

  3)其餘主流的ORM框架技術

    ①MyBatis: 前身就是著名的iBatis

    ②Toplink:後被Oracle收購,並從新包裝爲Oracle AS TopLink

    ③EJB:自己是JAVAEE的規範

  

 

編寫Hibernate例子的步驟:

  (1)建立Hibernate的配置文件(hibernate.cfg.xml)

  (2)建立持久化類

  (3)建立對象-關係映射文件

  (4)經過HIbernate API編寫訪問數據庫的代碼 

 hibernate必須的jar包:

  hibernate-release-4.2.4.Final\lib\required;

  Mysql的JDBCjar包:mysql-connecttor-java-5.1.7-bin.jar;

  Junit4的jar包:junit-4.10.jar

導入hibernate,Junit,mysql的驅動包步驟

  1.建立一個普通的java工程

  2.構建用戶類庫:windows --> preferences --> java --> build path --> user libraries --> new...(建立類庫文件) --> Add Extra jars...(導入jar包)

  3.添加用戶類庫:在項目名上右鍵 --> properties --> java build path --> libraries --> Add libraries --> user libraries --> 勾選上 --> 完成

 

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="dialect">org.hibernamte.dialect.MySQLDialect</property>
<property name="connection.url">jdbc:mysql:///hibernate?useUnicode=true&amp;characterEncoding=UTF-8</property>
<property name="dialect">org.hibernate.dialect.MySQLDialect</property>
<property name="show_sql">true</property>
<property name="format_sql">true</property>
<property name="hbm2ddl.auto">create</property>

編寫持久化類(實體類),持久化類的設計原則要遵循javabean的設計原則,設計原則有四點:

  1. 這個類是一個公有類

  2. 提供公有的不帶參數的默認的構造方法

  3. 屬性要私有化private

  4. 屬性要用setter/getter封裝

建立對象關係映射文件

  1.src -> New -> other - > Hibernate -> Hibernate XML Mapping file (hbm.xml) 選擇須要映射的剛建立的實體類,會將建立的字段和數據庫字段進行映射。

  2.在cfg.xml中配置文件聲明:<mapping resource="Student.hbm.xml" ></mapping>

使用Junit進行測試

  @Before 初始化方法

  @Test 測試註釋標籤

  @After 釋放資源

/**新版本方法
 * 在eclipse中能夠查看數據庫的,具體步驟:Winows->Show view->other->Data soure Explorer便可。
 * 必定要導數據庫的jar包。數據庫瀏覽器(Data soure Explorer)的jar包和項目的
 * jar包並不能通用,需分別倒入。
 * 使用數據庫逆向生成實體類的小夥伴,必定要在數據庫中設置主鍵,要不就等着報錯吧!!!!!!!
 */
public class StudentTest {
    private SessionFactory sessionfactory;
    private Session session;
    private Transaction transaction;
    @Before
    public void init() {
        Configuration configuration = new Configuration().configure();
/*注意,並不調用ServiceRegistry方法,並且在新版本中調用該方法有概率會出現必定的錯誤.
老師講的課是由實體類直接生成的hbm.xml文件,會在hibernate.cfg.xml中的<session-factory>中生成一個
name屬性,即<session-factory name="">,把name屬性刪除,不然會報錯
*/
        sessionfactory = configuration.buildSessionFactory();
        session = sessionfactory.openSession();
        transaction = session.beginTransaction();
    }
    
    @Test
    public void studentTest() {
        Student student=new Student(1,"zhanhgsa","man",new Date());
        session.save(student);
    }

    @After
    public void destory() {
        transaction.commit();
        session.close();
        sessionfactory.close();
    }
}
Junit測試

 

 

2、Hibernate進階

1.hibernate.cfg.xml經常使用配置

2.session簡介

3.transaction簡介

4.session詳解

5.對象關係映射經常使用配置

  

一、Hibernate經常使用配置

hibernate.cfg.xml配置文檔的經常使用配置.

程序在運行的時候會讀取hibernate.cfg.xml配置文檔,從而實現鏈接數據庫,而且生成表結構.

設置了<property name="show_sql">true</property>與<property name="format_sql">true</property>則會把hibernate運行時對數據庫的操做時的sql語句會顯示在控制檯而且格式化.

<property name="hbm2ddl.auto">create</property>即從新刪除表結構再建立.因此以前的記錄消失.

<property name="hbm2ddl.auto">update</property>它不會刪除表結構也不會建立新的表結構,會保留原有的數據,只是更新.沒有"hbm2ddl.auto"屬性同樣也是能夠添加新的數據,會保留原有的數據.

<property name="hibernate.default_schema">hibernate</property>則在控制檯輸出的sql語句中,會在表名以前加上數據庫名.

  

 

二、session簡介

  1.不建議直接使用jdbc的connection操做數據庫,而是經過session操做數據庫。

  2.session能夠理解爲操做數據庫的對象,操做數據庫以前必須先獲取session的實例

  3.session與connection,是多對一關係,每一個session都有一個與之對應的connection,一個connection不一樣時刻能夠供多個session使用。

  4.把對象保存到關係數據庫中須要調用session的各類方法:save(),update(),delete(),createQuery

  

 

三、transaction簡介

Transaction事務簡介:

  1. hibernate對數據庫的操做都是封裝在事務當中的,而且默認是非自動提交的方式。因此用session保存對象時,若是不開啓事務而且沒有手工提交事務,對象並不會真正保存在數據庫中。

  2. 若是你想讓hibernate像jdbc那樣自動提交事務,必須調用session對象的doWork()方法,得到jdbc的connection後,設置其爲自動提交事務模式(注意:一般並不推薦這樣作)

   綜上,咱們必須開啓事務。

 

  使用Session的doWork()方法提交事務(須要重寫execute()方法,在方法中設置connection自動提交事務)。須要注意的是:在使用save()方法後並不會真正輸出sql語句,須要調用flush()強制輸出sql語句才能夠。而後由於採用了自動提交方式(setAutoCommit(true)),數據才真正保存在數據庫。

  

 

四、session詳解

如何得到session對象?

  (1)openSessionion

  (2)getCurrentSession

  若是使用getCurrentSession須要在hibernate.cfg.xml文件中進行配置:

    若是是本地事務(jdbc事務) <property name="hibernate.current_session_context_class">thread</property>

    若是是全局事務(jta事務)    <property name="hibernate.current_session_context_class">jta</property>

 

1,事務: 事務表示一個由一系列的數據庫操做組成的不可分割的邏輯單位,其中的操做要麼全作要麼全都不作

2,JDBC事務:JDBC事務由Connnection對象控制管理,也就是說,事務管理其實是在JDBC Connection中實現。事務週期限於Connection的生命週期。

3,JTA事務:提供了跨數據庫鏈接(或其餘JTA資源)的事務管理能力

 

openSession 每次使用都是打開一個新的session,使用完須要調用close方法關閉session;

getCurrentSession 是獲取當前session對象,連續使用屢次時,獲得的session都是同一個對象,這是與openSession的區別之一 ;

通常在實際開發中,每每使用getCurrentSession多,由於通常是處理同一個事務,因此在通常狀況下比較少使用openSession;

 

openSession與getCurrentSession的區別:

(1)getCurrentSession在事務提交或者回滾以後會自動關閉,而openSesssion須要你手動關閉。若是使用openSession而沒有手動關閉,屢次以後會致使鏈接池溢出!

(2)openSession每次建立新的session對象,getCurrentSession使用現有的session對象

 

五、對象關係映射經常使用配置 hbm.xml

<hibernate-mapping
  schema="schemaName" //模式的名字
  catalog="catalogName" //目錄的名稱
  default-cascade="cassade_style" //級聯風格
  default-access="field/property/CalssName" //訪問策略
  default-lazy="true/false" //加載策略
  package="packagename" //默認包名
/>
<class
  name="ClassName" //對應映射的類
  table="tableName" //對應映射數據庫的表
  batch-size="N" //抓取策略,一次抓取多少記錄
  where="condition" //條件 eg:抓取條件
  entity-name="EntiyName" //若是須要映射多張表
/>
<id //表的主鍵
  name="propertyName" //對應的屬性
  type="typeName" //對應類型
  column="column_nam" //映射數據庫中表當中字段名的名稱
  length="length" //指定長度
  <generator class="generatorClass">//主鍵生成策略
/>
hbm.xml

  一、代理主鍵:是指與業務無關且能惟一標識數據庫中記錄,通常是數據庫自動生成的,好比mysql可使用auto_increment,Sql2000可使用identity生成方式,oracle可使用sequence生成方式。

  二、天然主鍵:指業務相關,由用戶指定,且能惟一標識數據庫中的任意一條記錄。

   

相關文章
相關標籤/搜索