1.get和load區別。
(1)get如果沒有找到會返回null, load如果沒有找到會拋出異常。
(2)get會先查一級緩存, 再查二級緩存,然后查數據庫;load會先查一級緩存,如果沒有找到,就創建代理對象, 等需要的時候去查詢二級緩存和數據庫
2.Hibernate中的三種數據狀態
(1)臨時態(瞬時態/Transient)
不存在於session中,也不存在於數據庫中的數據,被稱為臨時態。
比如:剛剛使用new關鍵字創建出的對象。
(2)持久態(Persistent)
存在於session中,事務還未提交,提交之后最終會進入數據庫的數據,被稱為持久態。
比如:剛剛使用session.save()操作的對象。
(3)游離態(脫管態/Detached)
存在於數據庫中,但不存在於session中的數據,被稱為游離態。
比如:使用了session.save(),並且事務已經提交之后,對象進入數據庫,就變成了游離態。
3.Hibernate工作原理及為什么要用?
1.讀取並解析配置文件
2.讀取並解析映射信息,創建SessionFactory
3.打開Sesssion
4.創建事務Transation
5.持久化操作
6.提交事務
7.關閉Session
8.關閉SesstionFactory
為什么要用:
1. 對JDBC訪問數據庫的代碼做了封裝,大大簡化了數據訪問層繁瑣的重復性代碼。
Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作
hibernate使用Java反射機制,而不是字節碼增強程序來實現透明性。
hibernate的性能非常好,因為它是個輕量級框架。映射的靈活性很出色。它支持各種關系數據庫,從一對一到多對多的各種復雜關系。
4.Hibernate緩存機制
首先說下Hibernate緩存的作用(即為什么要用緩存機制),然后再具體說說Hibernate中緩存的分類情況,最后可以舉個具體的例子。
Hibernate緩存的作用:
Hibernate是一個持久層框架,經常訪問物理數據庫,為了降低應用程序對物理數據源訪問的頻次,從而提高應用程序的運行性能。緩存內的數據是對物理數據源中的數據的復制,應用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據Hibernate緩存分類:
Hibernate緩存包括兩大類:Hibernate一級緩存和Hibernate二級緩存Hibernate一級緩存又稱為“Session的緩存”,它是內置的,不能被卸載(不能被卸載的意思就是這種緩存不具有可選性,必須有的功能,不可以取消session緩存)。由於Session對象的生命周期通常對應一個數據庫事務或者一個應用事務,因此它的緩存是事務范圍的緩存。第一級緩存是必需的,不允許而且事實上也無法卸除。在第一級緩存中,持久化類的每個實例都具有唯一的OID。 Hibernate二級緩存又稱為“SessionFactory的緩存”,由於SessionFactory對象的生命周期和應用程序的整個過程對應,因此Hibernate二級緩存是進程范圍或者集群范圍的緩存,有可能出現並發問題,因此需要采用適當的並發訪問策略,該策略為被緩存的數據提供了事務隔離級別。第二級緩存是可選的,是一個可配置的插件,在默認情況下,SessionFactory不會啟用這個插件。
什么樣的數據適合存放到第二級緩存中?
1 很少被修改的數據
2 不是很重要的數據,允許出現偶爾並發的數據
3 不會被並發訪問的數據
4 常量數據
不適合存放到第二級緩存的數據?
1 經常被修改的數據
2 .絕對不允許出現並發訪問的數據,如財務數據,絕對不允許出現並發
3 與其他應用共享的數據。
Hibernate查找對象如何應用緩存?
當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩存,那么從二級緩存中查;如果都查不到,再查詢數據庫,把結果按照ID放入到緩存,刪除、更新、增加數據的時候,同時更新緩存。Hibernate管理緩存實例無論何時,當你給save()、update()或saveOrUpdate()方法傳遞一個對象時,或使用load()、 get()、list()、iterate() 或scroll()方法獲得一個對象時, 該對象都將被加入到Session的內部緩存中。 當隨后flush()方法被調用時,對象的狀態會和數據庫取得同步。 如果你不希望此同步操作發生,或者你正處理大量對象、需要對有效管理內存時,你可以調用evict() 方法,從一級緩存中去掉這些對象及其集合。
5.Hibernate有哪幾種查詢數據的方式
3種:hql、條件查詢QBC(QueryBy Criteria)、原生sql (通過createSQLQuery建立)
6.JDBC hibernate 和 ibatis 的區別
(1)jdbc:手動
手動寫sql
delete、insert、update要將對象的值一個一個取出傳到sql中,不能直接傳入一個對象。
select:返回的是一個resultset,要從ResultSet中一行一行、一個字段一個字段的取出,然后封裝到一個對象中,不直接返回一個對象。
(2)ibatis的特點:半自動化
sql要手動寫
delete、insert、update:直接傳入一個對象
select:直接返回一個對象
(3)hibernate:全自動
不寫sql,自動封裝
delete、insert、update:直接傳入一個對象
select:直接返回一個對象
7.在數據庫中條件查詢速度很慢的時候,如何優化?
1.建索引
2.減少表之間的關聯
3.優化sql,盡量讓sql很快定位數據,不要讓sql做全表查詢,應該走索引,把數據量大的表排在前面
4.簡化查詢字段,沒用的字段不要,已經對返回結果的控制,盡量返回少量數據
