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>
|
一級二級緩存詳解
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"/>)