java 從零開始,學習筆記之基礎入門(三十七)

Hibernate_實戰演練

使用HibernateSessionFactory得到session實現CRUD

UserOperDAO.java

package com.ibm.dao;

 

import java.util.Iterator;

import java.util.List;

 

import org.hibernate.CacheMode;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

 

import com.ibm.factory.HibernateSessionFactory;

import com.ibm.pojo.User;

 

public class UserOperDAO {

    public void add(User user){

       //定義sessiontran變量

       Session session=null;

       Transaction tran=null;

       try {

           //獲得session開啓事務(涉及數據修改操作時都需要開啓事務)

           session=HibernateSessionFactory.getSession();

           tran=session.beginTransaction();

           session.save(user);

          

           //提交事務數據入庫

           tran.commit();

          

       } catch (Exception e) {

           //事務回滾

           tran.rollback();

       }finally{

           //關閉session

           HibernateSessionFactory.closeSession();

       }

    }

   

   

    /**

     * 按照用戶id刪除用戶

     * @param user

     */

 

    public void delUser(User user){

       Session session= null;

       Transaction tran=null;

       try {

          

           session=HibernateSessionFactory.getSession();

           tran=session.beginTransaction();

      

           session.delete(user);

           tran.commit();

       } catch (Exception e) {

           tran.rollback();

       }finally{

           HibernateSessionFactory.closeSession();

       }

    }

   

   

    /**

     * 修改用戶

     * @param user

     */

    public void updateUser(User user){

      

       Session session= null;

       Transaction tran=null;

       try {

          

           session=HibernateSessionFactory.getSession();

           tran=session.beginTransaction();

          

           session.update(user);

           tran.commit();

       } catch (Exception e) {

           e.printStackTrace();

           tran.rollback();

       }finally{

           HibernateSessionFactory.closeSession();

       }

      

    }

   

    /**

     * 獲得用戶信息列表

     * @return list

     */

    public List<User> getAllUser(){

       List<User> list= null;

       Session session=null;

       try {

           session=HibernateSessionFactory.getSession();

           String sql="from User user";

           Query query=session.createQuery(sql);

           list=query.list();

           System.out.println("獲得結果集");

           for (User u : list) {

              System.out.println("用戶名是:"+u.getUserName());

           }

          

       } catch (Exception e) {

           e.printStackTrace();

       }

       return list;

    }

    }

   

    public static void main(String[] args) {

       UserOperDAO dao=new UserOperDAO();

       //增加

//     User user = new User();

//     user.setUserName("範圍");

//     dao.add(user);

       

       //刪除

//     User user1=new User();

//     //刪除時必須給刪除對象的主鍵賦值

//     user1.setUserId(2);

//     dao.delUser(user1);

      

       //修改

//     User user2=new User();

//     user2.setUserId(5);

//     user2.setUserName("jack");

//     dao.updateUser(user2);

      

       //查詢

//     List<User> list=dao.getAllUser();

//     for (User user : list) {

//         System.out.println("用戶名稱是:"+user.getUserName());

//     }

      

}

 

 

延遲加載

    /**

     * 延遲加載

     *

     */

    public void lazyTest(){

       Session session=null;

       try {

           session=HibernateSessionFactory.getSession();

           User user=(User) session.load(User.class, 5);

           System.out.println("用戶id是:"+user.getUserId());

           System.out.println("*********************分割線************");

       //  System.out.println("用戶姓名是:"+user.getUserName());

       } catch (Exception e) {

           e.printStackTrace();

       }finally{

           HibernateSessionFactory.closeSession();

       }

    }

 

緩存事例

    /**

     * 緩存事例

     */

    public void cachTest(){

       //一級緩存

       Session session=null;

       try {

           session=HibernateSessionFactory.getSession();

//         User user=(User) session.load(User.class, 5);

//         System.out.println("用戶id是:"+user.getUserId());

//         System.out.println("*********************分割線************");

//         System.out.println("用戶姓名是:"+user.getUserName());

//         //一級緩存和session生命週期一致的緩存

//         //clear是將所有的一級緩存中的數據清空掉

//         //session.clear();

//        

//         //evict將指定的對象從一級緩存中清除掉

//         session.evict(user);

//         System.out.println("-----------二次查詢");

//             user=(User) session.load(User.class, 5);

//         System.out.println("*********************分割線************");

//         System.out.println("用戶姓名是:"+user.getUserName());

          

           //getload查詢區別?load在查詢不到數據時返回ObjectNotFound異常

               //get返回空指針異常

           //相同點:都支持一級緩存,都是按照id在進行查詢動作

//         User user=(User) session.get(User.class, 15);

//         System.out.println(user.getUserName());

          

          

           User user2=(User) session.load(User.class, 15);

           System.out.println(user2.getUserName());

       } catch (Exception e) {

           e.printStackTrace();       

       }finally{

           HibernateSessionFactory.closeSession();

       }

    }

 

list查詢和iterator查詢對比

    //list查詢和iterator查詢對比

    private void compListAndIterat() {

       Session session=null;

       try {

           session = HibernateSessionFactory.getSession();

           String sql="from User user";

           Query query=session.createQuery(sql);

          

           //查詢分頁方法

           //0代表第一條記錄的索引號

           query.setFirstResult(0);

           //3表示頁大小

           query.setMaxResults(3);

           //iterator方式查詢

//         Iterator iter= query.iterate();

//         while (iter.hasNext()) {

//            User user = (User) iter.next();

//            System.out.println("用戶名是:"+user.getUserName());

//         }

          

           //list方式查詢

           List<User> list=query.list();

           for(User user:list){

              System.out.println("用戶名:"+user.getUserName());

           }

          

       } catch (Exception e) {

           e.printStackTrace();

       }finally{

           HibernateSessionFactory.closeSession();

       }

    }

 

二級緩存測試

    /**

     * 二級緩存

     */

    public void secondCachTest(){

       Session session=null;

       try {

           //二級緩存及管理測試

//         session=HibernateSessionFactory.getSession();

//         User user= (User) session.load(User.class,3);

//         System.out.println("用戶名是:"+user.getUserName());

//         session.close();

//        

//         //清空二級緩存中的數據

//         SessionFactory sessionFactory=HibernateSessionFactory.getSessionFactory();

//         sessionFactory.evict(User.class,3);

//        

//        

//         System.out.println("**************我是分割線*******************");

//         session=HibernateSessionFactory.getSession();

//         user=(User)session.load(User.class, 3);

//         System.out.println("用戶名是:"+user.getUserName());

//         session.close();

          

          

           //一級緩存和二級緩存交互測試

           session = HibernateSessionFactory.getSession();

           session.setCacheMode(CacheMode.GET);

           User user=(User) session.load(User.class, 3);

           System.out.println("用戶名是:"+user.getUserName());

           session.close();

          

           System.out.println("*****我是分割線****");

           System.out.println("用戶名是:"+user.getUserName());

 

           session = HibernateSessionFactory.getSession();

           session.setCacheMode(CacheMode.GET);

            user=(User) session.load(User.class, 3);

           System.out.println("用戶名是:"+user.getUserName());

           session.close();

          

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

 

測試

    public static void main(String[] args) {

       UserOperDAO dao=new UserOperDAO();

       //增加

//     User user = new User();

//     user.setUserName("範圍");

//     dao.add(user);

      

       //修改

//     User user1=new User();

//     //刪除時必須給刪除對象的主鍵賦值

//     user1.setUserId(2);

//     dao.delUser(user1);

      

       //修改

//     User user2=new User();

//     user2.setUserId(5);

//     user2.setUserName("jack");

//     dao.updateUser(user2);

      

       //查詢

//     List<User> list=dao.getAllUser();

//     for (User user : list) {

//         System.out.println("用戶名稱是:"+user.getUserName());

//     }

      

//     //延遲加載測試

//     dao.lazyTest();

      

       //緩存測試

//     dao.cachTest();

      

       //iteatorlist集合比較

//     dao.compListAndIterat();

      

       //二級緩存測試

       dao.secondCachTest();

    }

 

二級緩存配置

Ehcache.xml(放在src目錄下)

<ehcache>

 

    <!-- Sets the path to the directory where cache .data files are created.

 

         If the path is a Java System Property it is replaced by

         its value in the running VM.

 

         The following properties are translated:

         user.home - User's home directory

         user.dir - User's current working directory

         java.io.tmpdir - Default temp file path -->

    <diskStorepath="c:\\hibernatecache"/>

 

 

    <!--Default Cache configuration. These will applied to cachesprogrammatically created through

        the CacheManager.

 

        The following attributes are required for defaultCache:

 

        maxInMemory       - Sets the maximum number of objects that will be created in memory

        eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element

                            is never expired.

        timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used

                            if the element is not eternal. Idle time is now - last accessed time

        timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used

                            if the element is not eternal. TTL is now - creation time

        overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache

                            has reached the maxInMemory limit.

 

        -->

    <defaultCache

        maxElementsInMemory="10000"

        eternal="false"

        timeToIdleSeconds="300"

        timeToLiveSeconds="120"

        overflowToDisk="true"

        />

</ehcache>

二級緩存配置詳解

<!--      maxElementsInMemory="10000" !--緩存最大數目 -- -->

<!--eternal="false"!-- 緩存是否持久 -- -->

<!--overflowToDisk="true"!-- 是否保存到磁盤,當系統當機時-- -->

<!--timeToIdleSeconds="300"!-- 當緩存閒置n秒後銷燬 -- -->

<!--timeToLiveSeconds="180"!-- 當緩存存活n秒後銷燬-- -->

 

 

一級二級緩存詳解

Hibernate一級緩存

1.        緩存是指一組數據的集合,這些數據儲存在其他地方,因爲獲取這些數據代價昂貴,所以把這些結果數據保存起來,讓下一次需要這些數據的時候直接使用,這就大大提高了系統效率。

2.        一級緩存很短和session的生命週期一致,一級緩存也叫session級或事務級緩存。

3.        哪些方法支持一級緩存及一級緩存的管理:                                     

      get()

      load()

      Iterate () (查詢實體對象)

      session.clear(),session.evict()(管理一級緩存)

 

Hibernate二級緩存

1.   二級緩存的生命週期和SessionFactory的生命週期一致,也稱SessionFactory級或進程級的緩存。

2.   因爲我們提到了,二級緩存是一個可插拔的緩存插件,所以二級緩存一定要先配置後使用。

3.   二級緩存的配置:

 將echcache.xml文件拷貝到src下

 開啓二級緩存,修改hibernate.cfg.xml文件

   <propertyname="hibernate.cache.

          use_second_level_cache">true</property>

 指定緩存產品提供商,修改hibernate.cfg.xml文件

   <propertyname="hibernate.cache.provider_class">

          org.hibernate.cache.EhCacheProvider</property>

 指定哪些實體類使用二級緩存(兩種方法)

          *在映射文件中採用<cache>標籤

          *在hibernate.cfg.xml文件中,採用<class-cache>標籤(<class-cache usage="read-only" class="com.ibm.pojo.User"/>

 


使用HibernateSessionFactory得到session實現CRUD

UserOperDAO.java

package com.ibm.dao;

 

import java.util.Iterator;

import java.util.List;

 

import org.hibernate.CacheMode;

import org.hibernate.Query;

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

 

import com.ibm.factory.HibernateSessionFactory;

import com.ibm.pojo.User;

 

public class UserOperDAO {

    public void add(User user){

       //定義sessiontran變量

       Session session=null;

       Transaction tran=null;

       try {

           //獲得session開啓事務(涉及數據修改操作時都需要開啓事務)

           session=HibernateSessionFactory.getSession();

           tran=session.beginTransaction();

           session.save(user);

          

           //提交事務數據入庫

           tran.commit();

          

       } catch (Exception e) {

           //事務回滾

           tran.rollback();

       }finally{

           //關閉session

           HibernateSessionFactory.closeSession();

       }

    }

   

   

    /**

     * 按照用戶id刪除用戶

     * @param user

     */

 

    public void delUser(User user){

       Session session= null;

       Transaction tran=null;

       try {

          

           session=HibernateSessionFactory.getSession();

           tran=session.beginTransaction();

      

           session.delete(user);

           tran.commit();

       } catch (Exception e) {

           tran.rollback();

       }finally{

           HibernateSessionFactory.closeSession();

       }

    }

   

   

    /**

     * 修改用戶

     * @param user

     */

    public void updateUser(User user){

      

       Session session= null;

       Transaction tran=null;

       try {

          

           session=HibernateSessionFactory.getSession();

           tran=session.beginTransaction();

          

           session.update(user);

           tran.commit();

       } catch (Exception e) {

           e.printStackTrace();

           tran.rollback();

       }finally{

           HibernateSessionFactory.closeSession();

       }

      

    }

   

    /**

     * 獲得用戶信息列表

     * @return list

     */

    public List<User> getAllUser(){

       List<User> list= null;

       Session session=null;

       try {

           session=HibernateSessionFactory.getSession();

           String sql="from User user";

           Query query=session.createQuery(sql);

           list=query.list();

           System.out.println("獲得結果集");

           for (User u : list) {

              System.out.println("用戶名是:"+u.getUserName());

           }

          

       } catch (Exception e) {

           e.printStackTrace();

       }

       return list;

    }

    }

   

    public static void main(String[] args) {

       UserOperDAO dao=new UserOperDAO();

       //增加

//     User user = new User();

//     user.setUserName("範圍");

//     dao.add(user);

       

       //刪除

//     User user1=new User();

//     //刪除時必須給刪除對象的主鍵賦值

//     user1.setUserId(2);

//     dao.delUser(user1);

      

       //修改

//     User user2=new User();

//     user2.setUserId(5);

//     user2.setUserName("jack");

//     dao.updateUser(user2);

      

       //查詢

//     List<User> list=dao.getAllUser();

//     for (User user : list) {

//         System.out.println("用戶名稱是:"+user.getUserName());

//     }

      

}

 

 

延遲加載

    /**

     * 延遲加載

     *

     */

    public void lazyTest(){

       Session session=null;

       try {

           session=HibernateSessionFactory.getSession();

           User user=(User) session.load(User.class, 5);

           System.out.println("用戶id是:"+user.getUserId());

           System.out.println("*********************分割線************");

       //  System.out.println("用戶姓名是:"+user.getUserName());

       } catch (Exception e) {

           e.printStackTrace();

       }finally{

           HibernateSessionFactory.closeSession();

       }

    }

 

緩存事例

    /**

     * 緩存事例

     */

    public void cachTest(){

       //一級緩存

       Session session=null;

       try {

           session=HibernateSessionFactory.getSession();

//         User user=(User) session.load(User.class, 5);

//         System.out.println("用戶id是:"+user.getUserId());

//         System.out.println("*********************分割線************");

//         System.out.println("用戶姓名是:"+user.getUserName());

//         //一級緩存和session生命週期一致的緩存

//         //clear是將所有的一級緩存中的數據清空掉

//         //session.clear();

//        

//         //evict將指定的對象從一級緩存中清除掉

//         session.evict(user);

//         System.out.println("-----------二次查詢");

//             user=(User) session.load(User.class, 5);

//         System.out.println("*********************分割線************");

//         System.out.println("用戶姓名是:"+user.getUserName());

          

           //getload查詢區別?load在查詢不到數據時返回ObjectNotFound異常

               //get返回空指針異常

           //相同點:都支持一級緩存,都是按照id在進行查詢動作

//         User user=(User) session.get(User.class, 15);

//         System.out.println(user.getUserName());

          

          

           User user2=(User) session.load(User.class, 15);

           System.out.println(user2.getUserName());

       } catch (Exception e) {

           e.printStackTrace();       

       }finally{

           HibernateSessionFactory.closeSession();

       }

    }

 

list查詢和iterator查詢對比

    //list查詢和iterator查詢對比

    private void compListAndIterat() {

       Session session=null;

       try {

           session = HibernateSessionFactory.getSession();

           String sql="from User user";

           Query query=session.createQuery(sql);

          

           //查詢分頁方法

           //0代表第一條記錄的索引號

           query.setFirstResult(0);

           //3表示頁大小

           query.setMaxResults(3);

           //iterator方式查詢

//         Iterator iter= query.iterate();

//         while (iter.hasNext()) {

//            User user = (User) iter.next();

//            System.out.println("用戶名是:"+user.getUserName());

//         }

          

           //list方式查詢

           List<User> list=query.list();

           for(User user:list){

              System.out.println("用戶名:"+user.getUserName());

           }

          

       } catch (Exception e) {

           e.printStackTrace();

       }finally{

           HibernateSessionFactory.closeSession();

       }

    }

 

二級緩存測試

    /**

     * 二級緩存

     */

    public void secondCachTest(){

       Session session=null;

       try {

           //二級緩存及管理測試

//         session=HibernateSessionFactory.getSession();

//         User user= (User) session.load(User.class,3);

//         System.out.println("用戶名是:"+user.getUserName());

//         session.close();

//        

//         //清空二級緩存中的數據

//         SessionFactory sessionFactory=HibernateSessionFactory.getSessionFactory();

//         sessionFactory.evict(User.class,3);

//        

//        

//         System.out.println("**************我是分割線*******************");

//         session=HibernateSessionFactory.getSession();

//         user=(User)session.load(User.class, 3);

//         System.out.println("用戶名是:"+user.getUserName());

//         session.close();

          

          

           //一級緩存和二級緩存交互測試

           session = HibernateSessionFactory.getSession();

           session.setCacheMode(CacheMode.GET);

           User user=(User) session.load(User.class, 3);

           System.out.println("用戶名是:"+user.getUserName());

           session.close();

          

           System.out.println("*****我是分割線****");

           System.out.println("用戶名是:"+user.getUserName());

 

           session = HibernateSessionFactory.getSession();

           session.setCacheMode(CacheMode.GET);

            user=(User) session.load(User.class, 3);

           System.out.println("用戶名是:"+user.getUserName());

           session.close();

          

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

 

測試

    public static void main(String[] args) {

       UserOperDAO dao=new UserOperDAO();

       //增加

//     User user = new User();

//     user.setUserName("範圍");

//     dao.add(user);

      

       //修改

//     User user1=new User();

//     //刪除時必須給刪除對象的主鍵賦值

//     user1.setUserId(2);

//     dao.delUser(user1);

      

       //修改

//     User user2=new User();

//     user2.setUserId(5);

//     user2.setUserName("jack");

//     dao.updateUser(user2);

      

       //查詢

//     List<User> list=dao.getAllUser();

//     for (User user : list) {

//         System.out.println("用戶名稱是:"+user.getUserName());

//     }

      

//     //延遲加載測試

//     dao.lazyTest();

      

       //緩存測試

//     dao.cachTest();

      

       //iteatorlist集合比較

//     dao.compListAndIterat();

      

       //二級緩存測試

       dao.secondCachTest();

    }

 

二級緩存配置

Ehcache.xml(放在src目錄下)

<ehcache>

 

    <!-- Sets the path to the directory where cache .data files are created.

 

         If the path is a Java System Property it is replaced by

         its value in the running VM.

 

         The following properties are translated:

         user.home - User's home directory

         user.dir - User's current working directory

         java.io.tmpdir - Default temp file path -->

    <diskStorepath="c:\\hibernatecache"/>

 

 

    <!--Default Cache configuration. These will applied to cachesprogrammatically created through

        the CacheManager.

 

        The following attributes are required for defaultCache:

 

        maxInMemory       - Sets the maximum number of objects that will be created in memory

        eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element

                            is never expired.

        timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used

                            if the element is not eternal. Idle time is now - last accessed time

        timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used

                            if the element is not eternal. TTL is now - creation time

        overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache

                            has reached the maxInMemory limit.

 

        -->

    <defaultCache

        maxElementsInMemory="10000"

        eternal="false"

        timeToIdleSeconds="300"

        timeToLiveSeconds="120"

        overflowToDisk="true"

        />

</ehcache>

二級緩存配置詳解

<!--      maxElementsInMemory="10000" !--緩存最大數目 -- -->

<!--eternal="false"!-- 緩存是否持久 -- -->

<!--overflowToDisk="true"!-- 是否保存到磁盤,當系統當機時-- -->

<!--timeToIdleSeconds="300"!-- 當緩存閒置n秒後銷燬 -- -->

<!--timeToLiveSeconds="180"!-- 當緩存存活n秒後銷燬-- -->

 

 

一級二級緩存詳解

Hibernate一級緩存

1.        緩存是指一組數據的集合,這些數據儲存在其他地方,因爲獲取這些數據代價昂貴,所以把這些結果數據保存起來,讓下一次需要這些數據的時候直接使用,這就大大提高了系統效率。

2.        一級緩存很短和session的生命週期一致,一級緩存也叫session級或事務級緩存。

3.        哪些方法支持一級緩存及一級緩存的管理:                                     

      get()

      load()

      Iterate () (查詢實體對象)

      session.clear(),session.evict()(管理一級緩存)

 

Hibernate二級緩存

1.   二級緩存的生命週期和SessionFactory的生命週期一致,也稱SessionFactory級或進程級的緩存。

2.   因爲我們提到了,二級緩存是一個可插拔的緩存插件,所以二級緩存一定要先配置後使用。

3.   二級緩存的配置:

 將echcache.xml文件拷貝到src下

 開啓二級緩存,修改hibernate.cfg.xml文件

   <propertyname="hibernate.cache.

          use_second_level_cache">true</property>

 指定緩存產品提供商,修改hibernate.cfg.xml文件

   <propertyname="hibernate.cache.provider_class">

          org.hibernate.cache.EhCacheProvider</property>

 指定哪些實體類使用二級緩存(兩種方法)

          *在映射文件中採用<cache>標籤

          *在hibernate.cfg.xml文件中,採用<class-cache>標籤(<class-cache usage="read-only" class="com.ibm.pojo.User"/>

 

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