//讀取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來判定返回的標量值的實際順序和類型。
Hibernate基本增刪改查操作
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.