`
billgmh
  • 浏览: 65498 次
  • 性别: Icon_minigender_1
  • 来自: 广东广州
社区版块
存档分类
最新评论

开源面向对象数据库db4o之旅(3): 深入db4o

    博客分类:
  • Java
阅读更多
前言
在开源面向对象数据库 db4o 之旅 系列文章的第 1 部分:初识 db4o 中,作者介绍了 db4o 的历史和现状,应用领域,以及和 ORM 等的比较; 在第 2 部分:db4o 查询方式中, 作者介绍了 db4o 的三种不同的查询方式:QBE、SODA 以及 Native Queries,并分别通过这三种不同的途径实现了两个关联对象的查询。
前面我们已经介绍了如何在 db4o 中查询以及添加对象,在本文中我们将会向您介绍在 db4o 中如何对对象进行更新以及删除操作。
场景一
我们来设想这样的场景:一位名叫“张三”的人买了车,并上好了牌照(如本系列第二部分之代码),而他基本信息的地址并不详细,只写了“成都市”,在一次主管部门检查此人信息的时候,发现了这个问题,并立即着手修改。
db4o 中,我们这样来实现对这个用户信息的修改(清单1):
 
清单1. 修改地址
java 代码
  1. package com;   
  2.   
  3. import bo.People;   
  4.   
  5. import com.db4o.Db4o;   
  6. import com.db4o.ObjectContainer;   
  7. import com.db4o.ObjectSet;   
  8. import com.db4o.query.Predicate;   
  9.   
  10. public class DB4OTest{   
  11.        
  12.     public static void main(String[] args){   
  13.         //打开数据库   
  14.         ObjectContainer db = Db4o.openFile("auto.yap");   
  15.         try{   
  16.             ObjectSet<People> result = db.query(new Predicate<People>() {   
  17.                 public boolean match(People people) {   
  18.                     return people.getName().equals("张三");   
  19.                 }   
  20.             });   
  21.             People people = result.next();   
  22.             //修改地址   
  23.             people.setAddress("成都市金牛区xxx号");   
  24.             db.set(people);   
  25.         }finally{   
  26.             //关闭连接   
  27.             db.close();   
  28.         }   
  29.     }   
  30. }   
修改数据是如此的简单,通过 NQ 查询出 People 对象,接着修改其地址,最后保存即可。现在我们来看看修改是否成功, 打开 ObjectManager ,如图 1 所示,我们可以看到数据库里的用户数据已经更新了。
 
1. 修改地址
与 本系列文章第二部分不同的是,我们利用 ObjectSet<People> result 来获取返回结果,而不是 List<People> list。查阅 ObjectSet 的 API 我们发现 ObjectSet 实际上继承了 java.util.List 和 java.util.Iterator。为什么要继承两个接口?这是由于 db4o 为了方便开发者而有意这样设计的,db4o 的设计目标就是轻量级,这样的继承方式为 ObjectSet 提供了多种特性,而无需开发者在多个集合接口之间转换。
场景二
让我们考虑下面这个场景:
由于工作原因,“张三”要离开省会去其他城市发展,他的汽车也要在那里使用,为了方便,他还是决定重新更换为本地牌照。
这次我们几乎和场景一采用同样的代码,但结果却不同(清单2):
 
清单2. 修改地址和车牌(不成功)
java 代码
  1. package com;   
  2.   
  3. import bo.People;   
  4.   
  5. import com.db4o.Db4o;   
  6. import com.db4o.ObjectContainer;   
  7. import com.db4o.ObjectSet;   
  8. import com.db4o.query.Predicate;   
  9.   
  10. public class DB4OTest{   
  11.        
  12.     public static void main(String[] args){   
  13.         //打开数据库   
  14.         ObjectContainer db = Db4o.openFile("auto.yap");   
  15.         try{   
  16.             ObjectSet<People> result = db.query(new Predicate<People>() {   
  17.                 public boolean match(People people) {   
  18.                     return people.getName().equals("张三");   
  19.                 }   
  20.             });   
  21.             People people = result.next();   
  22.             //修改地址   
  23.             people.setAddress("绵阳市xx区xxx号");   
  24.             //修改车牌号   
  25.             people.getAutoInfoList().get(0).setLicensePlate("川B00000");   
  26.             db.set(people);   
  27.         }finally{   
  28.             //关闭连接   
  29.             db.close();   
  30.         }   
  31.     }   
  32. }   
想必应该保存成功了吧,只是多加入了设置车牌的代码。打开 ObjectManager,如图 2 所示。很奇怪,地址保存成功了,而车牌却根本没变化。
 
2. 修改地址和车牌(不成功)
其实这也是 db4o 的有意安排。设想一个复杂对象有很多成员,并且这些成员又有自己的成员。当更新该对象,db4o 将不得不更新其所有的关联对象、关联对象的关联对象,等等。这将引起严重的性能惩罚,而且在大部分的情况下是没有必要这样的。
db4o 引入了“更新深度(update depth)”这一概念来控制被更新的对象成员树深度。默认的更新深度是 1,这就意味着只有基本类型和 String 类型的成员变量可以被更新,而修改对象成员将得不到任何反映,例如本例中修改 People 对象的 _autoInfoList 成员。
为了能更新成员对象,ob4o 提供了 cascadeOnUpdate() 方法,该方法必须在每次开启数据库之前设置清单3
 
清单3. 修改地址和车牌(成功)
java 代码
  1. package com;   
  2.   
  3. import bo.People;   
  4.   
  5. import com.db4o.Db4o;   
  6. import com.db4o.ObjectContainer;   
  7. import com.db4o.ObjectSet;   
  8. import com.db4o.query.Predicate;   
  9.   
  10. public class DB4OTest{   
  11.        
  12.     public static void main(String[] args){   
  13.         //级联设置   
  14.         Db4o.configure().objectClass("bo.People")   
  15.         .cascadeOnUpdate(true);   
  16.         //打开数据库   
  17.         ObjectContainer db = Db4o.openFile("auto.yap");   
  18.         try{   
  19.             ObjectSet<People> result = db.query(new Predicate<People>() {   
  20.                 public boolean match(People people) {   
  21.                     return people.getName().equals("张三");   
  22.                 }   
  23.             });   
  24.             People people = result.next();   
  25.             //修改地址   
  26.             people.setAddress("绵阳市xx区xxx号");   
  27.             //修改车牌号   
  28.             people.getAutoInfoList().get(0).setLicensePlate("川B00000");   
  29.             db.set(people);   
  30.         }finally{   
  31.             //关闭连接   
  32.             db.close();   
  33.         }   
  34.     }   
  35. }  
这下终于如愿以偿,如图 3 所示。其实 db4o 为开发者想得很周到,关键是如何用好这些特性。
 
3. 修改地址和车牌(成功)
场景三
“张三”换了工作后,事业发展很快,准备把车卖了换新的,于是他去交管部门办理移交手续,删除关联的车辆信息清单4
 
清单4. 删除车辆
java 代码
  1. package com;   
  2.   
  3. import bo.AutoInfo;   
  4.   
  5. import com.db4o.Db4o;   
  6. import com.db4o.ObjectContainer;   
  7. import com.db4o.ObjectSet;   
  8. import com.db4o.query.Predicate;   
  9.   
  10. public class DB4OTest{   
  11.        
  12.     public static void main(String[] args){   
  13.         //打开数据库   
  14.         ObjectContainer db = Db4o.openFile("auto.yap");   
  15.         try{   
  16.             ObjectSet<AutoInfo> result = db.query(new Predicate<AutoInfo>() {   
  17.                 public boolean match(AutoInfo ai) {   
  18.                     //匹配姓名和车牌号   
  19.                     return ai.getLicensePlate().equals("川B00000")    
  20.                            && ai.getOwnerNo().getName().equals("张三");   
  21.                 }   
  22.             });   
  23.             AutoInfo ai = result.next();   
  24.             //删除车辆信息   
  25.             db.delete(ai);   
  26.         }finally{   
  27.             //关闭连接   
  28.             db.close();   
  29.         }   
  30.     }   
  31. }   
图 4 所示,所关联的车辆信息已被删除了。
 
场景四
在场景三的基础上修改一下,设想“张三”由于工作不顺,导致最后维护汽车的开支都困难,他不得不退出有车一族的行列清单5
 
清单5. 删除所有信息
java 代码
  1. package com;   
  2.   
  3. import bo.People;   
  4.   
  5. import com.db4o.Db4o;   
  6. import com.db4o.ObjectContainer;   
  7. import com.db4o.ObjectSet;   
  8. import com.db4o.query.Predicate;   
  9.   
  10. public class DB4OTest{   
  11.        
  12.     public static void main(String[] args){   
  13.         //级联设置   
  14.         Db4o.configure().objectClass("bo.People")   
  15.         .cascadeOnDelete(true);   
  16.         //打开数据库   
  17.         ObjectContainer db = Db4o.openFile("auto.yap");   
  18.         try{   
  19.             ObjectSet<People> result = db.query(new Predicate<People>() {   
  20.                 public boolean match(People people) {   
  21.                     //匹配姓名   
  22.                     return people.getName().equals("张三");   
  23.                 }   
  24.             });   
  25.             People people = result.next();   
  26.             //删除车主以及关联的车辆信息   
  27.             db.delete(people);   
  28.         }finally{   
  29.             //关闭连接   
  30.             db.close();   
  31.         }   
  32.     }   
  33. }   
用过 Hibernate 的开发者都知道,它的级联删除让人留下了深刻印象,第一次使用的时候都会为之振奋。db4o 也为开发者提供了级联删除,和场景二的级联更新一样, cascadeOnDelete() 是专门为删除准备的,基本概念和 cascadeOnUpdate() 一致。打开 ObjectManager 我们会发现数据库已经清空了,张三的购车经历到此结束。
通过本系列文章,db4o 的优势已经体现得淋漓尽致,它的添加、更新、删除是如此的简单,正如 db4o 的口号那样——“仅需一行代码就能存储复杂结构对象,极大的降低了开发时间和成本,提供高效的性能,无需 DBA 干预”。
分享到:
评论

相关推荐

    开源面向对象数据库 db4o 之旅

    该资源为 db4o 之旅 系列文章: ...3.介绍面向对象数据库 db4o 的修改和删除,并对其中出现的问题进行细致分析,引入了“更新深度(update depth)”这一重要概念。 最后更新于2006 年 12 月 14 日 另外再推荐一个站点 ...

    对象数据库db4o对象数据库db4o

    3. **事件驱动**:db4o支持对象生命周期事件,如对象的插入、更新和删除等,可以通过监听这些事件来执行相应的操作。 4. **版本控制**:db4o能自动记录对象的历史版本,便于回溯和对比。 5. **分布式数据库**:db4...

    DB4O面向对象数据库使用指南

    DB4O面向对象数据库使用指南

    db4o面向对象数据库教程的入门教程

    - **db4o**:db4o是一款专为Java、.NET和Mono平台设计的开源面向对象数据库系统。它提供了高效的数据存储和检索功能,支持多种数据类型,并且能够直接存储复杂的对象结构而无需进行序列化或反序列化的操作。 - **...

    对象数据库db4o API参考

    纯对象数据库db4o的开发API,可以方便用户在进行开发的时候查阅。

    android开源数据库框架db4o

    Android开源数据库框架db4o是一个强大的对象数据库管理系统,专为Java和.NET平台设计,但在Android环境中也有广泛的应用。db4o提供了一种直接在内存或磁盘上存储对象的方式,无需传统的关系型数据库映射,这使得开发...

    java数据库(db4o)

    3. **版本控制**:db4o可以跟踪对象的历史版本,允许你在任何时候回滚到之前的对象状态。 4. **事件驱动**:db4o提供了对象生命周期事件,如对象插入、更新和删除时的回调机制,方便进行业务逻辑处理。 5. **内存...

    db4o使用指南

    db4o 是一个开源的面向对象数据库,能够轻松地将 Java 对象持久化到数据库中。本文将详细介绍 db4o 的安装、启动、查询方式、对象持久化、数据库文件结构、主要包结构等知识点。 一、db4o 安装和启动 db4o 的安装...

    面向 Java 开发人员的 db4o 指南: 第 3 部分:db4o 中的数据库重构

    - **查询策略调整**:db4o支持谓词查询、查询配置(query configuration)和查询计划(query planner)。根据应用场景调整这些策略,可以显著提升查询效率。 - **激活深度控制**:通过设置激活深度,可以减少不必要...

    Android开发-面向对象的数据库Db4o.doc

    Db4o是一个面向对象的数据库系统,由db4objects公司开发,它支持Java和.NET平台,并采用双授权模式,即GPLv2和商业授权。在Android开发中,Db4o提供了一种替代传统关系型数据库如SQLite的方式,尤其是在面对面向对象...

    DB4o 将一个对象保存到文件中,然后查询读取

    DB4o(Database for Objects)是一款开源的对象数据库系统,它允许开发者将Java或.NET平台上的对象直接存储到数据库中,而无需进行SQL映射。在本文中,我们将深入探讨如何利用DB4o将一个对象保存到文件中,然后进行...

    DB4o 数据库实例

    DB4o(Database for Objects)是一款开源的对象数据库系统,它允许开发者直接将对象持久化到数据库中,无需进行额外的映射或者数据访问层(DAL)的开发。这个数据库系统设计的目标是简化对象关系映射(ORM)的过程,...

    db4o 权威指南

    《db4o 权威指南》是一本深入探讨db4o这一开源面向对象数据库系统的专业书籍,对于Java开发者来说尤其有价值。db4o是Database for Objects的缩写,它允许开发者以自然、直观的方式存储和检索Java对象,无需编写SQL...

    db4o-8.0-java

    **db4o(Database for Objects)** 是一个开源的对象数据库管理系统(Object-Relational Mapping,ORM),它允许开发者直接在Java或.NET平台上存储和检索Java对象或.NET对象,无需进行SQL查询或者映射过程。db4o的...

    db4o8.0以及db4o中文指南

    1. **性能优化**:db4o 8.0对查询引擎进行了优化,提高了查询速度和整体性能,尤其在大数据量的场景下表现更佳。 2. **事务支持**:提供了更强大的事务管理,确保数据的一致性和完整性,支持ACID(原子性、一致性、...

    Db4o的简单操作项目

    Db4o,全称为“Database for Objects”,是一个开源的对象数据库管理系统,主要应用于Java和.NET平台。这个项目专注于提供一种简单的方式来存储和检索Java对象,无需SQL或其他中间映射层。在“Db4o的简单操作项目”...

    db4o-8.0.236.16058.zip 对象数据库,内存数据库jar包,两个

    db4o(Database for Objects)是一种开源的对象数据库管理系统(Object-Relational Mapping, ORM),它允许开发者直接将Java对象持久化到数据库中,无需传统的SQL语句。这个数据库系统的核心理念是“存储对象,而非...

Global site tag (gtag.js) - Google Analytics