面向对象的数据库db4o: 安装并使用db4o

面向对象的数据库db4o: 安装并使用db4o为什么80%的码农都做不了架构师?>>>…

大家好,又见面了,我是你们的朋友全栈君。

下载和安装db4o

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

接着在 Eclipse 中新建 Java 项目,把 db4o 对象数据库引擎包 db4o-8.0.249.16098-all-java5.jar 导入进项目。由于 db4o 支持多种版本的 JDK,除了 for JDK 5.0 的 db4o-8.0.249.16098-all-java5.jar 外,还有 for JDK 1.1、1.2-1.4 的 JAR 包,以适应多种环境。与 Hibernate、iBATIS SQL Maps 相比,db4o 更加自然,无需过多地引用第三方支持库。

db4o的包结构 

db4o 怎样进行对象持久化呢?通过浏览目录可以发现,与传统的 RDBMS 一样,db4o 也有自己的数据库文件, 在 db4o 中数据库文件的后缀名是“*.yap”。让我们先来了解一下 db4o 对象数据库引擎的主要包结构:

  • com.db4o
    com.db4o 包含了使用 db4o 时最经常用到的功能。两个最重要的接口是 com.db4o.Db4o 和 com.db4o.ObjectContainer。com.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 包包含了构造“原生查询, NQ(Native Queries)”所需的 Predicate 类。NQ 是 db4o 最主要的查询接口。

初始化数据库

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

Db4oEmbedded.openFile(Db4oEmbedded.newConfiguration(), "auto.yap");

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

服务器端:

ObjectServer server = Db4oClientServer.openServer("auto.yap", 1212); server.grantAccess("admin", "1");

客户端:

// ip为服务器的ip地址 Db4oClientServer.openClient(ip, 1212, "admin", "1");

需要注意的是db4o会自动创建数据库文件,但是并不会创建数据库文件目录,比如我想创建数据库文件”/export/db4o/auto.yap”,db4o并不会自动创建”/export/db4o”目录 ,所以创建数据库文件时最好初始化下数据库目录:

private void initDBFile(String dbName) {     File file = new File(dbName);     if (file.exists()) {         return;     }     List<File> fList = new ArrayList<File>();     File pFile = file.getParentFile();     while (!pFile.exists()) {         fList.add(pFile); pFile = pFile.getParentFile();     }     for (int i = fList.size() - 1; i >= 0; i--) { File f = fList.get(i); f.mkdir();     } }


使用数据库

上面介绍的两种方式都可以得到 ObjectContainer 实例,就目前Java EE的分布式的应用环境来看,服务器模式更有现实意义;而本地模式更适合于单服务器应用。因为分布式模式比较常用,本文在下面的例子都将采用分布式模式。

在下面的例子中,会使用一个UserVO对象,然后介绍db4o对该对象的CRUD。

  UserVO对象

public class UserVO implements Serializable {     private static final long serialVersionUID = -9129148024922569814L;     private String userName;     private String password;     public UserVO() {}     public UserVO(String userName, String password) { this.userName = userName; this.password = password;     }     public String getPassword() {         return password;     }     public void setPassword(String password) { this.password = password;     }     public String getUserName() { return userName;     }     public void setUserName(String userName) { this.userName = userName;     }     @Override     public boolean equals(Object obj) {         if (this == obj) { return true; } if (!(obj instanceof UserVO)) { return false; } UserVO other = (UserVO) obj; if (!(userName == null ? other.userName == null : userName.equals(other.userName))){ return false; } if (!(password == null ? other.password == null : password.equals(other.password))){ return false; } return true;     }     @Override     public int hashCode() { final int prime = 31; int result = 17; result = prime * result + ((userName == null) ? 0 : userName.hashCode()); result = prime * result + ((password == null) ? 0 : password.hashCode()); return result;     }     @Override     public String toString() { return "UserVO [userName=" + userName + ", password=" + password + "]";     } }

增加(Create)

public static void main(String[] args) {     UserVO vo = new UserVO("admin", "1");     // 打开数据库,ip为服务器ip     ObjectContainer db = Db4oClientServer.openClient(ip, 1212, "admin", "1");     try {         // 存储数据         db.store(vo); // 提交事务 db.commit();     } catch (Exception e) { // 出现异常则回滚 db.rollback();     } finally { // 关闭连接 db.close();     } }

读取(Retrieve)

public static void main(String[] args) {     // 打开数据库     ObjectContainer db = Db4oClientServer.openClient(ip, 1212, "admin", "1");     try { // 构造查询对象 Query query = db.query(); // 设置被约束实例 query.constrain(UserVO.class); // 设置被约束实例的字段和约束条件 query.descend("userName").constrain("admin"); // 查询对象 ObjectSet<UserVO> list = query.execute(); // do something with list     } finally { // 关闭连接 db.close();     } }

更新(Update)

public static void main(String[] args) {     // 打开数据库     ObjectContainer db = Db4oClientServer.openClient(ip, 1212, "admin", "1");     try { ObjectSet<UserVO> result = db.query(new Predicate<UserVO>() {     private static final long serialVersionUID = 1554763863522546547L;     public boolean match(UserVO vo) { // 匹配userName为admin的UserVO return vo.getUserName().equals("admin");     } }); if (result.size() != 1) {     throw new RuntimeException("size does not matched."); } UserVO vo = result.next(); // 修改passport vo.setPassword("0"); db.store(vo); db.commit();     } catch (Exception e) { db.rollback();     } finally { // 关闭连接 db.close();     } }

删除(Delete)

public static void main(String[] args) {     UserVO vo = new UserVO("admin", "1");     // 打开数据库     ObjectContainer db = Db4oClientServer.openClient(ip, 1212, "admin", "1");     try {         ObjectSet<UserVO> result = db.query(new Predicate<UserVO>() {     private static final long serialVersionUID = -4397123083792023957L;     public boolean match(UserVO vo) { // 匹配userName为admin的UserVO return vo.getUserName().equals("admin");     } }); if (result.size() != 1) {     throw new RuntimeException("size does not matched."); } UserVO vo = result.next(); db.delete(vo); db.commit();     } catch (Exception e) { db.rollback();     } finally { // 关闭连接 db.close();     } }

结论

通过本系列文章,db4o 的优势已经体现得淋漓尽致,它的添加、更新、删除是如此的简单,正如 db4o 的口号那样——“仅需一行代码就能存储复杂结构对象,极大的降低了开发时间和成本,提供高效的性能,无需 DBA 干预”。

如本文有不详尽之处,大家可以参考官方的《用户指南》,db4o 中文社区正在火热成长!

参考资料

学习

获得产品和技术

转载于:https://my.oschina.net/xionghui/blog/489727

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/162580.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 请简述什么是Vue组件化开发_vuecli和webpack

    请简述什么是Vue组件化开发_vuecli和webpack前言真实项目开发过程中,我们都是使用组件化的去开发vue的项目,但是组件化的思想又是如何来的呢?下面就从开始讲解演变过程演变过程1.0一般情况下vue都是单页面开发,所以项目中只会有一个inde

  • 在CentOS上安装phpMyAdmin的教程

    在CentOS上安装phpMyAdmin的教程前提在CentOS上安装phpMyAdmin,你第一步需要架设一台Web服务器(如Apache或nginx),安装好MySQL/MariaDB数据库和PHP。根据你的偏好和需求,你可以从LAMP和LEMP中选择一种安装。另一个要求是允许在你的CentOS上安装EPEL库。如果你还没设置过请猛戳这里。在CentOS6或7上安装phpMyAdmin一旦你设置了EPEL库,你就能轻松地用以下命令安装ph

  • 进程与线程

    进程与线程进程我们都知道计算机的核心是CPU,它承担了所有的计算任务,而操作系统是计算机的管理者,它负责任务的调度,资源的分配和管理,统领整个计算机硬件;应用程序是具有某种功能的程序,程序是运行于操作系统之

  • nginx转发mysql连接

    nginx转发mysql连接场景:访问UAT环境,只能使用客户电脑访问,太难用了,于是就需要在自己电脑上跑代码,通过客户电脑中转来访问uat环境的数据库。选用nginx进行转发。配置如下:stream{upstreamcloudsocket{hash$remote_addrconsistent;server192.168.182.155:3306weight=5max_fails=3fail_timeout=30s;}server{

    2022年10月19日
  • mjrefresh原理_mjp是什么意思

    mjrefresh原理_mjp是什么意思1.  UIView+MJExtension 可以用来获取、设置x/y/w/h等

    2022年10月25日
  • 彻底解决mysql中文乱码

    彻底解决mysql中文乱码mysql是我们项目中非常常用的数据型数据库。但是因为我们需要在数据库保存中文字符,所以经常遇到数据库乱码情况。下面就来介绍一下如何彻底解决数据库中文乱码情况。

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号