hibernate總結

  • hibernate的作用及優缺點

    1. hibernate是一個對象關係映射框架,他是對JDBC進行了輕量級的對象封裝,使得程序員可以使用面相對象的思維來操作數據庫,把以往的操作數據庫記錄換成操作對象,還實現了對象的持久化

    2. 優點

      1. hibernate使用反射機制而不是字節碼增強程序來實現透明性

      2. hibernate的性能非常好,因爲他是一個輕量級框架,映射靈活

      3. 他支持各種關係的數據庫,從一對一到多對多的各種複雜關係

    3. 缺點:

      1. 大量的多表,複雜的查詢級聯關係難以駕馭,對於複雜的查詢需要配置的比較多,效率還不高(不過他提供了HQL語句也可)

      2. 而且對數據庫的要求高

  • ORM - Hibernate設計原理

    1. hibernate框架是以款ORM工具,依據ORM設計思想開發出來的

    2. Object--Relation--Mapping 對象是java的entity,關係是關係數據庫,思想就是將程序中的對象和數據庫表實現自動映射,利用ORM工具在查詢的時候返回的就是對象,在更新、插入的時候也會將對象自動寫入到數據庫表,hibernate就是封裝了SQL+JDBC操作細節

    3. 類似的框架還有JPA,ibatiS

  • hibernate 核心API

    1. org.hibernate.cfg.Configuration類

    2. 作用:配置並啓動Hibernate,讀取配置文件、讀取映射文件,創建單實例的SessionFactory(一個數據庫一個SessionFactory)

      1. configure():加載hibernate.cfg.xml配置文件並且解析處理【Configuration cfg = new Configuration().configure(); 先調用無參數的構造:

        public Configuration() {

               this(new SettingsFactory());//創建SessionFactory

        }

        然後調用:

        protected Configuration(SettingsFactory settingsFactory) {

               System.out.println("Configuration(SettingsFactory settingsFactory)");

               this.settingsFactory = settingsFactory;

               reset();//初始化很多變量

           }

        然後調用configure()

        public Configuration configure() throws HibernateException {

               configure("/hibernate.cfg.xml");//加載hibernate主配置文件

               return this;

        }

        默認是調用的hibernate.cfg.xml文件,如果想調用自定義的文件可以調用如下方法:

        public Configuration configure(String resource) throws HibernateException {

               log.debug("configuring from resource: " + resource);

               InputStream stream = getConfigurationInputStream(resource);

               return doConfigure(stream, resource);

        }

        根據getConfigurationInputStream(resource)得到文件流,getConfigurationInputStream(resource)調用ConfigHelper.getResourceAsStream(resource)

        public static InputStream getResourceAsStream(String resource) {

                     String stripped = resource.startsWith("/") ?

                                   resource.substring(1) : resource;

                     InputStream stream = null;

                     ClassLoader classLoader = Thread.currentThread().getContextClassLoader();

                     if (classLoader!=null) {

                            stream = classLoader.getResourceAsStream( stripped );

                     }//加載文件dom4j解析文件


      2. buildSessionFactory():創建SessionFactory

      3. setProperty(String key,Object value):通過代碼給hibernate設置屬性

        這裏的設置參數和一般的在hibernate配置文件裏配置效果是一樣的
        Configuration configuration = new Configuration();
        configuration.configure();
        SessionFactory sessionFactory = configuration.buildSessionFactory();
        configuration.setProperty("hibernate.connection.url", myConnectionUrl);
        configuration.setProperty("key", value);
        sessionFactory = configuration.buildSessionFactory();
        Session s = sessionFactory.openSession();
        Transaction tx =session.beginTransaction();
    3. org.hibernate.SessionFactory接口

      作用:初始化Hibernate,負責創建Session,使用了工廠模式

      Configuration config = new Configuration();
      config.configure();
      SessionFactory sessionFactory = config.builSessionFactory();
      1. SessionFactory是線程安全的,一個數據對應一個Sessionfactory,生命週期長,一般在整個生命週期中有效;

      2. Sessionfactory緩存了生成的SQL和數據庫連接的相關信息(url,user,password)和映射信息,以及hibernate運行時要用到的一些信息

      3. openSession():創建數據庫連接,並且返回一個Session
      4. getCurrentSession():獲得當前線程的Session
      注意:以上3和4的區別:
             1.getCurrentSession創建的session會和當前線程綁定在一起,而openSession不會
             2.getCurrentSession創建的事物會在事物回滾或者事物提交的時候自動關閉session而openSession需要手動關閉
    4. org.hibernate.Session接口

      作用:執行對象持久化對象的CRUD操作

           Session 也稱爲持久化器,Session是非線程安全的,生命週期短,代表程序和數據庫的一次連接,如果session長時間打開,會長時間佔用內存和數據庫連接;

           獲取Session對象後,Hibernate內部並不會獲取操作數據庫的Connection對象,而是等Session對象真正需要對數據庫進行CRUD等操作時,纔會從數據庫連接池中獲取Connection對象;

           關閉Session對象時,則是將Connection對象返回到連接池中,而不是關閉Connection對象

           每個session對象內部都有一個緩存,他存放當前工作單元中加載的對象,session緩存被稱爲hibernate的一級緩存,sessionFactory緩存被稱爲hibernate的二級緩存,這兩個緩存都位於持久層,他們存放的都是數據庫數據的拷貝,sessionFactory的內置緩存存放元數據和預定義SQL,sessionFactory內置緩存是隻讀緩存

           Hibernate緩存的三大優點:

           1.減少數據庫的訪問頻率,提高訪問性能

           2.保證緩存中的對象與數據庫同步,位於緩存中的對象在事物提交的時候會自動同步到數據庫

           3.當持久化對象之間在關聯時Session保證不出現對象圖的死鎖

           4.Session如何判斷持久化對象的狀態的改變呢?

               Session加載對象後爲對象值類型的屬性複製一份快照,當Session清理緩存時,比較當前對象和他的快照就可以知道哪些屬性發生了變化;

           5.session什麼時候清理緩存?

               (1)commit()方法被調用時

               (2)查詢時會清理緩存,保證查詢結果能反映對象的最新狀態

               (3)顯示的調用session的flsh()方法

               當對象使用native生成器時會立刻清理緩存想數據庫中插入記錄

      1. beginTransaction():開始一個事物,並且返回一個事物實例

      2. save(Object):用於保存持對象,並保存數據的方法;執行save方法之後並不會立即操作數據庫來進行保存數據,而是在事物提交的時候纔會保存數據;

      3. persist(Object):

      4. saveOrUpdate(Object):創建或更新一條記

      5. merge(Object):

      6. get(Class,Serializable):根據id(主鍵)查詢某個類型的對象

      7. load(Object,Serializable):根據id查詢,查詢返回的是一個代理對象,不會立刻訪問數據庫,而是延遲加載的,當真的調用到這個對象的屬性或方法的時候纔會查詢數據庫

      8. 以上兩者的區別:load()和get()在未找到符合條件的持久化對象的時候,load()會拋出一個異常,而get()方法會返回null;另外兩者對緩存對象的讀取也不同,load()方法會先從hibernate的一級緩存中查找符合條件的對象,找不到的話就去hibernate的二級緩存中去查找對象,仍未找到的話纔會去數據庫中去查找,但是get方法不會去查找hibernate的二級緩存;

      9. delete(Object):刪除記錄

      10. flush():把以及緩存和數據庫同步

      11. clear():清空Sessiono,清除所有保存在當前session緩存中的實體對象,終止所有正在執行的方法(eg:save,updae,delete)

      12. createSQLQuery(“select * from tablename”):執行純sql語句的查詢,Hibernate中不建議使用SQL查詢

      13. getNameQuery(“名字”):命名查詢,查詢語句配置在hbm.xml配置文件中

    1. org.hibernate.Transaction接口

    2. 作用:負責事物的操作

      commit():事物提交

      rollback():事物回滾

    3. org.hibernate.Query接口

    4. 作用:Query可以使用HQL語言查詢數據庫

      1. list():返回查詢結果集

      2. uniqueResult():查詢唯一的結果,返回結果是Object

      3. executeUpdate():批量更新

      4. setFirst(int):設置分頁時開始的位置,從0開始

      5. setMaxResult(int):設置一次抓取多少條

    5. org.hibernate.Criteria接口

      作用:條件擦汗下,比Query更加面向對象

    6. org.hibernate.criterion.Restrictions類

    7. org.hibernate.StatelessSession接口

    8. 無狀態session,不和一級緩存、二級緩存打交道,通過使用該接口會把數據立刻寫到數據庫

      StatelessSession s = sessionFactory.openStatelessSession();

  • hibernate框架的基本特性


  • hibernate關係映射

  • hibernate關聯操作

  • hibernate查詢

  • hibernate高級特性

  • 主鍵生成策略



  • 發表評論
    所有評論
    還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
    相關文章