JAVA編程免不了和數據庫打交道,那麼如何高效便捷地操做數據庫,也是一個須要而對的問題,原生的基於JDBC的方式固然是很是低效,並且要寫一大堆無用的模板代碼,不值得選取。好在咱們不須要重複的造輪子,目前已經有不少優秀的ORM框架可供使用了,常見的好比Hibernate, Mybatis,TopLink等,JAVA EE3.0規範中提出的JPA,一樣也是十分的好用,因此有時面試官也會問一下些和這個相關的面試題,下面整理一些我的遇到,或者網上常常看到的一些面試題 。html
1、什麼是JPA,爲何要有JPA?java
JPA的全稱是Java Persistence API, 即JAVA 持久化API,是EJB 3.0 的專家推出,做爲 JSR-220的一部分,簡單點來講能夠理解爲是一個JAVA的標準規範,這個規範爲對JAVA對象的持久化制定了一些標準的接口,也能夠說,面試
JPA是一個標準的ORM(對象關係映射)規範。數據庫
那麼爲何要有JPA呢?時下ORM框架不少,不一樣的ORM框架相互之間並不兼容。SUN也意識到了,對於JAVA對象的持久化是一個重要的內容,提出這個規範,一方面是爲了簡化EJB中對於對象持久化的操做,另外一方面,也但願經過制定統一規範,達到一統ORM標準的目的。編程
JPA雖然是爲EJB服務,但並不對JAVA對象有特別的要求,它能夠是一個普通的POJO,僅此而已。該規範主要包括三部份內容,即ORM映射元數據,標準接口API,以及查詢語言。緩存
要注意的是JPA只是一個接口規範,而不是實現,具體實現由各供應商來完成,目前的話,Hibernate,TopLink,OpenJPA都很好地實現了JPA接口。session
要基於JPA操做數據庫,須要有一個persistence.xml配置文件,具體的幾個關鍵類是EntityManagerFactory, EntityManager, 經過EntityManager的實例,咱們能夠對JAVA對象進行操做,如persist, merge, remove, createQuery等。mybatis
2、Hibernate併發
Hibernate多是最經常使用的ORM框架了,總體表現上來看仍是比較優秀。不得不提一下他的創始人:Gavin King,聽說他是由於沒法所愛EJB1.1的臃腫的模式代碼而要尋求改變,而在寫Hibernate以前,作的第一件事,竟然是先去買了一本SQL基礎的書。這也說明,要成功,一是要想法,二是,立刻作手去作。框架
要進行Hibernate開發,我以爲有幾個點是須要了解的,一是配置文件,默認的hibernate.cfg.xml,和對象對應的配置文件,如User.hbm.xml。另外和JPA相似,Hibernate中也有幾個重要的對象,如Configuration, SessionFactory, Session, Transaction, Query, Criteria. 只要知道它們如何使用,創建一個DEMO工程即是一件很簡單的事了。下面說一個幾個常見的問題:
2.1 建立SESSION有哪兩種方式,它們有什麼區別?
Hibernate裏的Session對象主要負責對對象進行CRUD操做,建立Session有兩種方式,第一種是openSession,另一種是getCurrentSession.
第一種方式下,老是會新建一個會話,當會話結束後,須要手動進行關閉以釋放資源,而getCurrentSession則會和當前線程關聯,若是當前線程沒有,則新建一個,若是有,則取當前的,這個的特色是不須要手動關閉,當事務提交後,就自動關閉了,並且再調用其關閉接口反而會報錯。不過這種方式須要咱們在配置文件中設置下面這一項
thread
其底層應該是基於ThreadLocal實現的。一般狀況下,咱們使用這一種便可。
2.2 LOAD和GET有什麼區別?
load和get都是從數據庫中查詢指定主鍵的記錄。參考網上的資料,整理以下:
相同點:都會先查找session緩存,若緩存中有,則直接返回。
不一樣點:load認爲數據庫中必定是有這條記錄的,因此若不存在,則先會建立一個代理對象,當真正使用這個對象
的數據時,纔會再去查詢二級緩存和數據庫,這就是所謂的延遲加載。若查不到,則返回ObjectNotFoundException。而對於get來講,則會直接依次查找二級緩存和數據庫,查不到的話,則直接返回null.
2.3 Hibernate中的主鍵類型主要有哪幾種?
對於自增型的數據庫,使用identity,如MYSQL,對於序列化的主鍵,使用Sequence,如Oracle。若是不清楚,能夠用native.
2.4 Hibernate中的緩存機制?專業java培訓認爲主要分爲兩類緩存,即所謂的一級緩存和二級緩存。一級緩存是session級別的,也是強制使用的,咱們無需過多的關心也沒法干預其使用。當咱們用Session對Java對象進行crud操做時會用到,好比添加,是先將對象放到 一級緩存中,這個時候信息並未入庫,而是在緩存中,當調用了commit以後再入庫的。
二級緩存位於sessionFactory的級別,也就是說,同一sessionFactory下,二級緩存中的對象,是能夠被全部的session共享的,但這個緩存基於外部緩存組件,須要手動配置和開啓。常見的有EHCache。
因爲被session共享,因此就存在併發的問題,因此,二級緩存,只適合存儲那些不常常修改,非重要數據,偶爾或幾乎不會產生併發的數據。
查詢的時候,會先查緩存,再查數據庫,更新的時候,也會先更新緩存,再更新數據庫。
Hibernate中還有一類緩存叫作查詢緩存,只有查詢的時候才起做用,這一類通常用途不是太大。
3、 Mybatis
mybatis的前身是ibatis,源於 Apache的一個開源項目。一樣的,這是一個ORM框架,不過這個框架最大的特色有三點,一是面向接口編程,二是能夠在配置文件中定義SQL語句,三是支持動態SQL,這是其獨特的一面。
在網上找了一下,相關的面試題很少,說一下我遇到的吧
3.1 Mybatis中#和$的區別?
這兩個均可以做爲佔位符,不過#{}裏的佔位符,mybatis會加以處理,相似於普通SQL中的?,這樣的話能夠避免SQL注入的問題。
而 $ 則是原樣輸出,沒法避免SQL注入的問題,一般狀況下,咱們優先使用#,但若是有的時候,咱們就是要傳一個字段名進去,那麼使用$,好比 order by \${id}
3.2 Mybatis和Hibernate比較?
相同點就不說了,說一下主要區別:
1. mybatis手寫SQL,而hibernate提供映射機制,開發人員無需關心
2. mybatis控制更細粒度,但可移植性差,hibernate開發DAO很簡單,可移植性好
3. mybatis容易上手學習,hibernate難度稍大
4. hibernate提供了面向對象的SQL語句HQL,也能使用普通的SQL,但mybatis只能使用普通的SQL。
以上是我的總結的對這三個框架的一些理解,後續若再遇到相關的面試題,再補充上來