hibernate4快速入門實(shí)例詳解
Hibernate是什么
Hibernate是一個(gè)輕量級(jí)的ORMapping框架
ORMapping原理(Object RelationalMapping)
ORMapping基本對(duì)應(yīng)規(guī)則:
1:類跟表相對(duì)應(yīng)
2:類的屬性跟表的字段相對(duì)應(yīng)
3:類的實(shí)例與表中具體的一條記錄相對(duì)應(yīng)
4:一個(gè)類可以對(duì)應(yīng)多個(gè)表,一個(gè)表也可以對(duì)應(yīng)對(duì)個(gè)類
5:DB中的表可以沒有主鍵,但是Object中必須設(shè)置主鍵字段
6:DB中表與表之間的關(guān)系(如:外鍵)映射成為Object之間的關(guān)系
7:Object中屬性的個(gè)數(shù)和名稱可以和表中定義的字段個(gè)數(shù)和名稱不一樣
ORMapping的基本實(shí)現(xiàn)方式:
使用JDBC,用SQL來(lái)操作數(shù)據(jù)庫(kù),只是看動(dòng)態(tài)生成還是人工寫代碼來(lái)實(shí)現(xiàn)。
大家想想,我們實(shí)現(xiàn)過(guò)ORMapping嗎?
Hibernate能干什么:
Hibernate主要用來(lái)實(shí)現(xiàn)Java對(duì)象和表之間的映射,除此之外還提供還提供數(shù)據(jù)查詢和獲取數(shù)據(jù)的方法,可以大幅度減少開發(fā)時(shí)人工使用SQL和JDBC處理數(shù)據(jù)的時(shí)間。
Hibernate的目標(biāo)是對(duì)于開發(fā)者通常的數(shù)據(jù)持久化相關(guān)的編程任務(wù),解放其中的95%。對(duì)于以數(shù)據(jù)為中心的程序來(lái)說(shuō),它們往往只在數(shù)據(jù)庫(kù)中使用存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)商業(yè)邏輯,Hibernate可能不是最好的解決方案;對(duì)于那些在基于Java的中間層應(yīng)用中,它們實(shí)現(xiàn)面向?qū)ο蟮臉I(yè)務(wù)模型和商業(yè)邏輯的應(yīng)用,Hibernate是最有用的。
Hibernate可以幫助你消除或者包裝那些針對(duì)特定廠商的SQL代碼,并且?guī)湍惆呀Y(jié)果集從表格式的表示形式轉(zhuǎn)換到一系列的對(duì)象去。
一個(gè)非常簡(jiǎn)要的Hibernate體系結(jié)構(gòu)的高層概要圖
Hibernate運(yùn)行時(shí)體系結(jié)構(gòu)
“最小”的體系結(jié)構(gòu)方案,要求應(yīng)用程序提供自己的 JDBC連接并管理自己的事務(wù)。這種方案使用了Hibernate API 的最小子集.
“全面解決”的體系結(jié)構(gòu)方案,將應(yīng)用層從底層的JDBC/JTAAPI中抽象出來(lái),而讓Hibernate來(lái)處理這些細(xì)節(jié)。
SessionFactory(org.hibernate.SessionFactory)
針對(duì)單個(gè)數(shù)據(jù)庫(kù)映射關(guān)系經(jīng)過(guò)編譯后的內(nèi)存鏡像,是線程安全的(不可變)。 它是生成Session的工廠,本身要用到ConnectionProvider。
Session(org.hibernate.Session)
表示應(yīng)用程序與持久儲(chǔ)存層之間交互操作的一個(gè)單線程對(duì)象,此對(duì)象生存期很短,隱藏了JDBC連接,也是Transaction的工廠。
Transaction(org.hibernate.Transaction)
應(yīng)用程序用來(lái)指定原子操作單元范圍的對(duì)象,它是單線程的,生命周期很短。它通過(guò)抽象將應(yīng)用從底層具體的JDBC、JTA以及CORBA事務(wù)隔離開。
ConnectionProvider(org.hibernate.connection.ConnectionProvider)
生成JDBC連接的工廠(有連接池的作用)。它通過(guò)抽象將應(yīng)用從底層的Datasource或DriverManager隔離開。僅供開發(fā)者擴(kuò)展/實(shí)現(xiàn)用,并不暴露給應(yīng)用程序使用。
TransactionFactory(org.hibernate.TransactionFactory)
生成Transaction對(duì)象實(shí)例的工廠。僅供開發(fā)者擴(kuò)展/實(shí)現(xiàn)用,并不暴露給應(yīng)用程序使用。
HelloWorld
要研究怎么做,先得搞清楚需要做什么
根據(jù)剛才的學(xué)習(xí),做基本的Hibernate應(yīng)用程序,要完成下面的工作:Object、數(shù)據(jù)庫(kù)的表、兩種配置文件、客戶端程序來(lái)調(diào)用Hibernate的接口進(jìn)行操作。
構(gòu)建環(huán)境
最簡(jiǎn)單的方法:把hibernate-release-4.0.0.Beta4.zip包里面lib/required下的jar包全部添加到工程的library里面,另外還需添加slf4j的實(shí)現(xiàn)包slf4j-log4j12-1.5.8.jar和log4j的實(shí)現(xiàn)包log4j-1.2.16.jar,還有別忘了把JDBC的驅(qū)動(dòng)jar包也加入到library里面
Object怎么做
1:就是前面學(xué)過(guò)的vo的寫法(規(guī)則同樣是那四點(diǎn))
2:要求必須有一個(gè)public為空參的構(gòu)造方法,現(xiàn)在寫vo一般不寫構(gòu)造方法,默認(rèn)就有一個(gè),但是寫構(gòu)造方法的時(shí)候要注意寫上一個(gè)public為空參的構(gòu)造方法
3:要求提供一個(gè)標(biāo)識(shí)屬性(identifier)
4:使用非final的類(因?yàn)橐褂么韥?lái)延遲實(shí)體的裝載)
5:設(shè)若構(gòu)建一個(gè)對(duì)象:com.bjpowernode.h4.hello.UserModel,有四個(gè)屬性:uuid,userId,name,age
在數(shù)據(jù)庫(kù)中建表
設(shè)若構(gòu)建一個(gè)表為tbl_user,字段:uuid,userId,name,age
配置xxx.cfg.xml
1:缺省名稱為hibernate.cfg.xml
2:存放在當(dāng)前classes的根目錄下,開發(fā)的時(shí)候在src根下就可以了
3:主要有如下四部分配置 :
(1)與DB的連接
(2)可選配置
(3)資源文件注冊(cè)
(4)二級(jí)緩存
4:配置的時(shí)候可以到Hibernate發(fā)行包里面找個(gè)hibernate.cfg.xml的例子,比如可以用“\project\hibernate-documentation\quickstart\tutorials\basic\src\test\resources”下面的hibernate.cfg.xml作例子
5:示例如下:
<?xml version='1.0' encoding='utf-8'?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property> <property name="connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property> <property name="connection.username">test</property> <property name="connection.password">test</property> <property name="connection.pool_size">2</property> <property name="dialect">org.hibernate.dialect.OracleDialect</property> <property name="show_sql">true</property> <mapping resource="cn/bjpowernode/h4/hello/UserModel.hbm.xml"/> </session-factory> </hibernate-configuration>
配置xxx.hbm.xml
1:與被描述的類同名 ,如:UserModel.hbm.xml
2:存放位置與所描述類存放在同一文件夾下
3:主要有如下四部分配置 :
(1)類和表的映射
(2)主鍵的映射
(3)類的屬性和DB中字段的映射
(4)關(guān)系的映射
4:配置的時(shí)候可以到hibernate發(fā)行包里面找個(gè)例子,比如可以用“\project\hibernate-core\src\test\java\org\hibernate\test\cid”下面的Customer.hbm.xml作例子
5:示例如下:
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC '-//Hibernate/Hibernate Mapping DTD 3.0//EN' 'http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd'> <hibernate-mapping> <class name="com.bjpowernode.h4.hello.UserModel" table="tbl_user"> <id name="uuid"> <generator class="assigned"/> </id> <property name=“userId”></property> <property name=“name”></property> <property name="age"></property> </class> </hibernate-mapping>
客戶端文件:
package com.bjpowernode.h4.hello; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.hibernate.Transaction; import org.hibernate.cfg.Configuration; public class Client { public static void main(String[] args) { SessionFactory sf = new Configuration().configure().buildSessionFactory(); Session s = null; Transaction t = null; try{ //準(zhǔn)備數(shù)據(jù) UserModel um = new UserModel(); um.setUuid("1"); um.setUserId("id1"); um.setName("name1"); um.setAge(1); s = sf.openSession(); t = s.beginTransaction(); s.save(um); t.commit(); }catch(Exception err){ t.rollback(); err.printStackTrace(); }finally{ s.close(); } } }
測(cè)試:直接在Elipse里面運(yùn)行Client文件即可,運(yùn)行結(jié)束,你將會(huì)看到在console輸出:“Hibernate: insert into tbl_user (userId, name, age, uuid) values (?, ?, ?, ?)”,打開數(shù)據(jù)庫(kù)的數(shù)據(jù)表,你會(huì)看到一條值已經(jīng)加入了。
說(shuō)明:
1:SessionFactory sf = new Configuration().configure().buildSessionFactory();
這句話的意思是讀取hibernate.cfg.xml,創(chuàng)建Session工廠,是線程安全的。
默認(rèn)是”hibernate.cfg.xml”,不用寫出來(lái),如果文件名不是”hibernate.cfg.xml”,那么需要顯示指定,如下:
SessionFactory sf = new Configuration(). configure( “bjpowernode.cfg.xml” ).buildSessionFactory();
2:Session是應(yīng)用程序主要使用的Hibernate接口,約相當(dāng)于JDBC的Connection+Statement/PreparedStatement的功能,是線程不安全的
3:在Hibernate4里面,已經(jīng)不推薦使用Configuration類了,而改為使用 ServiceRegistryBuilder和MetadataSources來(lái)代替,新的寫法大致如下:
ServiceRegistryBuilder builder = new ServiceRegistryBuilder().configure(); builder.applySetting("connection.driver_class", "oracle.jdbc.driver.OracleDriver"); builder.applySetting("connection.url", "jdbc:oracle:thin:@localhost:1521:orcl"); builder.applySetting("connection.username", "ztb"); builder.applySetting("connection.password", "ztb"); builder.applySetting("connection.pool_size", "2"); builder.applySetting("hibernate.dialect", "org.hibernate.dialect.OracleDialect"); builder.applySetting("show_sql", "true"); MetadataSources sources = new MetadataSources( builder.buildServiceRegistry() ); sources.addResource("cn/bjpowernode/h4/hello/UserModel.hbm.xml"); MetadataImpl metadata = (MetadataImpl) sources.buildMetadata(); SessionFactory sf = metadata.getSessionFactoryBuilder().buildSessionFactory();
這種寫法,現(xiàn)在還沒有實(shí)現(xiàn)完全,不太好用,所以官方給出的示例里面還是采用以前的方式,大家先了解一下。
4:這里使用的事務(wù)Transaction是Hibernate的Transaction,需要有,不能去掉。
為什么必須有這個(gè)Hibernate的事務(wù)呢?以HelloWorld為例來(lái)看看:
總結(jié)
以上所述是小編給大家介紹的hibernate4快速入門實(shí)例詳解,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
- Hibernate迫切連接和普通連接的區(qū)別實(shí)例詳解
- hibernate通過(guò)session實(shí)現(xiàn)增刪改查操作實(shí)例解析
- 在已有spring的基礎(chǔ)上集成hibernate的實(shí)例講解
- hibernate屬性級(jí)別注解實(shí)例代碼
- Hibernate 修改數(shù)據(jù)的實(shí)例詳解
- JSP開發(fā)之hibernate之單向多對(duì)一關(guān)聯(lián)的實(shí)例
- Hibernate識(shí)別數(shù)據(jù)庫(kù)特有字段實(shí)例詳解
- Hibernate初體驗(yàn)及簡(jiǎn)單錯(cuò)誤排除代碼詳解
相關(guān)文章
KotlinScript構(gòu)建SpringBootStarter保姆級(jí)教程
這篇文章主要為大家介紹了KotlinScript構(gòu)建SpringBootStarter的保姆級(jí)教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-09-09SpringBoot讀取多環(huán)境配置文件的幾種方式
這篇文章主要給大家介紹了SpringBoot讀取多環(huán)境配置文件的幾種方式,文章通過(guò)代碼示例介紹的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下2023-10-10Java模擬實(shí)現(xiàn)QQ三方登錄(單點(diǎn)登錄2.0)
這篇文章主要為大家詳細(xì)介紹了Java模擬實(shí)現(xiàn)QQ三方登錄,單點(diǎn)登錄2.0,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-06-06阿里nacos+springboot+dubbo2.7.3統(tǒng)一處理異常的兩種方式
本文主要介紹了阿里nacos+springboot+dubbo2.7.3統(tǒng)一處理異常的兩種方式,文中根據(jù)實(shí)例編碼詳細(xì)介紹的十分詳盡,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03cmd中javac和java使用及注意事項(xiàng)詳解
這篇文章主要介紹了cmd中javac和java使用及注意事項(xiàng)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-07-07IDEA下lombok安裝及找不到get,set的問(wèn)題的解決方法
這篇文章主要介紹了IDEA下lombok安裝及找不到get,set的問(wèn)題的解決方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-04-04Java yield()線程讓步實(shí)現(xiàn)過(guò)程解析
這篇文章主要介紹了Java yield()線程讓步實(shí)現(xiàn)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-03-03