1. 程式人生 > >SSH框架之Hibenate

SSH框架之Hibenate

Hibernate基礎 原理: 1.通過Configuration().configure();讀取並解析hibernate.cfg.xml配置檔案 2.由hibernate.cfg.xml中的<mapping resource="com/xx/User.hbm.xml"/>讀取並解析對映資訊 3.通過config.buildSessionFactory();//建立SessionFactory 4.sessionFactory.openSession();//開啟Sesssion 5.session.beginTransaction();//建立事務Transation 6.persistent operate持久化操作 7.session.getTransaction().commit();//提交事務 8.關閉Session 9.關閉SesstionFactory 為什麼要用: 1. 對JDBC訪問資料庫的程式碼做了封裝,大大簡化了資料訪問層繁瑣的重複性程式碼。 2. Hibernate是一個基於JDBC的主流持久化框架,是一個優秀的ORM實現。他很大程度的簡化DAO層的編碼工作 3. hibernate使用Java反射機制,而不是位元組碼增強程式來實現透明性。 4. hibernate的效能非常好,因為它是個輕量級框架。對映的靈活性很出色。它支援各種關係資料庫,從一對一到多對多的各種複雜關係。 public class UserDaoImpl implements UserDao{      @Override      public void insertUser(User u) { //        1.載入配置檔案           //預設載入Hibernate.cfg.xml檔案 如果核心配置檔案被修改位置 或 改名字 //        Configuration cfg = new Configuration().configure("hibernate.cfg.xml"); //         //        2.建立sessionFactory //        SessionFactory factory = cfg.buildSessionFactory(); //         //        3.開啟session            //瞬時態 //        Session session = factory.openSession(); //        4.開啟事務           Transaction tx = session.beginTransaction(); //        5.Session的CUID           //持久態 //        session.save(u);           session.update(u); //        session.delete(u); //        6.事務的提交           //遊離態 //        7.關閉資源           session.close();      } } 1,   物件狀態:         Hibernate將實體類物件分為三種狀態   一  、 臨時(瞬時)狀態:     建立物件 --> session管理物件 之間的狀態       特點:       不被session管理      不與資料庫表 列對應 二 、持久化狀態: Session管理 --> 事務提交 Session.save(user);//持久化 特點: 被session 管理 與資料庫表 列對應 三 、遊離(脫管)狀態: 事務提交以後-->消亡 特點: 不被session管理
與資料庫表 列相對應 2,SessionFactory 是否需要關閉???? 不需要,SessionFactory的建立耗費資源和記憶體 3, 針對於查詢而言,是不需要進行事務的處理的 Hibernate提供兩種方式: Get Load Get 與 load 區別: 查詢時間不同
        1. get方法查詢時是立即載入(執行get方法後,立即向資料庫傳送sql語句查詢回資料)   
        2. load方法查詢時才用的是延時載入(執行load方法時,並沒有向資料庫傳送sql語句查詢資料,而是返回一個代理物件。load方法是在第一次獲取代理物件中,非主鍵的屬性時,才傳送sql語句進行查詢)
查不到資料,返回結果不同:
      1. 當根據所給主鍵,查不到資料時,  get方法 返回 null
      2. load方法  拋異常
hibernate.cfg.xml配置 <hibernate-configuration>      <!-- SessionFactory -->      <session-factory>           <!-- 開啟三級快取 又叫查詢快取 -->           <property name="hibernate.cache.use_query_cache">true</property>           <!--          開啟二級快取 -->           <property name="cache.use_second_level_cache">true</property>           <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>           <!-- 資料庫連線資訊 -->           <property name="connection.driver_class">oracle.jdbc.driver.OracleDriver</property>           <property name="connection.url">jdbc:oracle:thin:@127.0.0.1:1521:ORCL</property>           <property name="connection.username">hr</property>           <property name="connection.password">123</property>           <!-- 配置方言:根據不同的資料庫,生成不同的sql語句 -->           <property name="dialect">org.hibernate.dialect.Oracle10gDialect</property>           <!-- 顯示出Hibernate生成的sql語句 -->           <property name="show_sql">true</property>           <!-- 格式化 sql語句 -->           <property name="format_sql">true</property>           <!-- update:在向資料庫中插入資料時,如果表不存在,則會自動建立表;如果存在,則向表中新增資料 -->           <!-- <property name="hibernate.hbm2ddl.auto">update</property> -->           <!-- 對映配置檔案 -->           <mapping resource="com/zrgk/entity/User.hbm.xml" />           <mapping resource="com/zrgk/entity/Emp.hbm.xml" />           <mapping resource="com/zrgk/entity/Dept.hbm.xml" />           <mapping resource="com/zrgk/entity/Student.hbm.xml" />           <mapping resource="com/zrgk/entity/Course.hbm.xml" />           <mapping resource="com/zrgk/entity/Husband.hbm.xml" />           <mapping resource="com/zrgk/entity/Wife.hbm.xml" />           <mapping resource="com/zrgk/entity/Person.hbm.xml" />           <mapping resource="com/zrgk/entity/IdCard.hbm.xml" />      </session-factory> </hibernate-configuration> Hibernate的快取:
    1. 一級快取 是session級別快取
      1. 特點:自動開啟,不能關閉
      2. 當開啟一級快取時,先去session物件中查詢資料,如果沒有查詢到,則去資料庫取值,將取出來的資料先放到session中,再放到物件中;當再有查詢時,先去session查詢如果查詢到,則直接取值,而不需要去資料庫中取值;這樣減少的資料庫的連線數,並提高效率。
    2. 如何清除快取:
      1. session.flush()     清session的快取,把資料同步到資料庫中 
        1. 如果session中的物件,與資料庫中的不一致,就再次查詢
      2. session.clear()     清session的快取,資料不會同步到資料庫中
        1. 直接從session中清除
      3. session.evict(user)   把指定物件從session的快取中清除,資料不會同步到資料庫中
    3. 二級快取
      1. sessionFactory級別的
        1. 資料是所有Session共享的  
        2. 什麼樣的資料放入到二級快取中?
          1. 查詢多
          2. 少增刪改
        3. 使用:
          1. 匯入快取的jar包  -->  ehcache-1.2.3.jar
          2. 在src下放入快取的策略
            1. 將..\project\cache-ehcache\src\test\resources\ehcache.xml複製到src下
          3. 二級快取需要手動開啟
            1. 在核心配置檔案中配置:
<!-- 開啟二級快取 -->            <property name="cache.use_second_level_cache">true</property>
    1. 指定物件放入到二級快取中
      1. 方式一:在配置檔案中配置:<class-cache usage="read-only" class="com.entity.User"/>
      2. 方式二:在對映檔案中配置:<cache usage="read-only"/>
    2. 指定快取代理商
      1. <!-- hibernate3的二級快取配置 -->
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
    1. <!-- hibernate4的二級快取配置 -->
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
      1. 禁用快取
        1. 方式一:<property name="hibernate.cache.use_second_level_cache">false</property>
        2. 方式二:session.setCacheMode(CacheMode.IGNORE); // 設定快取模式:禁止一級快取和二級快取之間進行資料互動
    1. 快取配置檔案:
      1. <diskStore path="java.io.tmpdir"/><!-- 快取物件存在磁碟上路徑 -->
      2. 快取規則:
        1. maxElementsInMemory  記憶體中最多快取多少個物件
        2. timeToIdleSeconds    最大空閒時間(秒)
        3. timeToLiveSeconds    最大存活時間
        4. overflowToDisk       記憶體中數量超過規定時,是否把物件存到磁碟上     
        5. eternal              是否是永久的
        6. 案例:
        7. <defaultCache
        8. maxElementsInMemory="10000"
        9. eternal="false"
        10. timeToIdleSeconds="120"
        11. timeToLiveSeconds="120"
        12. overflowToDisk="true"
    1. 快取注意:
      1. 一級快取和二級快取都只儲存物件,不會儲存欄位的結果集
      2. get、load、iterate方法支援一級和二級快取,但list方法不支援
    2. 三級快取(查詢快取)
      1. 基本步驟
        1. 在配置檔案中,配置開啟查詢快取:<property name="hibernate.cache.use_query_cache">true</property>
        2. 通過程式碼設定啟用查詢快取:query.setCacheable(true);
        3. 注意:只有list方法支援查詢快取,iterate方法不支援查詢快取