hibernate框架之分享
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 = 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框架之分享