1. 程式人生 > >Hibernate學習(一)

Hibernate學習(一)

Hibernate是一個持久化,ORM框架。 持久化:瞬時狀態和持久狀態之間的轉換機制。

Hibernate 使用步驟

1 匯入本地jar包或者使用maven pom下載對應hiberante jar包。 2 封裝實體類User(採用正向工程方式 實體類–表) 3 配置實體類對映檔案 User.hbm.xml(開頭與實體類名稱一致)

<!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.sunsharing.htest.entity.User" table="t_user" schema="htest"> <id name="userId" column="user_id"> <generator class="native"></generator> </id> <property name="userName" column="user_name"
/>
<property name="userPwd" column="user_pwd"/> </class> </hibernate-mapping>

4.配置Hibernate總配置檔案


<!DOCTYPE hibernate-configuration PUBLIC
        "-//Hibernate/Hibernate Configuration DTD//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"> <![CDATA[jdbc:mysql://localhost:3306/htest?useUnicode=true&characterEncoding=utf8]]> </property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">1234</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <mapping resource="com/sunsharing/htest/entity/User.hbm.xml"/> </session-factory> </hibernate-configuration>

5.編寫測試類

import com.sunsharing.htest.entity.User;
import org.hibernate.SessionFactory;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.cfg.Configuration;
import org.hibernate.service.ServiceRegistryBuilder;

public class Main {
    public static void main(String[] args) {
        //1 初始化配置檔案,並讀取裡面的資訊
        Configuration config = new Configuration().configure();
        //2 配置註冊器   hibernate3 不需要配置註冊器,而hibernate4則需要
        ServiceRegistryBuilder srb = new ServiceRegistryBuilder().applySettings(config.getProperties());
        //3 建立sessionfactory
        SessionFactory sf = config.buildSessionFactory(srb.buildServiceRegistry());
        //4 開啟會話
        Session  session = sf.openSession();
        //5 開啟事務
        Transaction tran = session.beginTransaction();
        //6進行相關語句操作
        try {
            // User user = new  User();
            // user.setUserName("對對對");
            // user.setUserPwd("111");
            // session.save(user);
            User user = (User)session.get(User.class,1);
            System.out.print(user.getUserName() + "   " + user.getUserPwd());
        } catch (Exception e) {
            //事務回滾
            tran.rollback();
        }
        //7 提交事務
        tran.commit();
        //8 關閉會話
        session.close();
    }
}

物件三種狀態:

瞬時狀態(new 出來的物件) 持久狀態(當前物件和資料庫表的一行資料一致,且所在的session沒有關閉) 遊離(脫管)狀態(當前物件和資料庫表的一行資料一致,且所在的session關閉) 三種狀態切換: 當物件是通過new方式構造出來的,那麼此時該物件是瞬時狀態物件,當呼叫save方法時,那麼該物件由瞬時狀態變成持久狀態,當持久狀態的物件呼叫delete方法後,該物件變成瞬時狀態。當一個物件是由get或者load等方法獲取得到,那麼此時該物件就是持久狀態的物件,當session關閉時,持久狀態的物件都是脫管狀態的物件。注意:瞬時狀態和脫管狀態是沒有辦法直接轉換的。

JDBC和Hibernate區別 相同點:1 都是資料庫操作的中介軟體 2 事務都需要顯式提交 3 都需要關閉 不同點:1 JDBC採用sql,Hibernate採用HQL。 2 JDBC操作的是表,Hibernate操作的是實體類 3 JDBC操作的物件都是瞬時的,Hibernate操作的物件都是可持久化的。

持久化持久類需要注意的事項: 1、為類的持久化欄位宣告訪問方法(get/set),Hibernate對JavaBeans風格的屬性實行持久化。 2、實現一個預設的構造方法(無參的),這樣的話Hibernate就可以使用Constructor.newInstance()方法來例項化物件。 3、如果是集合型別的屬性,它的型別必須定義為集合的介面,例如:List、Set(不要定義成ArrayList) 4、提供一個標識屬性(主鍵Identifier property),如果沒有該屬性,一些功能不起作用,比如:級聯更新,session.saveOrUpdate()。

get和load的區別 1 get方法返回的是真實物件,load方法返回的是代理物件 2 當查詢的資料id是沒有資料對應的情況下,get返回的是空物件,load方法會丟擲異常。

HQL特點 它是完全面向物件的查詢語句,查詢功能非常強大,具備繼承、多型和關聯等特性

HQL用面向物件的方式生成SQL

  • 以類和屬性來代替表和資料列
  • 支援多型
  • 支援各種關聯
  • 減少了SQL的冗餘

HQL支援所有的關係資料庫操作

  • 連線(joins,包括Inner/outer/full joins),笛卡爾積(cartesian products)
  • 投影
  • 聚合和分組
  • 排序
  • 子查詢
  • SQL函式

主鍵生成器 1 native 本地化,意味著無論底層是哪種資料庫,hibernate會自動選擇最合適的方式實現主鍵的自增。任何資料庫都能使用。 2 increment 在插入資料之前,先查詢當前表的最大id,在+1後作為插入資料的主鍵,任何資料庫都能使用。 3 Identity 要求底層資料庫必須支援主鍵自增,比如Mysql和SQL Server資料庫 4 sequence 要求底層資料庫要支援採用序列方式生成id,比如Oracle和DB2 資料庫 5 assigned 要求主鍵id必須是String型別的值,且該id的值由程式設計師自己錄入。 6 uuid-hex 由計算機生成的128bit的字串id。採用該主鍵自增策略的優點:保證多併發環境下id值都是唯一的,且有利於資料庫的合併。

關係關聯對映

多對一: 在實體類,多的一方的屬性要有一的方法的類物件; 在多的實體類對映檔案中配置many-to-one節點

<!-- 在該節點配置外來鍵物件 -->
 <many-to-one name="person_role" cascade="all" lazy="false" ></many-to-one>

需要通過提交多的一方進而影響一的方法,得通過配置cascade=all來實現。如果需要通過查詢多的一方,順便取出一的方法,得通過配置lazy=false來實現(如果是預設懶載入方式,那麼會出現no session問題)

一對多: 在實體類,一的一方編寫set集合儲存多的一方 在一的實體類對映檔案