1. 程式人生 > >hibernate框架之分享

hibernate框架之分享

最大值 ans release intern property jar包 配置 兩個 靜態代碼塊

1、Hibernate的概述

1) Hibernate是基於ORM思想的持久層的框架,底層是對jdbc的封裝

2) 核心思想:Object Relation Mapping 對象關系映射。

2、Hibernate的入門

1)下載Hibernate的jar包

2)導入Hibernate的必須的jar包(13個包)

3)準備數據庫表(R)

4)準備JavaBean對象(O)

5)準備映射文件:*.hbm.xml(M)

6)編寫Hibernate的核心配置文件

7)入門程序測試:保存一個客戶對象到數據庫

3、Hibernate的核心API的介紹

1)Configuration

2)SessionFactory

3)Session

4)Transaction

4、抽取Hibernate的工具類

/**

* 工具類

* @author Johnny.Chen

*

*/

public class HibernateUtil {

//全局的SessionFactory對象

private static SessionFactory factory;

//靜態代碼塊

static{

Configuration cfg =

new Configuration();

cfg.configure();//加載主配置文件

factory = cfg.buildSessionFactory();

}

/**

* 打開一個session

* @return

*/

public static Session openSession(){

return factory.openSession();

}

}

5、完成客戶對象的增刪改查

session.save(Customer);

session.get(Customer.class,id);

session.update(Customer);

session.delete(Customer);

6、get方法與load方法的區別

get:立即加載

load:延遲加載

1、持久化類

Bean:可重用組件

JavaBean:用java語言寫的可重用組件。

實體類:

一般屬性都私有化

一般都提供get和set方法

一般都有無參的構造方法

一般實現Serializable接口

持久化類: 實體類 + *.hbm.xml

特點:

一般屬性都私有化

一般都提供get和set方法

一般都有無參的構造方法

一般實現Serializable接口

必須還要有一個OID屬性

2、對象標識符【OID】

技術分享圖片

OID由Hibernate來維護

3、hibernate 的主鍵生成策略

1)自然主鍵和代理主鍵

技術分享圖片

2)主鍵生成策略

Hibernate中的主鍵生成策略

native:【推薦】

根據數據庫選擇相應的主鍵自增長策略,identity、sequence 這兩個中去找

identity:

適用於有數據庫自增長能力的策略,想mysql可以用這種

用法:<generator class="identity"></generator>

sequence:

適用序列機制的數據庫,例如:Oracle

用法:

<generator class="sequence">

<param name="sequence_name">seq_linkman_id</param>

</generator>

increment:【了解】

先查詢id最大值然後+1,變成主鍵的值,一般不用這種方式,原因是不適合並發操作

用法:<generator class="increment"></generator>

uuid :【了解】

生成uuid的字符串,適用於字符主鍵,一般用的也少

用法:<generator class="uuid"></generator>

assigned:【了解】

手動指定id,自己指定,不指定會報錯

用法:<generator class="assigned"><

4、對象的三種狀態

靠兩個特制:OID、是否被Session管理

1)瞬時態

沒有OID,沒有被Session管理

2)持久態:有更新數據庫的能力

有OID,被Session管理

3)脫管態

有OID,沒有被Session管理

/**

* Hibenrate中對象的三種狀態:

* @author Johnny.Chen

*

*/

public class HibernateDemo2 {

@Test //ctrl + 1

public void test(){

Session s = HibernateUtil.openSession();

Transaction tx = s.beginTransaction();

//=======================================

LinkMan l = new LinkMan();//瞬時態

l.setLkmName("貝吉塔");

s.save(l);//持久態

System.out.println(l.getLkmId());

//=======================================

tx.commit();

s.close();//關閉session

System.out.println(l);//脫管態

}

/**

* 持久態又更新數據庫的能力

*/

@Test //ctrl + 1

public void test2(){

Session s = HibernateUtil.openSession();

Transaction tx = s.beginTransaction();

//=======================================

LinkMan linkMan = s.get(LinkMan.class, 1L);//持久態

linkMan.setLkmName("悟空");

// s.update(linkMan);//原來我們需要update才更新數據庫的,現在我們註釋掉這裏

//=======================================

tx.commit();

s.close();//關閉session

}

}

問題:為什麽能更新數據庫?

5、Hibernate中的一級緩存

什麽是緩存:就是內存中 的一部分

目的:提高效率

那種數據適用緩存:查得多,改的少的

什麽數據不適合:股票走勢、用戶的賬戶信息【金額】

Hibernate中有一級緩存和二級緩存:

1)一級緩存是Session中的緩存

2)二級緩存是SessionFactory的緩存【已經不用】

public class HibernateDemo3 {

/**

* 證明一級緩存的存在

*/

@Test //ctrl + 1

public void test2(){

Session s = HibernateUtil.openSession();

Transaction tx = s.beginTransaction();

//=======================================

LinkMan linkMan = s.get(LinkMan.class, 1L);//會發起請求:打印sql語句

System.out.println(linkMan);

LinkMan linkMan2 = s.get(LinkMan.class, 1L);//不會發起請求:不打印sql語句

System.out.println(linkMan2);

System.out.println(linkMan==linkMan2);//true

//=======================================

tx.commit();

s.close();//關閉session

}

}

6、Hibernate中的快照機制

快照是Hibernate中的另外一個map,它其實就是數據庫的備份

技術分享圖片

由於有快照機制和一級緩存,所以持久態對象能更新數據庫。

7、事務控制

一個線程只有一個Session

事務的控制一般都是業務層

在業務層和持久層中都會用到session對象,這個兩個地方用到的對象應該是同一個:

把Session綁定到當前線程上:

1)在hibernate.cfg.xml中配置

<?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>

<!--

主要有三部分信息

1、數據庫的鏈接信息

2、hibernate的配置信息

3、映射文件的位置

-->

<!-- 這裏面的配置都能從 \hibernate-release-5.0.7.Final\project\etc\hibernate.properties 中找到 -->

<!-- 1、數據庫鏈接信息-->

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

<property name="hibernate.connection.url">jdbc:mysql://localhost:3306/hibernate_day02</property>

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

<property name="hibernate.connection.password">passw0rd</property>

<!-- oracle -->

<!-- <property name="hibernate.connection.driver_class">oracle.jdbc.driver.OracleDriver</property>

<property name="hibernate.connection.url">jdbc:oracle:thin:@192.168.44.11:1521:orcl</property>

<property name="hibernate.connection.username">scott</property>

<property name="hibernate.connection.password">123456</property> -->

<!-- 2、hibernate的配置信息 -->

<!-- 配置數據庫的方言 -->

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

<!-- <property name="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</property> -->

<!-- 配置顯示sql語句 -->

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

<!-- 格式化sql語句 -->

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

<!-- 自動維護表結構 -->

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

<!-- 配置c3p0鏈接池 -->

<property name="hibernate.connection.provider_class">org.hibernate.c3p0.internal.C3P0ConnectionProvider</property>

<!-- 把Session綁定到當前線程上

key: hibernate.current_session_context_class

value: thread

-->

<property name="hibernate.current_session_context_class">thread</property>

<!-- 3、映射文件的位置 -->

<mapping resource="cn/itcast/entity/LinkMan.hbm.xml"/>

</session-factory>

</hibernate-configuration>

2)換一個SessionFactory的方法獲取Session

/**

* 工具類

* @author Johnny.Chen

*

*/

public class HibernateUtil {

private static SessionFactory factory;

//實例化session工廠

static{

Configuration cfg = new Configuration();

cfg.configure();

factory = cfg.buildSessionFactory();

}

/**

* 獲取session對象,每次都是新的

* @return

*/

public static Session openSession(){

return factory.openSession();

}

/**

* 獲取當前線程的session對象

* @return

*/

public static Session getCurrentSession(){

return factory.getCurrentSession();

}

}

hibernate框架之分享