与常用的关系数据库相比,BerkeleyDB更像是一种内存数据库,可嵌入到系统应用程序,手机甚至是路由器中。由于大部分操作在缓存中进行,因此访问速度非常高效。
BerkeleyDB JE是由纯Java语言编写的,数据主要缓存在JVM当中。BerkeleyDB JE对开发人员提供了两套API操作:分别是DPL API和Base API,通常在Schema结构不经常变动的情况下,推荐使用DPL API。通过DPL API可直接将Java对象进行持久存储(前提:该Java对象有默认的构造函数),检索效率相对较快。
DPL的英文全称为Direct Persistence Layer,与Hibernate的ORM功能相比,两者都是以操作对象的方式来操纵底层数据。所不同的是,Hibenrate的ORM是完成了Java实体到库表结构的映射,在执行CURD操作时,需要先由对象实体构造出sql语句,在通过sql语句去操纵数据库;而DPL是直接将java实体对象进行存储,因此在执行操作时,没有中间的映射转换过程,从而便加快了数据的访问和执行速度。
DPL对存储实体的描述是通过Annotation来实现的,它提供了以下几个标签用来对实体类进行说明描述:
一个简单的实体类声明如下:
@Entity public class Book { @PrimaryKey(sequence="SEQ_Book")//通过指定sequence可自动生成主键值 private long id; //多对一关联,关联的实体为Library,级联删除模式为cascade,即当Library被删除时同时删除Book信息 @SecondaryKey(relate = MANY_TO_ONE,relatedEntity=Library.class,onRelatedEntityDelete=CASCADE) private Long library; //多对多关联,关联的实体为Author,级联删除模式为NULLIFY,即当Author被删除时,Book的author属性指定为null @SecondaryKey(relate = MANY_TO_MANY,relatedEntity=Author.class,onRelatedEntityDelete=NULLIFY) private Set<Long> authors=new HashSet<Long>(); public long getId(){ return id; } public void setId(long value){ this.id=value; } public Long getLibrary(){ return library; } public void setLibrary(Long value){ this.library=value; } public Set<Long> getAuthors(){ return authors; } public void setAuthors(Set<Long> value){ this.authors=value; } }
DPL对存储实体的访问主要是通过EntityStore来完成的,该对象可基于Enviroment来构建。
StoreConfig storeConf=new StoreConfig();//首先构造StoreConfig对象
storeConf.setAllowCreate(true);//当存储路径不存在时,是否自动创建
EntityStore store=new EntityStore(env,"EntityStore",storeConf);
有了EntityStore对象之后,便可通过它对底层的数据进行检索(只有在实体类的属性被声明成@PrimaryKey或@SecondaryKey的情况下,才可通过该属性对实体类进行检索)