在應用程式中將OJB作為一個儲存層使用(三) (轉)
如果在product表中有10000條記錄,那麼從庫中獲得所有得記錄是一個很費時的操
作,每個記錄都必須新建一個,整個表都要讀入。在示例中,沒有考慮性
能問題,但是在一個實際的應用OJB的程式中,我們需要一個更有效的方法來獲得所有記
錄,如果你的程式不需要將整個表調入記憶體,那麼建議你使用getIteratorByQuery()方
法來返回Iterator而不返回Collection。
如果你需要遍歷較大的結果集,這種方法很實用。所有例項並不是一次性被建立,只是
在你"需要"的時候才分配記憶體。不再使用的儲存結構例項可以被garbage collecto
r重新回收。下面就是使用這種方法的例項程式碼:
public void apply()
{
System.out.println("The list of available products:");
// build a query that all s of Class Product,
// without any further criteria according to ODMG
// the Collection containing all
// instances of a persistent class is called "Extent"
Query query = new QueryByCriteria(Product.class, null);
try
{
// ask the broker to retrieve an Iterator
.util.Iterator iter = broker.getIteratorByQuery(query);
// now iterate over the result to print each product
while (iter.hasNext())
{
System.out.println(iter.next());
}
}
catch (Throwable t)
{
t.printStackTrace();
}
}
更詳細的說明可以參考PersistenceBroker JavaDoc和Query Doc。
儲存物件:
現在讓我們來看看UCEnterNewProduct類。它是這樣來工作的:首先,它建立一個新的對
象,然後要求使用者輸入新產品的相關資料(產品名稱,價格,庫存量)。這些資料被存
儲在新物件中。然後我們必須把新建立的物件存到儲存庫中。我們可以使用Persistenc
eBroker.store(Object ojb):
public void apply()
{
// this will be our new object
Product newProduct = new Product();
// now read in all relevant information and fill the new object:
System.out.println("please enter a new product");
String in = readLineWithMessage("enter name:");
newProduct.setName(in);
in = readLineWithMessage("enter price:");
newProduct.setPrice(Double.parseDouble(in));
in = readLineWithMessage("enter available stock:");
newProduct.setStock(Integer.parseInt(in));
// now perfopersistence operations
try
{
// 1. open transaction
broker.beginTransaction();
// 2. make the new object persistent
broker.store(newProduct);
broker.commitTransaction();
}
catch (PersistenceBrokerException ex)
{
// if something went wrong: rollback
broker.abortTransaction();
System.out.println(ex.getMessage());
ex.printStackTrace();
}
}
可能你已經發現了,我們並沒有新產品的主鍵id賦值。OJB能夠檢查到一個新產品的id沒
有被設定而自動制定一個唯一的id值。Id值的自動增長是在Repository-中定義的。
物件:
當使用者相編輯一個產品的時候(透過從目錄中選擇2),使用者必須輸入想編輯產品的id值
。因為程式沒有維護著產品物件表,必須首先透過PersistenceBroker從儲存庫中得
到一個產品。
透過PersistenceBroker選擇一個物件很簡單――我們必須首先建立一個QueryByCriter
ia物件。QueryByCriteria物件含有使用者輸入的id值資訊,你可能發祥我們並不需要產品
的其他資訊,我們只需要對productId設定過濾器就行了。直接構建一個Criteria物件可
以讓你申明一個複雜的條件如productId值必須大於2小於5。複雜的查詢在本文的後面將
介紹。
一旦透過broker.getObjectByQuery(query)方法獲得了Product物件,接下來就能夠透過
使用者輸入來修改物件屬性,然後透過broker.store(toBeEdited)將修改後的結構存入存
儲庫。下面是UCEditProduct類的有關程式碼:
public void apply()
{
String in = readLineWithMessage("Edit Product with id:");
int id = Integer.parseInt(in);
// We do not have a reference to the selected Product.
// So first we have to lookup the object,
// we do this by a query by example (QBE):
// 1. build an example object with matching primary key values:
Product example = new Product();
example.setId(id);
// 2. build a QueryByCriteria from this sample instance:
Query query = new QueryByCriteria(example);
try
{
// 3. start broker transaction
broker.beginTransaction();
// 4. lookup the product specified by the QBE
Product toBeEdited = (Product) broker.getObjectByQuery(query);
// 5. edit the existing entry
System.out.println("please edit the product entry");
in = readLineWithMessage(
"enter name (was " + toBeEdited.getName() + "):");
toBeEdited.setName(in);
in = readLineWithMessage(
"enter price (was " + toBeEdited.getPrice() + "):");
toBeEdited.setPrice(Double.parseDouble(in));
in = readLineWithMessage(
"enter available stock (was " +
toBeEdited.getStock()+ "):");
toBeEdited.setStock(Integer.parseInt(in));
// 6. now ask broker to store the edited object
broker.store(toBeEdited);
// 7. commit transaction
broker.commitTransaction();
}
catch (Throwable t)
{
// rollback in case of errors
broker.abortTransaction();
t.printStackTrace();
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10748419/viewspace-963448/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- FRAM作為程式碼儲存器應用中的單晶片解決方案晶片
- OceanBase 儲存層程式碼解讀(三)巨集塊儲存格式
- 在快應用中整合華為AGC雲端儲存服務GC
- 從三個層面認識SRAM儲存器
- Laravel 使用 Elasticsearch 作為日誌儲存LaravelElasticsearch
- 使用NFS作為Glance儲存後端NFS後端
- 將座標系統儲存為一個檔案.prj
- OceanBase 儲存層程式碼解讀(一)引言
- Unite Mac,將網站轉換為應用程式Mac網站
- 將網站轉化為應用程式Unite for Mac網站Mac
- k8s使用rbd作為儲存K8S
- 在風能和太陽能儲存中的新應用
- 如何將html程式碼儲存為Pdf檔案HTML
- 將網站轉化為應用程式:Unite mac啟用版網站Mac
- 一個伺服器輕鬆儲存上億資料,TDengine 在北京智慧建築邊緣儲存的應用伺服器
- 使用MATLAB compiler將matlab程式轉成獨立應用程式exeMatlabCompile
- Taro:將已有微信小程式轉換為多端應用微信小程式
- Coherence X for mac(將網站轉變為Mac應用程式)Mac網站
- OceanBase 儲存層程式碼解讀(二)微塊儲存格式
- 子元件獲取父元件的值,將這個值作為狀態值儲存元件
- 分層架構在資料倉儲的應用架構
- Wpf應用程式作為一個單獨的可執行檔案
- 編寫一個程式,對一個整型陣列的元素求和,結果使用全域性變數sum儲存,另外對陣列元素中的奇數求和,結果使用區域性變數sum儲存,在主程式將兩個結果輸出。陣列變數
- Angular 如何為多個專案使用單一儲存倉庫Angular
- 還在佔用儲存的程式lsof grep deleted;delete
- 使用CoreRT將.NET Core釋出為Native應用程式
- 在實際應用中,儲存虛擬化有什麼功能呢?
- 使用 NSUserDefaults 儲存字典的一個坑
- Unite :將網站轉換為應用程式 支援M1網站
- Coherence X for Mac,將網站轉換為應用程式軟體Mac網站
- Serverless 使用阿里雲OOS將http檔案轉存到物件儲存Server阿里HTTP物件
- Redis In Action 筆記(六):使用 Redis 作為應用程式元件Redis筆記元件
- 將一個Collection轉為陣列陣列
- 如何構建通用儲存中間層
- JuiceFS 在多雲端儲存架構中的應用 | 深勢科技分享UI架構
- Unite for mac(將網站轉化為應用程式) v4.0.3啟用版Mac網站
- Unite for mac(將網站轉化為應用程式) v4.0.4啟用版Mac網站
- iframe 在 SAP 三款產品中的三個應用場景
- Docker容器:將帶UI的程式直接轉為Web應用,so easyDockerUIWeb