摘要:使用反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來(lái)實(shí)現(xiàn)透明性。工具類初始化失敗為空,請(qǐng)檢查配置文件瞬時(shí)對(duì)象與持久化對(duì)象測(cè)試代碼當(dāng)前在數(shù)據(jù)庫(kù)中沒(méi)有記錄進(jìn)行關(guān)聯(lián),所以此時(shí)是瞬時(shí)對(duì)象。將持久化當(dāng)前在數(shù)據(jù)庫(kù)有唯一一條記錄對(duì)應(yīng),所以此時(shí)是持久化對(duì)象。
一、什么是Hibernate?
Hibernate (開(kāi)放源代碼的對(duì)象關(guān)系映射框架): Hibernate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝,它將POJO與數(shù)據(jù)庫(kù)表建立映射關(guān)系,是一個(gè)全自動(dòng)的ORM框架,hibernate可以自動(dòng)生成SQL語(yǔ)句,自動(dòng)執(zhí)行,使得Java程序員可以隨心所欲的使用對(duì)象編程思維來(lái)操縱數(shù)據(jù)庫(kù)。二、為什么使用Hibernate? 2.1 Hibernate相對(duì)于傳統(tǒng)JDBC的優(yōu)點(diǎn)
對(duì)JDBC訪問(wèn)數(shù)據(jù)庫(kù)的代碼做了封裝,大大簡(jiǎn)化了數(shù)據(jù)訪問(wèn)層繁瑣的重復(fù)性代碼。
Hibernate是一個(gè)基于JDBC的主流持久化框架,是一個(gè)優(yōu)秀的ORM實(shí)現(xiàn)。他很大程度的簡(jiǎn)化DAO層的編碼工作。
hibernate使用Java反射機(jī)制,而不是字節(jié)碼增強(qiáng)程序來(lái)實(shí)現(xiàn)透明性。
hibernate的性能非常好,因?yàn)樗莻€(gè)輕量級(jí)框架。映射的靈活性很出色。它支持各種關(guān)系數(shù)據(jù)庫(kù),從一對(duì)一到多對(duì)多的各種復(fù)雜關(guān)系。
2.2 Hibernate相對(duì)于MyBatis的區(qū)別與聯(lián)系緩存方面
相同點(diǎn):
Hibernate和Mybatis的二級(jí)緩存除了采用系統(tǒng)默認(rèn)的緩存機(jī)制外,都可以通過(guò)實(shí)現(xiàn)你自己的緩存或?yàn)槠渌谌骄? 存方案,創(chuàng)建適配器來(lái)完全覆蓋緩存行為。
不同點(diǎn):
Hibernate的二級(jí)緩存配置在SessionFactory生成的配置文件中進(jìn)行詳細(xì)配置,然后再在具體的表-對(duì)象映射中配置是那種緩存。
MyBatis的二級(jí)緩存配置都是在每個(gè)具體的表-對(duì)象映射中進(jìn)行詳細(xì)配置,這樣針對(duì)不同的表可以自定義不同的緩存機(jī)制。并且Mybatis可以在命名空間中共享相同的緩存配置和實(shí)例,通過(guò)Cache-ref來(lái)實(shí)現(xiàn)。
三、Hibernate的使用準(zhǔn)備好User實(shí)體類和數(shù)據(jù)庫(kù)記錄
User.java
public class User { private Integer id; private String userName; private String passWord; //Get、Set方法,此處省略。 }
mysql數(shù)據(jù)庫(kù):
3.1 添加pom依賴Hibernate基礎(chǔ)Maven依賴:
3.2 hibernate.cfg.xml配置文件junit junit 4.12 test dom4j dom4j 1.6.1 commons-logging commons-logging 1.1.1 org.hibernate hibernate-core 4.3.2.Final commons-collections commons-collections 3.2.1 mysql mysql-connector-java 5.1.6
3.2 User.hbm.xml映射文件com.mysql.jdbc.Driver admin jdbc:mysql://localhost:3306/Hibernatetraning root org.hibernate.dialect.MySQLDialect true
測(cè)試
Configuration config = new Configuration().configure(); SessionFactory sessionFactory = config.buildSessionFactory(); //測(cè)試session是否創(chuàng)建,以及是否可以從user映射的表里獲取記錄 Session session = sessionFactory.openSession(); //System.out.println("session=="+session); User user = (User)session.get(User.class,1); System.out.println(user); //關(guān)閉會(huì)話工廠,項(xiàng)目自動(dòng)停止。生產(chǎn)環(huán)境中千萬(wàn)不要寫(xiě)這句。 //sessionFactory.close();
控制臺(tái)輸出:User{id=1, userName="Jack", passWord="123"}
四、Hibernate基本概念Hibernate是自動(dòng)化程度更高ORM(Object-Relational Mapping)框架,不是面向SQL的持久層框架,以更加OO方式來(lái)編寫(xiě)數(shù)據(jù)讀寫(xiě)代碼。4.1 對(duì)象與關(guān)系型數(shù)據(jù)庫(kù)
注意:一定要清楚當(dāng)前操作的東西,是屬于對(duì)象層面的還是關(guān)系型數(shù)據(jù)庫(kù)層面的,解決異常也是如此。
Hibernate中的對(duì)象有3中狀態(tài),瞬時(shí)對(duì)象(Transient Objects)、持久化對(duì)象(Persistent Objects)和離線對(duì)象(Detached Objects也叫做脫管對(duì)象)。4.2 HibernateUtils.java工具類
public class HibernateUtils { private static SessionFactory sessionFactory = null; static { try { Configuration configuration = new Configuration().configure(); ServiceRegistry serviceRegistry = new ServiceRegistryBuilder() .applySettings(configuration.getProperties()) .build(); sessionFactory = configuration.buildSessionFactory(serviceRegistry); }catch (HibernateException e){ System.out.println("SessionFactory初始化失敗"); e.printStackTrace(); } } public static SessionFactory getSessionFactory() throws Exception{ if (sessionFactory != null){ return sessionFactory; }else { throw new Exception("sessionFactory為空,請(qǐng)檢查配置文件"); } } public static Session getSession(){ Session session = null; try { if (sessionFactory != null){ session = sessionFactory.openSession(); } }catch (HibernateException e){ e.printStackTrace(); } return session; } public static void closeSession(Session session){ try { if (session != null && session.isOpen()){ session.close(); } }catch (HibernateException e){ e.printStackTrace(); } } }4.3 瞬時(shí)對(duì)象與持久化對(duì)象
測(cè)試代碼:
Session session = HibernateUtils.getSession(); Transaction tx = session.beginTransaction(); User user1 = new User(); user1.setId(2); user1.setUserName("Frank"); user1.setPassWord("111"); // 當(dāng)前user1在數(shù)據(jù)庫(kù)中沒(méi)有記錄進(jìn)行關(guān)聯(lián),所以此時(shí)user1是瞬時(shí)對(duì)象。 // 將user1持久化 session.save(user1); tx.commit(); User user2 = (User)session.get(User.class, 2); System.out.println(user2); // 當(dāng)前user2在數(shù)據(jù)庫(kù)有唯一一條記錄對(duì)應(yīng),所以此時(shí)user2是持久化對(duì)象。4.4 hibernate.hbm2ddl.auto
hibernate.cfg.xml配置文件中hibernate.hbm2ddl.auto屬性值(從類自動(dòng)生成數(shù)據(jù)庫(kù)DDL操作)
create:如果設(shè)置為該值,則每次加載hibernate時(shí)(準(zhǔn)確說(shuō)應(yīng)是創(chuàng)建SessionFactory時(shí))都會(huì)刪除以前創(chuàng)建的表而根據(jù)model重新生成表,即使前后的表沒(méi)有任何變化,通常會(huì)造成數(shù)據(jù)庫(kù)數(shù)據(jù)丟失,需謹(jǐn)慎使用這個(gè)取值。
create-drop:與create差不多,所不同的是每次sessionFactory關(guān)閉時(shí),就會(huì)刪除所有表。
update(最常用):這個(gè)取值比較常用,需要先建立數(shù)據(jù)庫(kù),在第一次加載hibernate時(shí)會(huì)自動(dòng)創(chuàng)建表,以后創(chuàng)建hibernate會(huì)自動(dòng)根據(jù)model更新表結(jié)構(gòu),即使表結(jié)構(gòu)改變了,以前的行不會(huì)被刪除。
validate:每次加載hibernate時(shí),驗(yàn)證創(chuàng)建數(shù)據(jù)庫(kù)表結(jié)構(gòu),只會(huì)和數(shù)據(jù)庫(kù)中的表進(jìn)行比較,不會(huì)創(chuàng)建新表,但是會(huì)插入新值。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/73465.html
摘要:初步使用主要使用注解的方式對(duì)進(jìn)行校驗(yàn),第一個(gè)例子在需要校驗(yàn)的字段上指定約束條件然后在中可以這樣調(diào)用,加上注解即可。如果校驗(yàn)失敗,默認(rèn)會(huì)返回框架的出錯(cuò)信息。指定到的分組名會(huì)全部進(jìn)行校驗(yàn),不指定的不校驗(yàn)。 Spring Boot - 表單校驗(yàn)(JSR303&Hibernate Validator) 回顧 Spring Boot - 初識(shí) Hello World Spring Boot -...
摘要:本文將繼續(xù)介紹簡(jiǎn)單的增刪改查方法和對(duì)對(duì)象實(shí)例狀態(tài)的理解查詢方法暫不提及。二實(shí)例狀態(tài)中的對(duì)象有中狀態(tài)瞬時(shí)對(duì)象持久化對(duì)象和離線對(duì)象也叫做脫管對(duì)象。持久化狀態(tài)已經(jīng)被持久化,并且加入到緩存中。處于游離狀態(tài)的對(duì)象稱為游離對(duì)象。 在上一篇《初識(shí)Hibernate》中簡(jiǎn)單介紹了在Hibernate如何加載對(duì)象和持久化對(duì)象,以及Hibernate中對(duì)象實(shí)例狀態(tài)。本文將繼續(xù)介紹Hibernate簡(jiǎn)單的增...
摘要:背景這段時(shí)間較忙,有些想念小紅,為了表達(dá)我對(duì)小紅的思念之情,決定將啟動(dòng)的研究一下,看看是否能夠自定義,讓我天天能夠看到她。 背景 這段時(shí)間較忙,有些想念小紅,為了表達(dá)我對(duì)小紅的思念之情,決定將spring boot啟動(dòng)的banner研究一下,看看是否能夠自定義,讓我天天能夠看到她。 展示 經(jīng)過(guò)調(diào)研,發(fā)現(xiàn)自定義banner是一個(gè)輕松愉快的過(guò)程,忍不住讓我多啟動(dòng)幾次,先看看效果:(省略了一...
摘要:當(dāng)面講給你聽(tīng)講堂地址,或許是最實(shí)用的教程,新課促銷中,只要你敢來(lái),保你收貨滿滿。優(yōu)惠報(bào)名全程擼碼快速入門(mén)教程全原價(jià),優(yōu)惠價(jià)全程擼碼進(jìn)階全原價(jià),優(yōu)惠價(jià) 回顧 Spring Boot - 初識(shí) Hello World Spring Boot - Servlet、過(guò)濾器、監(jiān)聽(tīng)器、攔截器 Spring Boot - 靜態(tài)資源處理、啟動(dòng)加載、日志處理 Spring Boot - 部署Deplo...
摘要:一配置屬性詳解可以在各式各樣不同環(huán)境下工作而設(shè)計(jì)的因此存在著大量的配置參數(shù)。以簡(jiǎn)便操作,多數(shù)配置參數(shù)都有默認(rèn)的配置值也是我們?nèi)粘J褂玫谋仨毱贰? Hibernate (開(kāi)放源代碼的對(duì)象關(guān)系映射框架) Hibernate是一個(gè)開(kāi)放源代碼的對(duì)象關(guān)系映射框架,它對(duì)JDBC進(jìn)行了非常輕量級(jí)的對(duì)象封裝, 它將POJO與數(shù)據(jù)庫(kù)表建立映射關(guān)系,是一個(gè)全自動(dòng)的orm框架,hibernat...
閱讀 1773·2021-11-12 10:36
閱讀 1675·2021-11-12 10:36
閱讀 3508·2021-11-02 14:46
閱讀 3906·2019-08-30 15:56
閱讀 3729·2019-08-30 15:55
閱讀 1527·2019-08-30 15:44
閱讀 1111·2019-08-30 14:00
閱讀 2781·2019-08-29 18:41