在應用程式中將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/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 在應用程式中將OJB作為一個儲存層使用(一) (轉)
- 在應用程式中將OJB作為一個儲存層使用(二) (轉)
- 在應用程式中將OJB作為一個儲存層使用(四) (轉)
- 在應用程式中將OJB作為一個儲存層使用(六) (轉)
- 在應用程式中將OJB作為一個儲存層使用(五) (轉)
- FRAM作為程式碼儲存器應用中的單晶片解決方案晶片
- 在.Net中將MailMessage儲存為本地eml檔案(轉)AI
- 將Oracle作為NoSQL文件儲存OracleSQL
- 在vue中,localStorage本地儲存應用。Vue
- 將FileSystem轉換為ASM儲存ASM
- OceanBase 儲存層程式碼解讀(三)巨集塊儲存格式
- Linux系統在儲存技術中的幾項應用(轉)Linux
- 從三個層面認識SRAM儲存器
- Laravel 使用 Elasticsearch 作為日誌儲存LaravelElasticsearch
- 使用NFS作為Glance儲存後端NFS後端
- 在風能和太陽能儲存中的新應用
- 如何在安卓應用程式中儲存資料安卓
- Attribute在.NET程式設計中的應用(三) (轉)程式設計
- 將座標系統儲存為一個檔案.prj
- 在ADO.NET中使用Oracle儲存程式(轉)Oracle
- OJB查詢(一) (轉)
- k8s使用rbd作為儲存K8S
- 在快應用中整合華為AGC雲端儲存服務GC
- 第三層交換技術及在VLAN子網規劃中的應用(轉)
- 使用data.js作為統一的資料儲存中心JS
- 如何將複雜的應用邏輯從儲存過程移植到業務層儲存過程
- 用Servlet開發企業級三層Web應用(一) (轉)ServletWeb
- Unite Mac,將網站轉換為應用程式Mac網站
- 將網站轉化為應用程式Unite for Mac網站Mac
- 儲存網路在企業應用中的安全隱患
- 三層儲存技術保障雲服務的儲存安全
- Attribute在.net程式設計中的應用(一) (轉)程式設計
- 雙緩衝在畫板程式中的應用(一) (轉)
- 在一個WEB應用程式中如何實現使用者上下線啊Web
- OceanBase 儲存層程式碼解讀(一)引言
- 如何將html程式碼儲存為Pdf檔案HTML
- 一個伺服器輕鬆儲存上億資料,TDengine 在北京智慧建築邊緣儲存的應用伺服器
- Taro:將已有微信小程式轉換為多端應用微信小程式