Hibernate基本增刪改查操作

//讀取hibernate配置文件 持久化操作
public static void main(String[] args) {
		//創建一個configuration對象(實例)  作用:啓動Hibernate加載hibernate.cfg.xml文件
		Configuration cfg=new Configuration().configure("hibernate.cfg.xml");
		//創建sessionfactory 將Configura的配置信息拷貝到sessionfactory緩存中
		SessionFactory fy=cfg.buildSessionFactory();
		//獲取session對象(相當於獲取一個連接Connection)
		Session session=fy.openSession();
		//執行增、刪、改、使用事務
		session.beginTransaction();//開始事務
		session.save(obj);//執行保存操作
		session.delete(obj);//刪除
		session.update(obj);//修改
		session.getTransaction().commit();//提交事務
		session.close();//關閉session(關閉連接)
		//session.getTransaction().rollback();//回滾事務
		//(注意)查詢不需要事務
		session.get(Class.class,1);//查詢單個第一個爲類,第二個爲條件
		session.createQuery("from Detp");//Detp爲程序中的類如果有屬性也是程序中的屬性(查詢所有)
               
 }

hibernate批量更新操作

使用Hibernate將 100 000 條記錄插入到數據庫的一個很自然的做法可能是這樣的

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
}
tx.commit();
session.close();

這段程序大概運行到 50 000 條記錄左右會失敗並拋出 內存溢出異常(OutOfMemoryException) 。 這是因爲 Hibernate 把所有新插入的 客戶(Customer)實例在 session級別的緩存區進行了緩存的緣故。

我們會在本章告訴你如何避免此類問題。首先,如果你要執行批量處理並且想要達到一個理想的性能, 那麼使用JDBC的批量(batching)功能是至關重要。將JDBC的批量抓取數量(batch size)參數設置到一個合適值 (比如,10-50之間):

hibernate.jdbc.batch_size 20

注意,假若你使用了identiy標識符生成器,Hibernate在JDBC級別透明的關閉插入語句的批量執行。

你也可能想在執行批量處理時關閉二級緩存:

hibernate.cache.use_second_level_cache false

但是,這不是絕對必須的,因爲我們可以顯式設置CacheMode來關閉與二級緩存的交互。

批量插入(Batch inserts)

如果要將很多對象持久化,你必須通過經常的調用 flush() 以及稍後調用 clear() 來控制第一級緩存的大小。

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
   
for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size //20,與JDBC批量設置相同
        //flush a batch of inserts and release memory:
        //將本批插入的對象立即寫入數據庫並釋放內存
        session.flush();
        session.clear();
    }
}
   
tx.commit();
session.close();

 批量更新(Batch updates)

此方法同樣適用於檢索和更新數據。此外,在進行會返回很多行數據的查詢時, 你需要使用 scroll() 方法以便充分利用服務器端遊標所帶來的好處。

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
   
ScrollableResults customers = session.getNamedQuery("GetCustomers")
    .setCacheMode(CacheMode.IGNORE)
    .scroll(ScrollMode.FORWARD_ONLY);
int count=0;
while ( customers.next() ) {
    Customer customer = (Customer) customers.get(0);
    customer.updateStuff(...);
    if ( ++count % 20 == 0 ) {
        //flush a batch of updates and release memory:
        session.flush();
        session.clear();
    }
}
   
tx.commit();
session.close();

 使用SQLQuery
 對原生SQL查詢執行的控制是通過SQLQuery接口進行的,通過執行Session.createSQLQuery()獲取這個接口。
 最基本的SQL查詢就是獲得一個標量(數值)的列表。
 sess.createSQLQuery("SELECT * FROM CATS").list();
 sess.createSQLQuery("SELECT ID, NAME, BIRTHDATE FROM CATS").list();
 它們都將返回一個Object數組(Object[])組成的List,數組每個元素都是CATS表的一個字段值。Hibernate會使用ResultSetMetadata來判定返回的標量值的實際順序和類型。




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章