美文网首页Android开发Java
一个轻量级Java嵌入式数据库 —— QuickIO

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

作者: 1225fe6bdfc1 | 来源:发表于2023-05-02 14:02 被阅读0次

    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类的静态方法即可调用。

    结语

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

    相关文章

      网友评论

        本文标题:一个轻量级Java嵌入式数据库 —— QuickIO

        本文链接:https://www.haomeiwen.com/subject/zawajdtx.html