Hibernate是一種對JDBC作了輕量級封裝的對象---關係映射工具,所謂輕量級封裝,是指Hibernate並無徹底封裝JDBC,Java應用便可以經過Hibernate API訪問數據庫,還能夠繞過Hibernate API,直接經過JDBC API來訪問數據庫。
-----摘自Hibernate文檔緩存
前一篇文章中的例子中基本上已經涵蓋了對數據庫的增刪改查操做,咱們經過Hibernate操縱數據庫時應該按照一個什麼樣的步驟來呢?要用到Hibernate的哪些API呢?通常來講,全部的Hibernate應用都會訪問6個核心接口或者類,它們是:Configuration、SessionFactory、Session、Transaction、Query和Criteria,它們的關係以下圖所示。 安全
- static{
- try{
- Configuration configuration=new Configuration();
- sessionFactory=
- configuration.configure().buildSessionFactory();
- }
- catch(Exception e){
- e.printStackTrace();
- }
- finally{
- }
- }
- //以saveCustomer方法爲例來進行闡述
- public void saveCustomer(Customer customer){
- Session session=sessionFactory.openSession();
- Transaction tx = null;//局部變量必須賦予初始值
- try{
- tx=session.beginTransaction();
- //事務開始
- session.save(customer);
- tx.commit();
- }
- catch(Exception e){
- if(tx!=null) tx.rollback();
- e.printStackTrace();
- }
- finally{
- session.close();
- }
- }
從上面的代碼能夠看出,咱們首先會執行靜態塊裏面的代碼,它的做用就是建立一個Configuration對性和SessionFactory對象:session
1.Configuration configuration=new Configuration();
2.sessionFactory=configuration.configure().buildSessionFactory();app
這和咱們圖中所描述的順序是一致的。下面看咱們的saveCustomer方法,在這個方法裏面咱們進行了以下兩個步驟:ide
3.Session session=sessionFactory.openSession();
4.Transaction tx=session.beginTransaction ();工具
在這幾個步驟以後再調用Session接口的save方法向數據庫中寫入數據,因爲這個方法沒有執行查詢操做,因此就沒有用到Query接口和Criteria接口。那麼這幾個接口或者類具體起什麼做用呢?學習
一.Configurationui
Configuration對象用於配置並根啓動Hibernate。Hibernate應用經過Configuration實例來指定對象—關係映射文件的位置或者動態配置Hibernate的屬性,而後建立SessionFactory實例。注意藍色背景的文字,Configuration實例是何時指定ORM文件的地址的呢?咱們能夠查看Configuration的源代碼,它的configure()方法是這樣實現的:this
public Configuration configure() throws HibernateException {
configure( "/hibernate.cfg.xml" );//此處指定了ORM文件的位置
return this;
}
原來它是在這裏指定了ORM文件的位置,這就是爲何Hibernate老是默認到classpath下去尋找hibernate.cfg.xml文件的緣由了。實際上咱們還能夠經過configure(String resource)來動態的指定配置文件,只不過一般咱們都是採用的默認設置罷了。這樣的話咱們的配置文件就都被讀取了,同時配置文件中經過<mapping>元素引入的映射文件也被讀取了。
二.SessionFacory
前面咱們已經說Configuration負責建立SessionFactory實例,那麼建立的時候有什麼動做呢?咱們能夠查看Configuration的buildSessionFactory方法,這個方法把Configuration對象所包含的全部配置信息都拷貝到SessionFactory對象的緩存當中了,而且SessionFactory對象建立以後就再也不和Configuration對象關聯了。那麼SessionFactory對象是幹什麼用的呢?通常而言,一個SessionFactory對象就表明一個數據庫存儲源,一般一個應用程序只須要建立一個SessionFactory實例便可。由此咱們看出SessionFactory具有以下兩個特色:
1. 線程安全。整個應用共用一個SessionFactory實例。
2. 重量級。在SessionFactory中存放了Hibernate配置信息以及映射元素據信息,這些都須要很大的緩存。
通常來講,SessionFactory的主要做用就是建立Session對象,全部的線程都是從SessionFactory中獲取Session對象來處理客戶請求的。
三.Session
這個能夠說是被使用最多了,只要涉及到增刪改查,都離不開Session實例,前面咱們也已經說了全部的線程都是從SessionFactory中獲取Session對象來處理客戶請求的,所以Session的每一個方法都值得咱們去研究和探討,不過最經常使用的仍是save、saveOrUpdate、update、delete、createQuery等方法了,關於Session是如何做用的以及它的工做原理在之後的實踐中再一步一步的進行學習和探討,至於其它的如Query、Transaction等都是和Session結合在的一塊兒使用的,在這裏也就很少說了。
實際上上圖的表述不是很準確,由於除了Configuration以外其它的都是接口,接口是不能被實例化的,只能說是建立了一個這個接口類型的實例。從前面的文章中摘取幾個代碼片斷來看: