1. Configuration管理讀取配置文件
//讀取src下hibernate.properties,不推薦使用
Configuration cfg = new Configuration();
//如果hibernate的核心配置文件 不叫 hibernate.cfg.xml
Configuration cfg1 = new Configuration().configure("hb.cfg.xml");
//可編程式 可以不使用配置文件
//cfg.addProperties();
//cfg.addResource()
Configuration在一個(gè)應(yīng)用中车海,最好寫一個(gè)嚷狞。通過(guò)configuration來(lái)創(chuàng)建SessionFactory對(duì)象夺溢。
2. SessionFactory對(duì)象:是一個(gè)session工廠甥捺。是一個(gè)重量級(jí)對(duì)象邮绿。在一個(gè)應(yīng)用中最好也是單列的渠旁。是一個(gè)線程安全的。屬于進(jìn)程級(jí)別的對(duì)象船逮。
//2.通過(guò)Configuration創(chuàng)建SessionFactory對(duì)象
//在hibernate3.x中是這種寫法
//SessionFactory sf = cfg.buildSessionFactory();
//hibernate4.3之前~hibernate4.0
// ServiceRegistry sr = new ServiceRegistryBuilder()
// .applySettings(cfg.getProperties())
// .buildServiceRegistry();
//hibernate4.3
ServiceRegistry registry = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties())
.build();
SessionFactory sf = cfg.buildSessionFactory(registry);
//或者
//SessionFactory sf = cfg.buildSessionFactory();
3. Session對(duì)象:使用hibernate進(jìn)行數(shù)據(jù)庫(kù)操作顾腊,主要使用session。Session可以理解為對(duì)Connection對(duì)象的一個(gè)包裝傻唾。Session對(duì)象中提供了對(duì)數(shù)據(jù)庫(kù)的crud操作投慈。
Session是一個(gè)線程不安全的對(duì)象承耿。生命周期非常短暫冠骄,一般和事務(wù)一一對(duì)應(yīng)。Session又稱為hibernate中的一級(jí)緩存加袋。Session又是transaction對(duì)象的工廠凛辣。
//3.通過(guò)SessionFactory得到Session
Session session = sf.openSession();
4. Transaction對(duì)象:事務(wù)管理對(duì)象。通過(guò)session來(lái)獲取到該對(duì)象职烧。包括了事務(wù)的開(kāi)啟扁誓,事務(wù)的提交,事務(wù)的回滾蚀之。
//第一種寫法
Transaction tx = session.beginTransaction();
//第二種寫法
Transaction tran = session.getTransaction();
tran.begin();
事務(wù)和異常處理:
public static void main(String[] args) {
Configuration cfg = null;
SessionFactory sf = null;
Session session = null;
Transaction tx = null;
try{
cfg = new Configuration().configure();
ServiceRegistry registry = new StandardServiceRegistryBuilder()
.applySettings(cfg.getProperties())
.build();
sf = cfg.buildSessionFactory(registry);
session = sf.openSession();
tx = session.beginTransaction();
User u = (User)session.get(User.class, 2);
System.out.println("name="+u.getName());
//6.提交事務(wù)
tx.commit();
}catch (Exception e) {
e.printStackTrace();
//回滾事務(wù)
tx.rollback();
}finally{
//7.關(guān)閉session
if(session!=null&&session.isOpen())
session.close();
}
}
5. hibernate.cfg.xml講解
<session-factory>
<!-- 配置數(shù)據(jù)庫(kù)連接信息 -->
<!-- 數(shù)據(jù)庫(kù)驅(qū)動(dòng) -->
<property name="connection.driver_class">
com.mysql.jdbc.Driver
</property>
<!-- url 相當(dāng)于:jdbc:mysql://localhost:3306/hibernate4-->
<property name="connection.url">
jdbc:mysql:///hibernate4
</property>
<property name="connection.username">root</property>
<property name="connection.password">root</property>
<!-- hibernate可選項(xiàng)信息 -->
<!-- 數(shù)據(jù)庫(kù)方言 -->
<property name="dialect">
org.hibernate.dialect.MySQL5Dialect
</property>
<!-- 是否打印sql語(yǔ)句 -->
<property name="show_sql">true</property>
<!-- 格式化sql語(yǔ)句 -->
<property name="format_sql">true</property>
<!-- 數(shù)據(jù)庫(kù)更新方式:
create:每次執(zhí)行 都先把原有數(shù)據(jù)表刪除蝗敢,然后創(chuàng)建該表
create-drop:使用 create-drop時(shí),在顯式關(guān)閉SessionFactory時(shí),
將drop掉數(shù)據(jù)庫(kù)schema(表).
validate:檢測(cè)
update:如果表不存在 則創(chuàng)建足删,有就不用創(chuàng)建
-->
<property name="hbm2ddl.auto">update</property>
<!-- 映射文件信息 -->
<mapping resource="cn/siggy/pojo/User.hbm.xml" />
</session-factory>
6. *.hbm.xml講解
<!-- package聲明pojo類所在的包寿谴,如果不寫 那么在class中需要指明pojo類所在的包
schema指數(shù)據(jù)庫(kù)模式 一個(gè)模式下可以有多張表
-->
<hibernate-mapping package="cn.siggy.pojo" >
<!-- class指映射一個(gè)pojo類
提供了公共的無(wú)參構(gòu)造方法-通過(guò)反射產(chǎn)生對(duì)象
屬性用private修飾,并且生成對(duì)應(yīng)的get/set方法
類不能用final來(lái)修飾-hibernate會(huì)產(chǎn)生代理類(cglib)
類需要指明標(biāo)識(shí)
name表示pojo類名
table表示pojo類對(duì)應(yīng)數(shù)據(jù)庫(kù)中的表名失受;如果不寫默認(rèn)是類名
-->
<class name="User" table="user">
<!--
id表示實(shí)體類的標(biāo)識(shí)(OID)
對(duì)應(yīng)數(shù)據(jù)庫(kù)表中的主鍵
name指實(shí)體類的標(biāo)識(shí)屬性名
column表示對(duì)應(yīng)數(shù)據(jù)庫(kù)表的列名:如果不寫 則數(shù)據(jù)庫(kù)表中列名和屬性名一致
length表示數(shù)據(jù)庫(kù)表中 對(duì)應(yīng)數(shù)據(jù)類型的長(zhǎng)度 讶泰,如果不寫有默認(rèn)長(zhǎng)度
type表示類型如果不寫hibernate可以找到對(duì)應(yīng)pojo類的屬性的類型
-->
<id name="id" column="id">
<!-- 主鍵生成策略
increment 用于為long, short或者int類型生成 唯一標(biāo)識(shí)咏瑟。
只有在沒(méi)有其他進(jìn)程往同一張表中插入數(shù)據(jù)時(shí)才能使用。 在集群下不要使用
(mysql,ms sql)
identity 對(duì)DB2,MySQL, MS SQL Server, Sybase和HypersonicSQL
的內(nèi)置標(biāo)識(shí)字段提供支持痪署。 返回的標(biāo)識(shí)符是long, short 或者int類型的码泞。
sequence 在支持序列的數(shù)據(jù)庫(kù)中使用 oracle
<generator class="sequence">
<param name="sequence">user_seq</param>
</generator>
uuid UUID被編碼為一個(gè)32位16進(jìn)制數(shù)字的字符串。
native 根據(jù)底層數(shù)據(jù)庫(kù)的能力選擇identity, sequence 或者h(yuǎn)ilo中的一個(gè)狼犯。
assigned 自己指定主鍵
-->
<generator class="native"/>
</id>
<!-- 實(shí)體類的屬性
name:指明 pojo類屬性名稱(區(qū)分大小寫)
-->
<property name="name">
<column name="name"></column>
</property>
<property name="pwd"/>
</class>
</hibernate-mapping>