java 从零开始,学习笔记之基础入门<Hibernate_实战演练>(三十七)
2014-02-12 09:01
866 查看
Hibernate_实战演练
使用HibernateSessionFactory得到session实现CRUD
延迟加载
缓存事例
list查询和iterator查询对比
二级缓存测试
测试
二级缓存配置
一级二级缓存详解
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
延迟加载
缓存事例
list查询和iterator查询对比
二级缓存测试
测试
二级缓存配置
一级二级缓存详解
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>
|
一级二级缓存详解
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>
|
一级二级缓存详解
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"/>)
相关文章推荐
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<Hibernate_实战演练>(三十七)
- java 从零开始,学习笔记之基础入门<Struts2_实战演练(上)>(三十八)
- java 从零开始,学习笔记之基础入门<Hibernate_配置详解>(三十六)
- java 从零开始,学习笔记之基础入门<Struts2_实战演练(下)>(四十)
- java 从零开始,学习笔记之基础入门<Struts2_实战演练(中)>(三十九)
- java 从零开始,学习笔记之基础入门<IO流>(十八)
- java 从零开始,学习笔记之基础入门<Date类_Calendar类>(十七)
- java 从零开始,学习笔记之基础入门<javascript>(三十)
- java 从零开始,学习笔记之基础入门<Struts2_Spring_整合>(四十一)
- java 从零开始,学习笔记之基础入门<Switch>(八)
- java 从零开始,学习笔记之基础入门<反射>(二十九)
- java 从零开始,学习笔记之基础入门<SQL_Server>(二十一)
- java 从零开始,学习笔记之基础入门<数组>(七)
- java 从零开始,学习笔记之基础入门<对象_属性>(二)
- java 从零开始,学习笔记之基础入门<数组列表(ArrayList)>(九)
- [原]java专业程序代写(qq:928900200),学习笔记之基础入门<Hibernate_配置详解>(三十六)
- java 从零开始,学习笔记之基础入门<抽象类_接口_多态>(十三)
- java 从零开始,学习笔记之基础入门<运算符表达式和流程控制>(六)
- java 从零开始,学习笔记之基础入门<线程及实例分析>(十九)
- java 从零开始,学习笔记之基础入门<servlet_文件下载>(二十七)