Hibernate的常用API
Hibernate的核心類(lèi)和接口一共有6個(gè),分別為:Session、SessionFactory、
Transaction、Query、Criteria和Configuration。這6個(gè)核心類(lèi)和接口在任何開(kāi)發(fā)中都會(huì)用到
Configuration
它主要是用于加載hibernate配置.
Configuration config=new Configuration().config(); 主要加載src下的hibernate.cfg.xml
Configuration config=new Configuration();主要加載的src下的hibernate.properties
Configuration config=new Configuration().config(核心配置文件名稱);加載指定的名稱的配置文件
問(wèn)題:我們是在hibernate.cfg.xml文件中有xxx.hbm.xml文件的位置。如果我們使用的是hibernate.properties這種核心配置,它如何加載映射配置?
SessionFactory
首先SessionFactory它的獲取是通過(guò)Configuration得到。
// 1.創(chuàng)建Configuration來(lái)加載配置文件 Configuration config = new Configuration().configure();// 2.得到SessionFactory SessionFactory sessionFactory = config.buildSessionFactory();SessionFactory接口負(fù)責(zé)初始化Hibernate。它充當(dāng)數(shù)據(jù)存儲(chǔ)源的代理,并負(fù)責(zé)創(chuàng)建Session對(duì)象。這里用到了工廠模式。需要注意的是SessionFactory并不是輕量級(jí)的,因?yàn)橐话闱闆r下,一個(gè)項(xiàng)目通常只需要一個(gè)SessionFactory就夠,當(dāng)需要操作多個(gè)數(shù)據(jù)庫(kù)時(shí),可以為每個(gè)數(shù)據(jù)庫(kù)指定一個(gè)SessionFactory。
通過(guò)SessionFactory可以得到Session.
是從連接池中獲取一個(gè)連接。W
通過(guò)SessionFactory可以得到Session.
獲取一個(gè)與線程綁定的Session.
SessionFactory它不是輕量級(jí)的,不要頻繁創(chuàng)建關(guān)閉它。在一個(gè)項(xiàng)目中有一個(gè)SessionFactory就可以,通過(guò)SessionFactory來(lái)獲取Session進(jìn)行操作。
問(wèn)題:怎樣可以保證在一個(gè)項(xiàng)目中所使用的SessionFactory是同一個(gè)?
SessionFactory內(nèi)部還維護(hù)了一個(gè)連接池,如果我們要想使用c3p0連接池,應(yīng)該怎樣處理?
我們要導(dǎo)入c3p0的相關(guān)jar包
在hibernate/lib/options下有關(guān)于c3p0連接池jar包
在hibernate.cfg.xml文件中配置c3p0連接
可以查看etc/hibernate.properties中關(guān)于c3p0的配置
Session
Session接口負(fù)責(zé)執(zhí)行被持久化對(duì)象的CRUD操作(CRUD的任務(wù)是完成與數(shù)據(jù)庫(kù)的交流,包含了很多常見(jiàn)的SQL語(yǔ)句)。但需要注意的是Session對(duì)象是非線程安全的。
問(wèn)題:我們?nèi)绾谓鉀Qsession的安全問(wèn)題?
我們只需要在方法內(nèi)部來(lái)使用Session就可以。
問(wèn)題:Session如何獲取到?
SessionFactory.openSession() ; 相當(dāng)于直接通過(guò)SessionFactory創(chuàng)建一個(gè)新的Session,使用完成后要手動(dòng)調(diào)用close來(lái)關(guān)閉。
SessionFactory.getCurrentSession(); 獲取一個(gè)與線程綁定的Session,當(dāng)我們提交或事務(wù)回滾后會(huì)自動(dòng)關(guān)閉。
Session常用的方法:
save 保存對(duì)象
update 修改操作
delete刪除
get/load 根據(jù)id進(jìn)行查詢
savenOrUpdate 執(zhí)行save或update操作
createQuery()獲取一個(gè)Query對(duì)象
CreateSQLQUery()獲取一個(gè)可以操作sql的SQLQuery對(duì)象
createCriteria() 獲取一個(gè)Criteria它可以完成條件查詢
Transaction
Transaction接口主要用于管理事務(wù),它是hibernate的事務(wù)接口,對(duì)底層的事務(wù)進(jìn)行了封裝。使用它可以進(jìn)行事務(wù)操作。
commit 事務(wù)提交
rollback 事務(wù)回滾
問(wèn)題:如果獲取一個(gè)Transaction對(duì)象
Session.beginTransaction();
問(wèn)題:如果在程序中沒(méi)有開(kāi)啟事務(wù),是否存在事務(wù)?
有事務(wù),session的每一個(gè)操作就會(huì)開(kāi)啟一個(gè)事務(wù)。
默認(rèn)情況下事務(wù)是不會(huì)自動(dòng)提交的。
<!-- 用于設(shè)置事務(wù)提交方式 --><property name="hibernate.connection.autocommit">false</property>設(shè)置事務(wù)自動(dòng)提交.
<!-- 用于設(shè)置事務(wù)提交方式 --><property name="hibernate.connection.autocommit">true</property>Query
Query接口讓你方便地對(duì)數(shù)據(jù)庫(kù)及持久對(duì)象進(jìn)行查詢,它可以有兩種表達(dá)方式:HQL語(yǔ)言或本地?cái)?shù)據(jù)庫(kù)的SQL語(yǔ)句。Query經(jīng)常被用來(lái)綁定查詢參數(shù)、限制查詢記錄數(shù)量,并最終執(zhí)行查詢操作。
通過(guò)Query主要完成查詢操作.
我們通過(guò)Query可以執(zhí)行hql語(yǔ)句.
Query query=Session.createQuery(hql);
下面這個(gè)可以執(zhí)行sql語(yǔ)句
SQLQUery sqlQuery=Session.createSQLQuery(sql);
SQLQuery是Query的子.
查詢所有操作—使用HQL
public class HibernateTest3 {// 使用hql完成查詢所有操作@Testpublic void test1() {Session session = HibernateUtils.openSession();Query query = session.createQuery("from Customer");// from后面是類(lèi)名List<Customer> list = query.list();System.out.println(list);session.close();} }分頁(yè)查詢
// 分頁(yè)查詢 一頁(yè)顯示10條 要得到第二頁(yè)數(shù)據(jù) @Test public void test3() {Session session = HibernateUtils.openSession();session.beginTransaction();// 一頁(yè)顯示10條 要得到第二頁(yè)數(shù)據(jù)Query query = session.createQuery("from Customer");query.setFirstResult(10); // 開(kāi)始位置query.setMaxResults(10); // 本次查詢結(jié)果回顯的條數(shù)List<Customer> list = query.list();System.out.println(list);session.getTransaction().commit();session.close(); }查詢指定列信息
// 查詢指定列信息 @Test public void test4() {Session session = HibernateUtils.openSession();session.beginTransaction();// Query query = session.createQuery("select name,address from// Customer"); //這時(shí)我們得到的不在是Customer對(duì)象,而是Object[]// List<Object[]> list = query.list();Query query = session.createQuery("select new Customer(name,address) from Customer");List<Customer> list = query.list();// 我們可不可以得到List<Customer>,我們要想得到這個(gè)結(jié)果,可以使用hibernate中投影查詢。我們只需要在Customer類(lèi)中提供name與address做為參數(shù)的構(gòu)造方法System.out.println(list);session.getTransaction().commit();session.close(); }Select name ,address from Customer; 得到的是List< Object[]>結(jié)果
要想得到List< Customer>結(jié)果
1. 在Customer類(lèi)中生成以name,address為參數(shù)的構(gòu)造,注意,無(wú)參數(shù)構(gòu)造也要有。
2. Select new Customer(name,address) from Customer;
條件查詢
可以使用where關(guān)鍵字
// 條件查詢 @Test public void test5() {Session session = HibernateUtils.openSession();session.beginTransaction();// 查詢name=姓名0的信息// Query query = session.createQuery("from Customer where name=?");// //無(wú)名稱參數(shù)Query query = session.createQuery("from Customer where name=:myname"); // 有名稱參數(shù)// 要對(duì)參數(shù)進(jìn)行賦值// query.setParameter(0, "姓名0");// 對(duì)有名稱參數(shù)進(jìn)行賦值query.setParameter("myname", "姓名0");// List<Customer> list = query.list();// System.out.println(list);// 如果能保證結(jié)果就是唯一的,那么可以使用Customer c = (Customer) query.uniqueResult();System.out.println(c);session.getTransaction().commit();session.close(); }無(wú)名稱參數(shù) from Customer where name=?
對(duì)其進(jìn)行賦值 query.setParameter(0,”張三”)
有名稱參數(shù) from Customer where name=:myname;
對(duì)其進(jìn)行賦值 query.setParameter(“myname”,”李四”);
如果查詢結(jié)果可以保證就是唯一 的,我們可以使用
query. uniqueResult()來(lái)得到一個(gè)單獨(dú)對(duì)象.
執(zhí)行本地SQL
要想執(zhí)行本地sql
SQLQuery sqlQuery=session.createSqlQuery(String sql);
使用addEntity方法來(lái)將結(jié)果封裝到指定的對(duì)象中,如果不封裝,得到的是List< Object>
如果sql中有參數(shù),我們使用setParameter方法完成參數(shù)傳遞。
如果結(jié)果就是一個(gè)可以使用uniqueResult()來(lái)得到一個(gè)單獨(dú)對(duì)象。
Criteria
Criteria接口與Query接口非常類(lèi)似,允許創(chuàng)建并執(zhí)行面向?qū)ο蟮臉?biāo)準(zhǔn)化查詢。值得注意的是Criteria接口也是輕量級(jí)的,它不能在Session之外使用。
首先我想使用Criteria,必須得到Criteria
Criteria criteria=Session.createCriteria()
查詢所有操作
Session.createCriteria(實(shí)體類(lèi).class)得到一個(gè)Criteria對(duì)象,調(diào)用list查詢所有
分頁(yè)操作與query的方法一樣
setFirstResult() setMaxResults()
條件查詢
criteria.add(Restrictions.eq(“name”,”xxxx”));
criteria.add(Restrictions.or(Restricitons.eq(),Restrictions.list()…..))
我們使用Criteria可以更加面向?qū)ο笕ゲ僮?#xff0c;它非常適合進(jìn)行多條件組合查詢。
總結(jié)
以上是生活随笔為你收集整理的Hibernate的常用API的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Hibernate的配置详解
- 下一篇: Hibernate持久化类与主键生成策略