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