###

Berkeley DB Reference Guide:
  Java API Tutorial - Basic

### Retrieving database items

Retrieving information from the database is accomplished via the standard Java collections API. In the example, the Set.iterator method is used to iterate all Map.Entry objects for each store. All standard Java methods for retrieving objects from a collection may be used with the Java API.

The PrintDatabase.doWork method calls printEntries to print the map entries for each database store. It is called via the TransactionRunner class and was outlined in the previous section.

>     import com.sleepycat.bdb.collection.StoredIterator;
>     import java.util.Iterator;
>     ...
>     public class Sample
>     {
>         ...
>         private SampleViews views;
>         ...
>         private class PrintDatabase implements TransactionWorker
>         {
>             public void doWork()
>                 throws Exception
>             {
>                 printEntries("Parts",
>                               views.getPartEntrySet().iterator());
>                 printEntries("Suppliers",
>                               views.getSupplierEntrySet().iterator());
>                 printEntries("Shipments",
>                               views.getShipmentEntrySet().iterator());
>             }
>         }

>         private void printEntries(String label, Iterator iterator)
>         {
>         }
>     }

The Set of Map.Entry objects for each store is obtained from the SampleViews object. This set can also be obtained by calling the Map.entrySet method of a stored map.

The printEntries prints the map entries for any stored map. The Object.toString method of each key and value is called to obtain a printable representation of each object.

>         private void printEntries(String label, Iterator iterator)
>         {
>             System.out.println("\n--- " + label + " ---");
>             try
>             {
>                 while (iterator.hasNext())
>                 {
>                     Map.Entry entry = (Map.Entry) iterator.next();
>                     System.out.println(entry.getKey().toString());
>                     System.out.println(entry.getValue().toString());
>                 }
>             }
>             finally
>             {
>                 StoredIterator.close(iterator);
>             }
>         }

It is very important that all iterators for stored collections are explicitly closed. To ensure they are closed, a finally clause should be used as shown above. If the iterator is not closed, the underlying Berkeley DB cursor is not closed either and the store may become unusable.

If the iterator is cast to StoredIterator then its StoredIterator.close() method can be called. Or, as shown above, the static StoredIterator.close(java.util.Iterator) method can be called to avoid casting. The static form of this method can be called safely for any Iterator . If an iterator for a non-stored collection is passed, it is simply ignored.

This is one of a small number of behavioral differences between standard Java collections and stored collections. For a complete list see Using Stored Collections.

The output of the example program is shown below.

>     Adding Suppliers
>     Adding Parts
>     Adding Shipments

>     --- Parts ---
>     PartKey: number=P1
>     PartValue: name=Nut color=Red weight=[12.0 grams] city=London
>     PartKey: number=P2
>     PartValue: name=Bolt color=Green weight=[17.0 grams] city=Paris
>     PartKey: number=P3
>     PartValue: name=Screw color=Blue weight=[17.0 grams] city=Rome
>     PartKey: number=P4
>     PartValue: name=Screw color=Red weight=[14.0 grams] city=London
>     PartKey: number=P5
>     PartValue: name=Cam color=Blue weight=[12.0 grams] city=Paris
>     PartKey: number=P6
>     PartValue: name=Cog color=Red weight=[19.0 grams] city=London

>     --- Suppliers ---
>     SupplierKey: number=S1
>     SupplierValue: name=Smith status=20 city=London
>     SupplierKey: number=S2
>     SupplierValue: name=Jones status=10 city=Paris
>     SupplierKey: number=S3
>     SupplierValue: name=Blake status=30 city=Paris
>     SupplierKey: number=S4
>     SupplierValue: name=Clark status=20 city=London
>     SupplierKey: number=S5
>     SupplierValue: name=Adams status=30 city=Athens

>     --- Shipments ---
>     ShipmentKey: supplier=S1 part=P1
>     ShipmentValue: quantity=300
>     ShipmentKey: supplier=S2 part=P1
>     ShipmentValue: quantity=300
>     ShipmentKey: supplier=S1 part=P2
>     ShipmentValue: quantity=200
>     ShipmentKey: supplier=S2 part=P2
>     ShipmentValue: quantity=400
>     ShipmentKey: supplier=S3 part=P2
>     ShipmentValue: quantity=200
>     ShipmentKey: supplier=S4 part=P2
>     ShipmentValue: quantity=200
>     ShipmentKey: supplier=S1 part=P3
>     ShipmentValue: quantity=400
>     ShipmentKey: supplier=S1 part=P4
>     ShipmentValue: quantity=200
>     ShipmentKey: supplier=S4 part=P4
>     ShipmentValue: quantity=300
>     ShipmentKey: supplier=S1 part=P5
>     ShipmentValue: quantity=100
>     ShipmentKey: supplier=S4 part=P5
>     ShipmentValue: quantity=400
>     ShipmentKey: supplier=S1 part=P6
>     ShipmentValue: quantity=100

Copyright (c) 1996-2003 Sleepycat Software, Inc. - All rights reserved.