一个轻量级Java嵌入式数据库——QuickIO

QuickIO 是什么?

QuickIO 是一个 Java 嵌入式数据库。底层基于 LevelDB 引擎和 Java NIO 设计,使用 Protostuff 序列化/反序列化数据。支持存储文档、key-value、文件类型的数据。直接使用 Java 代码操作数据库,简单高效。

QuickIO 设计开发的初衷是以简单、优雅的方式,解决小型单机或嵌入式 Java 项目存储数据繁琐的问题。它具备 NoSQL 和嵌入式数据库的优点、功能丰富,可替代 Java 原生的文件读写功能。

本文对 QuickIO 作一个基础的介绍,但读者想了解更详细内容,可查看 GitHub。

开源地址https://github.com/artbits/quickio

QuickIO 特性

  • 像 SQLite 一样的嵌入式数据库,不需要安装,不需要独立进程。
  • 像 MongoDB 或 Diskv 一样的 NoSQL 数据库,使用十分简单。
  • 支持存储文档、key-value、文件类型的数据。
  • 支持唯一索引,以满足快速查询的要求。
  • 简易的 API,使用 Java lambda 表达式优雅操作。
  • 读写快速,满足中小型数据量的使用场景。

QuickIO 安装

Gradle:

repositories {
    maven { url 'https://www.jitpack.io' }
}

dependencies {
    implementation 'com.github.artbits:quickio:1.3.0'
}

Maven:

<repository>
    <id>jitpack.io</id>
    <url>https://www.jitpack.io</url>
</repository>

<dependency>
    <groupId>com.github.artbits</groupId>
    <artifactId>quickio</artifactId>
    <version>1.3.0</version>
</dependency>

QuickIO 使用

存储文档类型的数据。Document 对象与 Map 对象用法相似,可存放任意类型的数据;查找数据时,以 lambda 表达式编写条件的方式查询,与 Java stream 操作相似。

try(DB db = QuickIO.usingDB("example_db")) {
    Collection<Document> collection = db.collection(Document.class);

    collection.save(new Document().put("city", "Canton").put("area", 7434.4));

    Document document = collection.findOne(d -> "Canton".equals(d.get("city")));
    Optional.ofNullable(document).ifPresent(IOEntity::printJson);
}

自定义实体类,按文档类型的数据进行存储。实体类继承IOEntity类,相当于 ORM 框架的实体类与数据表之间建立映射关系。此时,可通过 lambda 表达式直接操作实体类的字段,完成增删改查操作。

public class Book extends IOEntity {
    public String name;
    public String author;
    public Double price;
    
    public static Book of(Consumer<Book> consumer) {
        Book book = new Book();
        consumer.accept(book);
        return book;
    }
}


try(DB db = QuickIO.usingDB("example_db")) {
    Collection<Book> collection = db.collection(Book.class);

    collection.save(Book.of(b -> {
        b.name = "On java 8";
        b.author = "Bruce Eckel";
        b.price = 129.8;
    }));

    List<Book> books = collection.findAll();
    books.forEach(IOEntity::printJson);
}

存储 Key-Value 类型的数据,支持任意可序列化和反序列化的 key 和 value。KV 对象提供写入、读取、擦除、包含(contains)的操作功能。

try(KV kv = QuickIO.usingKV("example_kv")) {
    kv.write("Pi", 3.14);
    kv.write(3.14, "Pi");

    double d = kv.read("Pi", Double.class);
    String s = kv.read(3.14, String.class);
    QuickIO.println("%s = %f", s, d);
}

存储文件类型的数据。该功能的设计灵感来源于服务端的对象存储,让 Tin 可以像 Bucket 操作方式一样,在嵌入式程序中管理文件。把文件放入 Tin 中并设置唯一名称后,即可通过唯一名称进行文件的获取、移除。

try(Tin tin = QuickIO.usingTin("example_tin")) {
    tin.put("photo.png", new File("..."));

    File file = tin.get("photo.png");
    Optional.ofNullable(file).ifPresent(f -> QuickIO.println(f.getPath()));
}

以上,是对 QuickIO 三种数据存储方式的基础介绍,更详细的功能使用,可查阅 GitHub 的相关示例代码。此外,QuickIO 还提供一些工具类 api 功能,例如与打印到操控台、创建唯一ID、序列化、JSON 等相关的功能,通过QuickIO类的静态方法即可调用。

结语

本文到此结束,作者的阅历尚浅,还希望与大家一起交流、学习和探讨。

SQLite 作为一个开源的嵌入式数据库产品,具有系统开销小,检索效率高的特性,适用于手机、PDA、机顶盒设备等电器,并且作为嵌入式数据库在可下载的消费类应用程序中运行的很好。这篇文章介绍嵌入式数据库产品SQLite 的技术特点,并着重讨论研究与Java语言之间的接口,并以实例说明如何使用JAVA 开发基于SQLite 的应用程序。 正文: 通常我们采用各种数据库产品来实现对数据的存储、检索等功能,例如,Oracle,SQL Server, MySQL 等等。这些产品除提供基本的查询,删除,添加等功能外,也提供了很多高级特性,如触发器,存储过程,数据备份恢复,全文检索功能等。但实际上,很多的应用,仅仅利用到了这些数据库产品的基本特性而已。而且在一些小型应用上,或者某些特殊场合的应用,比如桌面程序,这些数据库产品就明显有一些臃肿。在这些情况下,嵌入式数据库的优势就特别明显了。 嵌入式数据库无须独立运行的数据库引擎,它是由程序直接调用相应的API 去实现对数据的存取操作。更直白的讲,嵌入式数据库是一种具备了基本数据库特性的数据文件。嵌入式数据库与其它数据库产品的区别是,前者是程序驱动式, 而后者是引擎响应式。嵌入式数据库一个很重要的特点是它们的体积非常小,编译后的产品也不过几十K。这不但对桌面程序的数据存储方案是一个很好的选择,也使得它们可以应用到一些移动设备上。同时,很多嵌入式数据库在性能上也优于其它数据库,所以在高性能的应用上也常见嵌入式数据库的身影。 下面介绍的是开放源代码的嵌入式数据库,SQLite。同时侧重研究如何应用Java 连接SQLite数据库,并开发基于SQLite 的应用程序。 ......
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值