java JDBM2 的几个简单实例详解编程语言

JDBM2 提供了 HashMap 和 TreeMap 的磁盘存储功能,简单易用,用于持久化数据。特别适合用于嵌入到其他应用程序中。

HelloWorld.java

import java.io.IOException; 
 
import jdbm.PrimaryTreeMap; 
import jdbm.RecordManager; 
import jdbm.RecordManagerFactory; 
 
/** 
 * This program demonstrates basic JDBM usage. 
 *  
 * @author Jan Kotek 
 * 
 */ 
public class HelloWorld { 
        public static void main(String[] args) throws IOException { 
 
                /** create (or open existing) database */ 
                String fileName = "helloWorld"; 
                RecordManager recMan = RecordManagerFactory.createRecordManager(fileName); 
 
                /** Creates TreeMap which stores data in database.   
                 *  Constructor method takes recordName (something like SQL table name)*/ 
                String recordName = "firstTreeMap"; 
                PrimaryTreeMap<Integer,String> treeMap = recMan.treeMap(recordName);  
 
                /** add some stuff to map*/ 
                treeMap.put(1, "One"); 
                treeMap.put(2, "Two"); 
                treeMap.put(3, "Three"); 
 
                System.out.println(treeMap.keySet()); 
                // > [1, 2, 3] 
 
                /** Map changes are not persisted yet, commit them (save to disk) */ 
                recMan.commit(); 
 
                System.out.println(treeMap.keySet()); 
                // > [1, 2, 3] 
 
                /** Delete one record. Changes are not commited yet, but are visible. */ 
                treeMap.remove(2); 
 
                System.out.println(treeMap.keySet()); 
                // > [1, 3] 
 
                /** Did not like change. Roolback to last commit (undo record remove). */ 
                recMan.rollback(); 
 
                /** Key 2 was recovered */ 
                System.out.println(treeMap.keySet()); 
                // > [1, 2, 3] 
 
                /** close record manager */ 
                recMan.close(); 
 
        } 
}

HelloWorld2.java

import java.io.IOException; 
import java.io.Serializable; 
 
import jdbm.PrimaryStoreMap; 
import jdbm.RecordManager; 
import jdbm.RecordManagerFactory; 
import jdbm.SecondaryKeyExtractor; 
import jdbm.SecondaryTreeMap; 
 
/** 
 * More advanced example to demonstrate Map usage. 
 *  
 * @author Jan Kotek 
 * 
 */ 
public class HelloWorld2 { 
 
        static class Person implements Serializable{ 
 
                /** never forget this, very important for serialization*/ 
                private static final long serialVersionUID = -3321252970661193623L; 
                final String name;               
                final String town; 
                final String country; 
 
                /** some data to object class bigger */ 
                final byte[] balast = new byte[1024]; 
 
                public Person(String name, String town, String country) { 
                        this.name = name; 
                        this.town = town; 
                        this.country = country;                  
                } 
 
                @Override 
                public String toString() { 
                        return "Person [name=" + name + ", town=" + town + ", country=" + country + "]"; 
                } 
 
                /** snip getters and setters*/ 
 
        } 
 
        public static void main(String[] args) throws IOException { 
                RecordManager recman = RecordManagerFactory. 
                                createRecordManager("HelloWorld2"); 
                /** 
                 * Create primary map which is used to store records.   
                 * Data can be also stored in PrimaryTreeMap and PrimaryHashMap, 
                 * but this is more efficient for large objects.  
                 */ 
                PrimaryStoreMap<Long,Person> main = recman.storeMap("recman"); 
 
                /** 
                 * Create secondary index which points to Person name. 
                 * SecondaryMap is readonly, it is updated by PrimaryMap. 
                 *   
                 * Secondary map have three types,  
                 * first is type of secondary index (string), 
                 * second and third are copied from primary map. 
                 */ 
                SecondaryTreeMap<String, Long, Person> nameIndex = main.secondaryTreeMap("nameIndex", 
                                                new SecondaryKeyExtractor<String, Long, Person>() { 
                                                        public String extractSecondaryKey(Long key, Person value) { 
                                                                return value.name; 
                                                        }                                        
                                                }); 
 
                /** 
                 * Another secondary map which points to town and country 
                 */ 
                SecondaryTreeMap<String, Long, Person> townIndex = main.secondaryTreeMap("townIndex", 
                                new SecondaryKeyExtractor<String, Long, Person>() { 
                                        public String extractSecondaryKey(Long key, Person value) { 
                                                /** 
                                                 * Note format of map key 
                                                 */ 
                                                return value.country+"/"+value.town; 
                                        }                                        
                                }); 
 
                /** 
                 * And very simple index of Evil family members 
                 */ 
                SecondaryTreeMap<Boolean, Long, Person> evilIndex = main.secondaryTreeMap("evilIndex", 
                                new SecondaryKeyExtractor<Boolean, Long, Person>() { 
                                        public Boolean extractSecondaryKey(Long key, Person value) { 
                                                return value.name.contains("Evil"); 
                                        }                                        
                                }); 
 
                /** 
                 * Clean up, if this example was run more times. 
                 * All secondary indexes are updated automatically.  
                 */ 
                main.clear(); 
 
                /**  
                 * Add some data.  
                 * StoreMap does not have usuall 'put' method. 
                 * Key is generated by Store, so use 'putValue' instead  
                 */ 
                main.putValue(new Person("James Bond","London","UK")); 
                main.putValue(new Person("Austin Powers","London","UK")); 
                main.putValue(new Person("Dr Evil","Vulcano Island","Ocean")); 
                main.putValue(new Person("Scott Evil","Vulcano Island","Ocean"));                
                main.putValue(new Person("Vanessa Kensington","London","UK")); 
                main.putValue(new Person("Alotta Fagina","Las Vegas","USA")); 
 
                /** 
                 * Persists inserted values 
                 */ 
                recman.commit(); 
 
                /** 
                 * Get persons with name Austin Powers 
                 */ 
                System.out.println(); 
                System.out.println("Austin Powers: "); 
                for(Person person:nameIndex.getPrimaryValues("Austin Powers")){ 
                        System.out.println("  "+person); 
                } 
 
                /** 
                 * Print all Persons who lives on Vulcano Island. 
                 * First we must obtain key from primary map, 
                 * then  
                 */ 
                System.out.println(); 
                System.out.println("Persons on Vulcano Island: "); 
                for(Person person:townIndex.getPrimaryValues("Ocean/Vulcano Island")){ 
                        System.out.println("  "+person); 
                } 
 
                /** 
                 * Get everyone who is Evil 
                 */ 
                System.out.println(); 
                System.out.println("Evil family: "); 
                for(Person person:evilIndex.getPrimaryValues(true)){ 
                        System.out.println("  "+person); 
                }                
 
                recman.close(); 
        } 
}

HugeData.java

import java.io.IOException; 
 
import jdbm.PrimaryTreeMap; 
import jdbm.RecordManager; 
import jdbm.RecordManagerFactory; 
 
/**  
 *  
 * This examples generates huge map of data.  
 * It inserts 10 000 000 records, it takes about 10 minutes to finish.  
 *  
 * @author Jan Kotek 
 * 
 */ 
public class HugeData { 
        public static void main(String[] args) throws IOException { 
 
                /** open db */ 
        RecordManager recman = RecordManagerFactory.createRecordManager( "hugedata");         
        PrimaryTreeMap<Long, String> m = recman.treeMap("hugemap"); 
 
        /** insert 1e7 records */ 
        for(long i = 0;i<1e8;i++){ 
                m.put(i, "aa"+i);         
                if(i%1e5==0){ 
                        /** Commit periodically, otherwise program would run out of memory */                     
                        recman.commit(); 
                        System.out.println(i);                   
                } 
 
        } 
 
        recman.commit(); 
        recman.close(); 
        System.out.println("DONE"); 
 
        } 
}

Persons1.java

import java.io.IOException; 
import java.io.Serializable; 
 
import jdbm.PrimaryTreeMap; 
import jdbm.RecordManager; 
import jdbm.RecordManagerFactory; 
import jdbm.SecondaryKeyExtractor; 
import jdbm.SecondaryTreeMap; 
 
/** 
 * Demonstrates more advanced usage of JDBM: 
 * Secondary maps, 1:N relations. 
 *  
 * @author Jan Kotek 
 * 
 */ 
public class Persons1 { 
 
        static class Person implements Serializable{ 
                /** field used for person identification (primary key)**/ 
                String name; 
                /** persisted with Person (embedded field in JPA terms) **/ 
                Address adress; 
                /** N:1 relation */ 
                String fatherName; 
 
                /** constructor, getters and setters are excluded for simplicity */ 
                public Person(String name, Address adress,String fatherName) { 
                        super(); 
                        this.name = name; 
                        this.adress = adress; 
                        this.fatherName = fatherName; 
                } 
 
                public String toString(){ 
                        return "Person["+name+"]"; 
                } 
 
                public int hashCode() { 
                        return name == null? 0 : name.hashCode(); 
                } 
 
                public boolean equals(Object obj) { 
                        if (this == obj) 
                                return true; 
                        if (obj == null || !(obj instanceof Person)) 
                                return false; 
                        Person other = (Person) obj; 
                        if (name == null) { 
                                if (other.name != null) 
                                        return false; 
                        } else if (!name.equals(other.name)) 
                                return false; 
                        return true; 
                } 
 
        } 
 
        static class Address implements Serializable{ 
                String streetName; 
                String town; 
                String country; 
 
                public Address(String streetName, String town, String country) { 
                        super(); 
                        this.streetName = streetName; 
                        this.town = town; 
                        this.country = country; 
                } 
 
        } 
 
        public static void main(String[] args) throws IOException { 
                //init Record Manager and dao 
                RecordManager recman = RecordManagerFactory.createRecordManager("persons1"); 
 
                PrimaryTreeMap<String,Person> personsByName = recman.treeMap("personsByName"); 
 
                SecondaryTreeMap<String, String, Person> personsByTown =  
                                personsByName.secondaryTreeMap("personsByTown",  
                                                new SecondaryKeyExtractor<String, String, Person>() { 
                                                        public String extractSecondaryKey(String key,Person value) { 
                                                                return value.adress.town; 
                                                        } 
                                                }); 
 
                //create a few persons 
                Person patrick = new Person("Patrick Moore",  
                                new Address("First street", "Athlone","Ireland"), 
                                null); 
                personsByName.put(patrick.name, patrick); 
 
                Person jack = new Person("Jack Moore",  
                                new Address("First street", "Athlone","Ireland"), 
                                patrick.name);   
                personsByName.put(jack.name, jack); 
 
                Person paul = new Person("Paul Moore",  
                                new Address("Shop street", "Galway","Ireland"), 
                                patrick.name); 
                personsByName.put(paul.name, paul       ); 
 
                System.out.println("Number of persons: "+personsByName.size()); 
 
                System.out.println("Persons with name Patrick Moore: "+personsByName.get("Patrick Moore")); 
                System.out.println("Name of persons living in Galway: "+personsByTown.get("Galway")); 
                System.out.println("Father of Paul Moore: "+ 
                                personsByName.get( 
                                                personsByName.get("Paul Moore").fatherName 
                                        )); 
 
        } 
 
}

Persons2.java

import java.io.DataInputStream; 
import java.io.DataOutputStream; 
import java.io.IOException; 
import java.io.Serializable; 
import java.util.ArrayList; 
import java.util.Iterator; 
import java.util.List; 
import jdbm.InverseHashView; 
import jdbm.PrimaryStoreMap; 
import jdbm.RecordManager; 
import jdbm.RecordManagerFactory; 
import jdbm.SecondaryKeyExtractor; 
import jdbm.SecondaryTreeMap; 
import jdbm.Serializer; 
import jdbm.SerializerInput; 
import jdbm.SerializerOutput; 
import jdbm.helper.Serialization; 
/** 
* Demonstrates more advanced usage of JDBM: 
* Secondary maps, 1:N relations. 
*  
* @author Jan Kotek 
* 
*/ 
public class Persons2 { 
static class Person implements Serializable{ 
/** field used for person identification (primary key)**/ 
String name; 
/** persisted with Person (embedded field in JPA terms) **/ 
Address adress; 
/** N:1 relation */ 
Person father; 
/** constructor, getters and setters are excluded for simplicity */ 
public Person(String name, Address adress,Person father) { 
super(); 
this.name = name; 
this.adress = adress; 
this.father = father; 
} 
public String toString(){ 
return "Person["+name+"]"; 
} 
public int hashCode() { 
return name == null? 0 : name.hashCode(); 
} 
public boolean equals(Object obj) { 
if (this == obj) 
return true; 
if (obj == null || !(obj instanceof Person)) 
return false; 
Person other = (Person) obj; 
if (name == null) { 
if (other.name != null) 
return false; 
} else if (!name.equals(other.name)) 
return false; 
return true; 
} 
} 
static class Address implements Serializable{ 
String streetName; 
String town; 
String country; 
public Address(String streetName, String town, String country) { 
super(); 
this.streetName = streetName; 
this.town = town; 
this.country = country; 
} 
} 
/** dao object which handles Person persistence */ 
static class PersonDao implements Serializer<Person>{ 
/**  
* This is map in which persons are inserted in.  
* Key is number assigned by store (recordId).  
* You should prefer recordId as primary index, it is more flexible.    
*/ 
PrimaryStoreMap<Long,Person> persons; 
/** Inverse view on person, it helps to find recordId which belongs to person */ 
InverseHashView<        Long, Person> personsInverse; 
/**  
* Secondary view on persons, which identifies person by name.  
* This map is readonly, it is autoupdated by JDBM as primary map changes.  
* Key is name, value is recordId ( key from primary map),  
* third parameter is Person (value from primary map) 
*/ 
SecondaryTreeMap<String, Long, Person> personsByName; 
/**  
* Secondary view on persons, which identifies person its town  
* This map is readonly, it is autoupdated by JDBM as primary map changes.  
* Key is town name extracted from primary table,  
* value is recordId ( key from primary map),  
* third parameter is town from  (value from primary map)  
*/ 
SecondaryTreeMap<String, Long, Person> personsByTown; 
public PersonDao(RecordManager recman) { 
persons = recman.storeMap("persons",this); 
personsInverse = persons.inverseHashView("personsInverse"); 
personsByName = persons.secondaryTreeMap("personsByName", 
new SecondaryKeyExtractor<String, Long, Person>() { 
public String extractSecondaryKey(Long key, Person value) { 
return value.name; 
}}); 
personsByTown = persons.secondaryTreeMap("personsByTown", 
new SecondaryKeyExtractor<String, Long, Person>() { 
public String extractSecondaryKey(Long key, Person value) { 
if(value.adress == null) 
return null; 
return value.adress.town; 
}}); 
} 
public Person personByRecordId(Long recid){ 
return persons.get(recid); 
} 
public Person personByName(String name){ 
if(!personsByName.containsKey(name)) 
return null; 
Iterator<Long> iter = personsByName.get(name).iterator(); 
if(iter.hasNext()) 
return personsByName.getPrimaryValue(iter.next()); 
else  
return null; 
} 
public Iterable<Person> personsByTown(String name){ 
List<Person> ret = new ArrayList<Person>();  
for(Long l: personsByTown.get(name)){ 
ret.add(personsByTown.getPrimaryValue(l)); 
} 
return ret; 
} 
public void insertPerson(Person person){ 
Long recid = personsInverse.findKeyForValue(person); 
if(recid == null) 
persons.putValue(person); 
else 
persons.put(recid, person); 
} 
public Person deserialize(SerializerInput in) throws IOException, ClassNotFoundException { 
String name = in.readObject(); 
Address address = in.readObject(); 
Person father = persons.get(in.readObject()); 
Person p = new Person(name,address,father);                      
return p; 
} 
public void serialize(SerializerOutput out, Person obj) 
throws IOException { 
out.writeObject(obj.name); 
out.writeObject(obj.adress); 
out.writeObject(findOrPersistPerson(obj.father)); 
} 
protected Long findOrPersistPerson(Person person){ 
if(person == null) 
return null; 
Long recid = personsInverse.findKeyForValue(person); 
if(recid == null) 
recid = persons.putValue(person); 
return recid; 
} 
} 
public static void main(String[] args) throws IOException { 
//init Record Manager and dao 
RecordManager recman = RecordManagerFactory.createRecordManager("persons2"); 
PersonDao dao = new PersonDao(recman); 
//create a few persons 
Person patrick = new Person("Patrick Moore",  
new Address("First street", "Athlone","Ireland"), 
null); 
Person jack = new Person("Jack Moore",  
new Address("First street", "Athlone","Ireland"), 
patrick); 
Person paul = new Person("Paul Moore",  
new Address("Shop street", "Galway","Ireland"), 
patrick); 
//now store all this stuff               
dao.insertPerson(jack); 
dao.insertPerson(patrick); 
dao.insertPerson(paul); 
System.out.println("Number of persons: "+dao.persons.size()); 
System.out.println("Persons with name Patrick Moore: "+dao.personByName("Patrick Moore")); 
System.out.println("Persons living in Galway: "+dao.personsByTown("Galway")); 
System.out.println("Father of Paul Moore: "+dao.personByName("Paul Moore").father); 
} 
}

原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/10478.html

(0)
上一篇 2021年7月19日
下一篇 2021年7月19日

相关推荐

发表回复

登录后才能评论