1. 程式人生 > >(四)Hibernate API詳解

(四)Hibernate API詳解

delet hibernate load 類型變量 nbsp ria 每次 transacti llb

一、Configuration類

用來加載默認文件路徑下的配置文件(hibernate.properties)。

調用configure()方法會加載默認文件路徑下的xml格式的配置文件(hibernate.cfg.xml)推薦使用。

如果配置文件在不默認文件路徑下或者配置文件名不符合默認規則 可以使用

new Configuration().configure(file) 加載指定文件

new Configuration().configure(path) 加載指定路徑下的文件

如果使用properties格式的配置文件,可以使用addClass(實體類名.class)方法可以加載映射文件。

二、SessionFactory對象

SessionFactory代表數據庫存儲源。根據Hibernate配置文件創建對應的數據庫存儲源。

SessionFactory對象創建後,和Configuration對象再無關聯。修改Configuration包含的配置文件信息,不會對SessionFactory有任何影響。

獲取SessionFactory對象:new Configuration().configure().buildSessionFactory();

對象的緩存很大,就稱為重量級對象。SessionFactory存放了Hibernate配置信息,映射元數據信息等。是重量級對象。

三、Session對象

                代表程序和數據庫的會話。Session提供了操作數據庫的各種方法。是輕量級對象。 

                   獲取Session對象 
                   factory.openSession(): 獲取新的Session實例。
                   factory.getCurrentSession():采用該方法創建的Session會取出當前線程中的Session,底層使用ThreadLocal進行存取 

                    save()方法:把Java對象保存到數據庫中。
                                    Transaction ts=session.beginTransaction();
                                    User u=new User();
                                    u.setName("趙六");
                                    u.setPassword("123456");
                                    //將對象保存到數據庫
                                    session.save(u); 
                                    ts.commit();

                    update()方法:更新數據庫的方法 
                                    Transaction ts=session.beginTransaction();
                                    //先查出要修改的對象,根據主鍵值   
                                    User user=session.get(User.class, 1);
                                    user.setName("jery");
                                    //將對象更新到數據庫,根據OID
                                    session.update(user); 
                                    ts.commit();

                    delete()方法:刪除方法
                                    底層根據OID進行刪除。有兩種方式
                                    (1)
                                        Transaction ts=session.beginTransaction();
                                        User user=session.get(User.class, 1); 
                                        //刪除指定對象
                                        session.delete(user);   
                                        ts.commit();
                                    (2)
                                        Transaction ts=session.beginTransaction();
                                        User user=new User();
                                        user.setId(2);
                                        session.delete(user);
                                        ts.commit();     

                    load()或get()方法:從數據庫查找指定對象 

                                  session.get(實體類名.class,OID);或session.load(實體類名.class,OID);

                    load()和get()的區別
                                  我們使用get查詢時發現控制臺會立馬打出查詢語句。
                                  使用load查詢時控制臺不會打印查詢語句。
                                  get方法被調用時立刻發送sql語句到數據庫進行查詢。
                                  load方法被調用時並沒有查詢數據庫,當我們需要使用查詢的對象時,才去查詢,所以當我們打印對象時,才會在控制臺打印sql語句。

                      get()的原理 
                                程序調用get方法,Hibernate發送sql語句到數據庫
                                數據庫返回結果,Hibernate將結果封裝成對象,返回對象到程序。

                      load()的原理
                                程序調用load方法,Hibernate使用代理技術,創建一個代理對象,屬性只有ID值。
                                然後返回代理對象給程序,我們使用對象時,代理對象調用Hibernate查詢數據庫,初始化其他屬性。 

            load方法,返回一個代理對象,獲取其屬性時,會查詢數據庫,每次訪問屬性都會查詢數據庫麽?
            答:不是。代理對象中有一個標識是否被初始化的boolean類型變量,記錄是否被初始化。

 四、Criteria 

            使用HQL語言(後面會詳細介紹),HQL語言是面向對象的
            Query query=session.createQuery("from User");


            第二種方式
            Criteria c=session.createCriteria(User.class);
            List<User> l=c.list();

            第三種方式,使用原生sql語句進行查詢
            SQLQuery query=session.createSQLQuery("select * from user");
            List l=query.list();

 五、Transaction對象 

        封裝了事務的操作。我們做增刪改查等操作時,必須開啟事務.
            因為session是線程不安全的,這樣主要是為了線程安全。保證數據的正確性。
            開啟事務: Transaction ts=session.beginTransaction();
            提交事務:ts.commit();
            回滾事務:ts.rollback();
            當通過getCurrentSession獲取當前線程綁定的Session時,事務關閉時,會自動把Session關閉並刪除。

六、Query對象 

        封裝HQL語句的對象。

        返回一個對象的方法 query.uniqueResult();

        分頁相關
        query.setFirstResult(index):從第幾個取
        query.setMaxResults(count):指定取幾行記錄

  

(四)Hibernate API詳解