在Hibernate中,session負責(zé)完成對象的持久化操作,而Hibernate Session與之Hibernate,相當(dāng)于JDBCConnection與之JDBC
1、初始化Hibernate配置管理類Configuration
Configuration config = new Configuration().configure();
利用CLASSPATH中的默認配置文件hibernate.cfg.xml構(gòu)建Configuration實例。
2、通過Configuration類實例創(chuàng)建Session的工廠類SessionFactory
SessionFactory sessionFactory = config.buildSessionFactory();
3、通過SessionFactory得到Session實例
session = sessionFactory.openSession();
通過這個Session實例,就可以對對象進行持久化操作
Configuration類負責(zé)管理Hibernate的配置信息,Hibernate運行時需要獲取一些底層實現(xiàn)的基本信息,包括:
數(shù)據(jù)庫URL
數(shù)據(jù)庫用戶名
數(shù)據(jù)庫用戶密碼
數(shù)據(jù)庫JDBC驅(qū)動類
數(shù)據(jù)庫適配器,用于對特定數(shù)據(jù)庫提供支持。
Configuration類一般只有在獲取SessionFactory時需要涉及,當(dāng)SessionFactory實例創(chuàng)建之后,由于配置信息已經(jīng)由hibernate綁定在返回的SessionFactory之中,因此一般情況下無需在對其操作。
如果不希望使用默認的hibernate.cfg.xml文件作為配置文件,還有如下方法:
File file = new File("c:\\sample\\myhiernate.xml");
Configuration config = new Configuration().configure(file);
SessionFactory負責(zé)創(chuàng)建Session實例:
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
SessionFactory一旦構(gòu)造完成,即被賦予特定的配置信息。如果需要使用基于改動后的config實例的SessionFactory,需要從config重新構(gòu)建一個SessionFactory實例。
SessionFactory中保存了對應(yīng)當(dāng)前數(shù)據(jù)庫配置的所有映射關(guān)系,同時也負責(zé)維護當(dāng)前的二級緩存和Statement Pool.由此可見,SessionFactory的創(chuàng)建過程必然非常復(fù)雜,代價高昂,而這也就意味著,我們應(yīng)該在系統(tǒng)設(shè)計中充分考慮到SessionFactory的重用策略。由于SessionFactory是線程安全的,可以多個線程并發(fā)調(diào)用,大多數(shù)情況下,一個應(yīng)用中針對一個數(shù)據(jù)庫共享一個SessionFactory實例即可。
Session作為貫穿Hibernate的持久化管理器核心,提供了眾多持久化方法,如save、update、delete,find等。通過這些方法,可透明的完成對象的增刪改查。同事,Hibernate Session的設(shè)計是非線程安全的,也就是說,一個Session實例同時只可一個線程使用,同一個Session實例的多線程并發(fā)調(diào)用將導(dǎo)致難以預(yù)知的錯誤
Configuration config = new Configuration().configure();
SessionFactory sessionFactory = config.buildSessionFactory();
Session session = sessionFactory.openSession();
Save操作:
//新增名為"Emma"的用戶記錄
TUser user = new TUser();
user.setName("Emma");
session.save(user);
Get操作:
//假設(shè)T_User表中存在id=1的記錄
TUser user = (TUser)session.get(TUser.class,new Integer(1));
delete操作:
//假設(shè)T_User表中存在id=1的記錄
TUser user = (TUser)session.get(TUser.class,new Integer(1));
session.delete(user);
//也可以通過HQL指定刪除條件(Hibernate2)
session.delete("from TUser where id=1");
//通過Query接口進行基于HQL的刪除操作(Hibernate3)
String hql = "delete TUser where id=1";
Query query = session.createQuery(hql);
query.executeUpdate();
Find(Hibernate2)操作
String hql = "form TUser where name='Erica'";
List userList = session.find(hql);
Hibernate3中的Session接口取消了find方法,我們必須通過Query或Criteria接口進行數(shù)據(jù)查詢
通過Query接口進行數(shù)據(jù)查詢:
String hql = "from TUser user where user.name like ?";
Query query = session.createQuery(hql);
query.setParameter(0,"Cartier");
List list = query.list();
Iterator it = list.iterator();
while(it.hasNext()){
TUser user = (TUser)it.next();
System.out.println(user.getName);
}
通過Criteria接口進行數(shù)據(jù)查詢:
Criteria criteria = session.createCriteria(TUser.class);
criteria.add(Expression.eq("name","Cartier"));
List list = criteria.list();
Iterator it = list.iterator();
while(it.hasNext()){
TUser user = (TUser)it.next();
System.out.println(user.getName());
}
Query面向HQL和Native SQL,而Criteria則提供了面向?qū)ο蟮牟樵兡J健?br />
posted on 2009-10-11 10:33
王永慶 閱讀(203)
評論(0) 編輯 收藏 所屬分類:
HIBERNATE