当前访客身份:游客 [ 登录  | 注册加入尚学堂]
启用新域名sxt.cn
新闻资讯

DB4O 教程

xiaogao123 发表于 2年前  | 评论(0 )| 阅读次数(730 )|   0 人收藏此文章,   我要收藏
摘要 db4o 是一个开源的纯面向对象数据库引擎,对于 Java 与 .NET 开发者来说都是一个简单易用的对象持久化工具,使用简单。同时,db4o 已经被第三方验证为具有优秀性能的面向对象数据库, 下面的基准测试图对 db4o 和一些传统的持久方案进行了比较。

DB4o介绍

         业界对持久存储领域的追求从未停止过,为了更方便、更容易地用对象表达我们的思维,开源领域和商业领域都涌现了许多新技术, ORM 的出现恰恰说明了这点。最近一年,业界也在反思,到底 ORM 给我们带来的是便利还是麻烦。矛头指向大名鼎鼎的 Hibernate ,纷纷议论其性能问题,大家似乎要达成这样的共识:在业务逻辑复杂的地方用 SP ,而一般的 CRUD 还是 Hibernate ”,就连全球知名的 BearingPoint 也有类似看法。

 

       db4o 是一个开源的纯面向对象数据库引擎,对于 Java  .NET 开发者来说都是一个简单易用的对象持久化工具,使用简单。同时,db4o 已经被第三方验证为具有优秀性能的面向对象数据库 下面的基准测试图对 db4o 和一些传统的持久方案进行了比较。db4o 在这次比较中排名第二,仅仅落后于JDBC。通过图 1 的基准测试结果,值得我们细细品味的是采用Hibernate/HSQLDB 的方案和 JDBC/HSQLDB 的方案在性能方面有着显著差距,这也证实了业界对 Hibernate 的担忧。而 db4o 的优异性能,让我们相信: OO 并不一定会牺牲性能。

 

 

优势:

db4o 为我们带来的是这样一种面向对象的查询方式:

·         100% 的原生 查询语言应能用实现语言( Java C# )完全表达,并完全遵循实现语言的语义。

·         100% 的面向对象 查询语言应可运行在自己的实现语言中,允许未经优化执行普通集合而不用自定义预处理。

·         100% 的类型安全 查询语言应能完全获取现代 IDE 的特性,比如语法检测、类型检测、重构,等等。

 

易嵌入。使用 db4o 仅需引入 400 k jar 文件或是 dll 文件,内存消耗极小。

 

零管理。使用 db4o 无需 DBA,实现零管理。

 

 

应用

db4o 的目标是提供一个功能强大的,适合嵌入的数据库引擎,可以工作在设备,移动产品,桌面以及服务器等各种平台。

 

 

环境搭建--插件安装

db4o 所有最新的版本都可以直接在官方网站上下载,我们可以看到最新的 for Java 稳定版本是 8.0,包括 JAR、源代码、入门文档、API 等内容的完整的打包文件只有 6 MBdb4o 还有一个对象数据库管理工具 ObjectManager

 

接着在 Eclipse 中新建 Java 项目,把 db4o 对象数据库引擎db4o-8.0.249.16098-all-java5.jar 导入进项目。与 HibernateiBATIS SQL Maps 相比,db4o 更加自然,无需过多地引用第三方支持库。

 

Jar包结构介绍:

·         com.db4o
com.db4o
包含了使用 db4o 时最经常用到的功能。两个最重要的接口是 com.db4o.Db4o com.db4o.ObjectContainercom.db4o.Db4o 工厂是运行 db4o 的起点,这个类中的静态方法可以开启数据库文件、启动服务器或连接一个已经存在的服务器,还可以在开启数据库之前进行 db4o 环境配置。com.db4o.ObjectContainer 接口很重要,开发过程中 99% 的时间都会用到它,ObjectContainer 可在单用户模式下作为数据库实例,也可作为 db4o 服务器的客户端。每个 ObjectContainer 实例都有自己的事务。所有的操作都有事务保证。当打开 ObjectContainer,就已经进入事务了,commit() rollback() 时,下一个事务立即启动。每个 ObjectContainer 实例维护它自己所管理的已存储和已实例化对象,在需要 ObjectContainer 的时候,它会一直保持开启状态,一旦关闭,内存中数据库所引用的对象将被丢弃。

·         com.db4o.ext
你也许想知道为什么在 ObjectContainer 中只能看见很少的方法,原因如下:db4o 接口提供了两个途径,分别在 com.db4o com.db4o.ext 包中。这样做首先是为了让开发者能快速上手;其次为了让其他产品能更容易的复制基本的 db4o 接口;开发者从这一点上也能看出 db4o 是相当轻量级的。每个 com.db4o.ObjectContainer 对象也是 com.db4o.ext.ExtObjectContainer 对象。可以转换成 ExtObjectContainer 获得更多高级特性。

·         com.db4o.config
com.db4o.config
包含了所有配置 db4o 所需的类。

·         com.db4o.query
com.db4o.query
包包含了构造原生查询, NQNative Queries所需的 Predicate 类。NQ db4o 最主要的查询接口。

 

插件安装

 

 

入门实例

HelloWorld – 学生管理

         和数据库打交道,那么我们首先想到的应该和数据库建立连接 !!! Connection!!

 

    db4o 提供两种运行模式,分别是本地模式和服务器模式。本地模式是指直接在程序里打开 db4o 数据库文件进行操作:

ObjectContainer  container = Db4oEmbedded.openFile("ccc.db4o");

 

而服务器模式则是客户端通过 IP 地址、端口以及授权口令来访问服务器:

服务器端:

ObjectServer server=Db4o.openServer("auto.db4o",1212);

server.grantAccess("admin","123456");

客户端:

ObjectContainer db=Db4o.openClient("192.168.0.10",1212,"admin","123456");

两种方式都可以得到 ObjectContainer 实例,就目前 Java EE 应用环境来看,服务器模式更有现实意义;而本地模式更适合于嵌入式应用。为了简化演示,本文在下面的例子都将采用本地模式。

 

public class Student {

 

    private  String name;

   

    private  Integer age;

   

    private String phone;

 

}

 

    public void add(Student  student ){

      

       ObjectContainer  container= Db4oEmbedded.openFile("students.db4o");

       try {

           container.store(student);

       } finally{

           container.close();

       }

      

    }

    public void  findAll(){

      

       ObjectContainer  container= Db4oEmbedded.openFile("students.db4o");

       List<Student>  list=null;

       try {

          

           list =container.query(Student.class);

          

           for (Iterator iterator = list.iterator(); iterator.hasNext();) {

              Student student = (Student) iterator.next();

              System.out.println(student.getName());

           }

      

       } finally{

           container.close();

       }

    }

 

 

然后可以通过OME插件来查看我们的对象数据!!!

 

查询方式

RDBMS 一样,db4o 也有自己的查询语言,分别是 QBEQuery by Example)、NQNative Queries)、SODASimple Object Database Access),db4o 更推荐使用 NQ 进行查询。NQ 方式提供了非常强大的查询功能,支持原生语言,也就意味着你可以使用 Java 来判断该对象是否符合条件,这是其他数据库查询语言无法比拟的。在某些情况下, db4o 核心会将 NQ 翻译成 SODA 以获得更高的性能。下面详细介绍一下这三种查询语言。

 

QBE  Query by Example

当利用 QBE db4o 提供模板(example)对象时,db4o 将返回所有和非默认值字段匹配的全部对象。内部是通过反射所有的字段和构造查询表达式(所有非默认值字段结合”AND”表达式)来实现。

 

    public void  findByName(String name){

      

       ObjectContainer  container= Db4oEmbedded.openFile("students.db4o");

       try {

          

           Student  student = new Student();

           student.setName(name);

          

           List<Student>  list = container.queryByExample(student);

           for (Iterator iterator = list.iterator(); iterator.hasNext();) {

              Student student2 = (Student) iterator.next();

             

              System.out

                     .println(student2.getName() + "-" + student2.getAge());

           }

          

       } finally{

           container.close();

       }

    }

 

但是 QBE 也有明显的限制:db4o 必须反射模板(example)对象的所有成员;无法执行更进一步的查询表达式(例如 ANDORNOT 等等);不能约束 0(整型)、””(空字符串)或者 null(对象),因为这些都被认为是不受约束的。要绕过这些限制,db4o 提供了 NQNative Queries)。

 

SODA  Simple Object Database Access

    public void  findByName2(String name){

      

       ObjectContainer  container= Db4oEmbedded.openFile("students.db4o");

       try {

          

           Query  query = container.query();

          

           query.constrain(Student.class);

           query.descend("name").constrain("cai10");

          

           List<Student>  list = query.execute();

           for (Iterator iterator = list.iterator(); iterator.hasNext();) {

              Student student2 = (Student) iterator.next();

             

              System.out

              .println(student2.getName() + "-" + student2.getAge());

           }

          

       } finally{

           container.close();

       }

    }

 

 

NQ    Native Queries

精彩总是在最后出场,NQ 才是 db4o 查询方式中最精彩的地方!有没有想过用你熟悉的的编程语言进行数据库查询呢?要是这样,你的查询代码将是 100% 的类型安全、100% 的编译时检查以及 100% 的可重构,很奇妙吧?NQ 可以做到这些。

    public void  findByCondition(final Integer age){

      

       ObjectContainer  container= Db4oEmbedded.openFile("students.db4o");

       try {

          

          

           List<Student>  list = container.query(new Predicate<Student>() {

              @Override

              public boolean match(Student student) {

                  return student.getAge()>age;

              }

           });

          

           for (Iterator iterator = list.iterator(); iterator.hasNext();) {

              Student student = (Student) iterator.next();

              System.out.println(student.getName());

           }

          

       } finally{

           container.close();

       }

      

    }

 

 

 

 

删除和修改

 

 

 

   

    public void delByName(String name){

      

       ObjectContainer  container= Db4oEmbedded.openFile("students.db4o");

       try {

          

           Student student = new Student();

           student.setName(name);

          

          

           container.delete(container.queryByExample(student).get(0));

          

       } finally{

           container.close();

       }

      

    }

    public void update(String name,String newName){

       ObjectContainer  container= Db4oEmbedded.openFile("students.db4o");

       try {

          

           Student student = new Student();

           student.setName(name);

           Student  temp = (Student) container.queryByExample(student).get(0);

          

           temp.setName(newName);

          

           container.store(temp);

       } finally{

           container.close();

       }

      

    }

 

分享到:0
关注微信,跟着我们扩展技术视野。每天推送IT新技术文章,每周聚焦一门新技术。微信二维码如下:
微信公众账号:尚学堂(微信号:bjsxt-java)
声明:博客文章版权属于原创作者,受法律保护。如果侵犯了您的权利,请联系管理员,我们将及时删除!
(邮箱:webmaster#sxt.cn(#换为@))
北京总部地址:北京市海淀区西三旗桥东建材城西路85号神州科技园B座三层尚学堂 咨询电话:400-009-1906 010-56233821
Copyright 2007-2015 北京尚学堂科技有限公司 京ICP备13018289号-1 京公网安备11010802015183