国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Hibernate快速了解

selfimpr / 2010人閱讀

摘要:和就是針對的一級緩存的處理。事務對數據的操作都是封裝在事務當中的,并且默認是非自動提交的方式。所以對保存對象時,如果不開啟事務,并且手工提交事務,對象并不會真正保存在數據庫中。

ORM

全稱Object/Relationship Mapping(對象/關系映射)

為何引入ORM

Java、C++等許多語言是面向對象的編程思想,但是底層數據庫往往是關系型數據庫,為了往數據庫中插入數據,需要編寫相應的sql語句。比如向一張學生表中插入一條數據(包含學生的基本信息:姓名、年齡、家庭住址等)

insert into students values(1,"張三豐","16","男","1977-4-3","武當山屠龍館")


這種在程序中大量插入SQL語句的方式有很多弊病,因為對于SQL語句來說,存在以下問題:

不同數據庫使用的SQL語句不同,比如mysql、SQL Server(微軟的產品)

同樣的功能,在不同數據庫中實現方式不同。因為不同數據庫產品封裝的不一樣

因此,如果程序中寫入大量SQL語句,將對程序的移植、維護帶來很多麻煩。ORM就是這樣誕生的,其目的是讓程序員拋棄在程序中直接書寫SQL的思想,完全使用面向對象的思想來開發軟件。Hibernate就是一種ORM框架

關系數據庫:可以簡單的理解為二維數據庫。復雜來說,是指采用了關系模型來組織數據的數據庫(關系模型是1970年由IBM研究員E.F.Codd博士首先提出的,并逐漸發展為數據庫架構的主流模型),一般而言,關系模型指的就是二維表格模型,而一個關系型數據庫就是由二維表格和它們之間的聯系組成的一個數據組織

題外話: 經常看到除了關系型數據庫,還有一種非關系型數據庫,其實這是一種誤解。其英文為:NoSQL(全稱:Not Only SQL),所以叫它不僅僅是SQL或者超關系型數據庫都行,不知道為什么就翻譯成了非關系型數據庫。畢竟這個“非”字導致了很多理解困難
Hibernate

Hibernate是Java領域的一款開源ORM框架技術,對JDBC進行了輕量級的對象封裝

執行流程

Session(會話)

不建議直接使用jdbc的connection來操作數據庫,而是使用session,可以簡單認為,session就是操作數據庫的對象。
要想把數據保存在關系型數據庫中,需要調用session的各種方法,如:save()、update()等

如何獲取session對象

通常有兩種方法,這兩種方法都是sessionFactory中的
1) openSession
2) getCurrentSession
如果使用getCurrentSession,需要在hibernate.cfg.xml文件中進行配置:
如果是本地事務(jdbc事務)
thread
如果是全局事務(jta事務)
jta

openSession和getCurrentSession

getCurrentSession在事務提交或者回滾之后會自動關閉;而openSession需要手動關閉,如果未進行手動關閉,多次之后會導致連接池溢出

openSession每次都會創建新的session對象,getCurrentSession則使用先用的session對象

session操作

hibernate會把符合條件的數據寄存到內存上,那么也就存在一個對內存的管理,而session是有一級緩存(強制默認開啟),其目的是為了減少查詢數據庫的時間,提高效率,一級緩存的生命周期和session是一樣的。session.flush()和session.clear()就是針對session的一級緩存的處理。
簡單來說:

session.flush()的作用就是將session緩存(在內存里)中的數據與數據庫同步。

session.clear()的作用就是清除session中的緩存數據(不管緩存與數據庫的同步)

session.evict(obj)的作用就是將指定的obj緩存對象進行清除

Flush方法

可以通過flush方法強制進行從內存到數據庫的同步,主要分為了兩步:清理緩存,執行SQL。例如:

public void testFlush(){  
    Session session =  HibernateUitl.getSessionFactory().getCurrentSession();  
    session.beginTransaction();  
    Teacher t = (Teacher) session.get(Teacher.class, 3);  
    t.setName("yyy");  
    session.flush();//有flush會執行2次UPDAE,沒有會只執行一次  
    t.setName("yyyyy");  
    session.getTransaction().commit();  
}  

Flush方法是可以設置的,也就是 fulsh 什么時候執行是可以設置的,在session.beginTransaction 代碼前設置 FlushMode

session.setFlushMode(FlushMode.Always|AUTO|COMMIT|NEVER|MANUAL);

這里 FlushMode 有 5 個值可選:

Always: 任何代碼都會 Flush

AUTO: 默認方式 – 自動

Commit: COMMIT 時

Never: 始終不

MANUAL: 手動方式

設置 FlushMode 有個好處是可以節省開銷,比如默認 session 只做查詢時,就可以不讓他與數據庫同步了。

注意:執行完session.flush()時,并不意味著數據就肯定持久化到數據庫中的,因為事務控制著數據庫,如果事務提交失敗了,緩存中的數據還是照樣會被回滾的。
transaction(事務)

hibernate對數據的操作都是封裝在事務當中的,并且默認是非自動提交的方式。所以對session保存對象時,如果不開啟事務,并且手工提交事務,對象并不會真正保存在數據庫中。
如果想讓hibernate像JDBC那樣自動提交事務,必須調用session對象的doWork()方法,獲得jdbc的connection后,設置為自動提交事務模式(注意:通常不推薦這么做)

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/68240.html

相關文章

  • 貓頭鷹的深夜翻譯:為什么要使用Spring Boot?

    摘要:初次使用的人往往會困惑,不知道該使用哪種方法。目前來說,團隊推薦使用基于的方法來提供更高的靈活性。配置,從而在應用啟動時執行腳本來初始化數據庫。目前為止我們沒有任何消息需要配置,所以只在文件夾中創建一個空的文件。將配置為,它包含的上下文。 前言 spring是一個用于創建web和企業應用的一個很流行的框架。和別的只關注于一點的框架不同,Spring框架通過投資并組合項目提供了大量的功能...

    Jaden 評論0 收藏0
  • Spring/Hibernate 應用性能優化的7種方法

    摘要:對于大多數典型的企業應用而言,其性能表現幾乎完全依賴于持久層的性能。速成法使用批處理對于批處理程序,驅動程序提供了旨在減少網絡來回傳輸的優化方法。速成法檢查錯誤的提交間隔如果你使用批處理程序,提交間隔會對性能造成十倍甚至百倍的影響。 對于大多數典型的 Spring/Hibernate 企業應用而言,其性能表現幾乎完全依賴于持久層的性能。此篇文章中將介紹如何確認應用是否受數據庫約束,同時...

    lavor 評論0 收藏0
  • Spring Boot - 表單校驗(JSR303&Hibernate Validator)

    摘要:初步使用主要使用注解的方式對進行校驗,第一個例子在需要校驗的字段上指定約束條件然后在中可以這樣調用,加上注解即可。如果校驗失敗,默認會返回框架的出錯信息。指定到的分組名會全部進行校驗,不指定的不校驗。 Spring Boot - 表單校驗(JSR303&Hibernate Validator) 回顧 Spring Boot - 初識 Hello World Spring Boot -...

    tinyq 評論0 收藏0
  • 深入了解數據校驗:Bean Validation 2.0(JSR380)

    摘要:可能有人認為數據校驗模塊并不是那么的重要,因為硬編碼都可以做。我以數據綁定為引子引出了數據校驗這一塊,是想表明它的重要性。關于數據校驗這塊,最新的是,也就是我們常說的。 每篇一句 吾皇一日不退役,爾等都是臣子 對Spring感興趣可掃碼加入wx群:Java高工、架構師3群(文末有二維碼) 前言 前幾篇文章在講Spring的數據綁定的時候,多次提到過數據校驗。可能有人認為數據校驗模塊...

    wangtdgoodluck 評論0 收藏0

發表評論

0條評論

最新活動
閱讀需要支付1元查看
<