我也能写数据库——单表查询

前言

说不定期更新,就不定期更新:)。

在翻译关系代数这篇文档的时候,总有一种惴惴不安的感觉伴随着我,其实还是对之前概览的一知半解,而DEMO项目为了介绍特性,添加了太多代码进来,这虽然很好,因为当你执行代码的时候,就能看到所有特性,但是对于一个新手来讲却未必够友好,我也是这样的一个新手,看着文档里不知所云的概念和代码片段,经常会有挫败感。那不如我们就来实实在在的完成一个来查询一个表(当然这个表示我们自己定义的格式)就这么简单。来体会一下的魅力吧。

这里我们的目标是:

数据在一个自己可控的位置,本文写在一个Java文件的静态块里

可以执行一个简单查询并返回数据

model.json

我习惯gradle,所以起手构建一个空白gradle项目,添加依赖:

在下构建一个:

首先给库定义一个名字: 然后描述类型,自定义类型,其他还包括,等 接下来相当于定义我们程序的入口,如何加载一个

在构想初期只是想实现一个简单的bookshop数据库,后面在介绍里,也会提到,我设计了2张表,和。

InMemorySchemaFactory

首先让我们来看一下代码:

因为在里定义了属性,所以被默认加载,该类需要继承,重写方法的时候,可以根据自己需要来构建逻辑,这里我们只打印了几个参数看一眼,就略过,实例化一个。

InMemorySchema

我们还是先把代码贴上:

类也是相当简单的,首先继承,实际上需要复写的就是这个方法,它的职责就是要提供一个表名和表的映射表,为了实现这个,我们需要做一些处理,当然本例里是使用了一个类,来模拟存储表结构信息,以及数据的,这里的表结构以及其他信息都不需要外接再提供额外辅助,如果是使用其他类型的,就可能需要根据自己的实际需求,扩展属性,来携带必要参数进来了。

直接提供了方法,可以直接从里面获取到当前存在的表,这样直接将内的表转化成类就可以了。

InMemoryTable

还是先从代码入手:

这里我保留了很多难看的,其实也是为了展示一下我走过的弯路,在这里面,遇到奇奇怪怪的坑,由于的结构原因,有时出错从日志上很难发现原因,或者说很难准确断定原因,当然也许是笔者水平所限的缘故。 需要继承实现的接口,在这里提供了几种接口,待日后分解。这个类里,我们主要需要处理的2个方法和.

用来处理列的类型的,不要被那几句代码所迷惑,为了顺利运行,并没有针对数据的类型做什么处理,而是简单粗暴了使用了String,有兴趣的话,可以根据自己的实际情况来注册,日后有机会会详细介绍这部分。 这个方法相对复杂一点,提供了全表扫面的功能,这里主要需要高速引擎,如何遍历及获取数据。其结构还是比较复杂得,为了减少本例中类的个数,避免复杂得代码结构,吓跑初学者,所以,采用了内部类嵌套的形式,含义还是比较明确的。 主要就是实现和方法。这里还是由提供了数据的存储功能,所以只需要遍历,获取一下数据而已,其他方法暂时不管。

写到这,其实和相关的代码已经完成了,整个工程的主体代码也完成了,现在只需要再介绍一下

Storage

这里我们用了一个简单的结构来模拟了存储,下面包含,包含,用于存放元数据信息,而数据则包含在一个里,各类都提供基础的和方法,数据初始化则写在静态块里。

测试

写个main方法测试一下:

技术总结

能提供一个透明的JDBC实现,使用者可以按自己的方式规划存储,这个特性在数据分析中,其实更适合,比如在多源、跨源联合查询上,威力巨大。

按接口实现相关和,目前只实现了流程上跑通,单不代表他们就是这样,在这里我们还有很长的路要走

自定义视图配上model上配置的参数,也许可以作为数据权限一种实现

后记

上述项目代码库传送门:

目前只提供了全表扫面,条件判断表连接都还不行,待日后更新。 而强大的优化工作还没登场呢。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20181211G18BP500?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券