您的位置:首页 > 编程语言 > Java开发

java 从零开始,学习笔记之基础入门<Hibernate_实战演练>(三十七)

2014-02-12 09:01 866 查看
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());
          
           //get和load查询区别?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();
      
       //iteator和list集合比较
//     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());
          
           //get和load查询区别?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();
      
       //iteator和list集合比较
//     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"/>)

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
相关文章推荐