自己动手写SQL查询引擎

起因

笔者在实际工作中经常需要解析文件,每次文件稍有变化,都得拷贝粘贴一堆代码。
于是就想着能不能做一个通用的服务,通过配置的方式解析文件。

配置通用

最通用的方法就是自己定义一个文件描述语言,用语言去描述文件的组织结构。但如果自己定义一套新的语法,学习成本则太高。

基于SQL

于是就想到了数据库,数据库是通过create table来表示文件格式的,且通过sql来查询底层数据。
这个create table和select操作和我的需求match,就这样SQL查询引擎Rider诞生了。

Rider代码灵感

Rider借鉴了不少项目的代码,例如MySql协议部分借鉴了Corbar。
Sql解析部分借鉴了h2database,derby等。
文件解析部分源于笔者写的大部分文件解析业务代码。
在此向上述优秀的开源代码致敬。

SQL查询引擎Rider

Rider是一个基于Netty通讯框架的纯java写的Server,其不依赖其它任何服务。其主要功能如下图所示:
(1)Rider基于MySql协议和用户交互,用户可以使用mysqlClient、jdbc以及odbc等对Rider发送SQL命令
(2)Rider支持select join where condition、create table等语法
(3)Rider支持MyBatis

Rider总体设计


这里Rider主要分四层:
(1)MySql协议层,负责通过MySql协议与用户的交互,详情可见:
https://my.oschina.net/alchemystar/blog/834150
(2)Sql解析层:负责对select以及create table等语法的解析
(3)Access层:提供游标Cursor这个概念,供Sql解析层去遍历记录
(4)Storage层:对很多中文件格式进行解析,统一封装成游标Cursor给上层调用,
当前Storage还包含了视图的概念,这是Rider另一个特性,在后面的篇章中阐述。

Rider查询表的原理

下图是Rider查询表的原理,
Rider查询表的原理是通过将文件中所有记录读取出来并通过where或者join条件进行遍历,从而筛选出对应的记录。
对于多表查询,则是通过将多个文件中的记录进行笛卡尔积的便利来筛选记录。

Rider文件配置的通用性

文件列位置不定

详细描述:文件A,文件B包含相同的数据,只是列的位置不一样,例如: 文件A:

1,lancer,lancer_comment   2,rider,rider_comment

文件B:

1.lancer_comment,lancer    2,rider,rider_comment  

在Rider中只需要在不同的schema中建立两张相同的表t_test,就可以在应用端代码复用,底层细节的Rider全包了。

use schemaA;create table t_test(   id BIGINT comment 'id test ',   name VARCHAR comment 'name',  extension VARCHAR comment 'extension' )Engine='archer' SEP=',' comment='just for test';use schemaB; create table t_test(   id BIGINT comment 'id test ',   extension VARCHAR comment 'extension' /*此处列位置调整*/  name VARCHAR comment 'name',)Engine='archer' SEP=',' comment='just for test'

这样客户端就可以不考虑文件列的位置了。

文件格式不固定

考虑到三个文件,文件A、文件B以及文件C 文件A,以,分隔:

1,lancer,lancer_comment   2,rider,rider_comment

文件B,以|分隔:

1|lancer|lancer_comment   2|rider|rider_comment

文件C,XLSX格式

use schemaA;create table t_test(   id BIGINT comment 'id test ',   name VARCHAR comment 'name',  extension VARCHAR comment 'extension' )Engine='archer' SEP=',' comment='just for test';use schemaB; create table t_test(   id BIGINT comment 'id test ',   name VARCHAR comment 'name',  extension VARCHAR comment 'extension' )Engine='archer' SEP='|' /*此处分隔符调整为|*/  comment='just for test'use schemaC;create table t_test(   id BIGINT comment 'id test ',   name VARCHAR comment 'name',  extension VARCHAR comment 'extension' )Engine='XLSX'/*此处引擎调整为xlsx*/;

这样客户端也不需要考虑文件格式了。
如果上述不直观的话,可以如下图所示:

Rider性能

文件解析速度4W行/s,其只和java本身文件IO性能相关。

Rider截图

rider_example

公众号

关注笔者公众号,获取更多干货文章:

github链接

https://github.com/alchemystar/Rider

码云链接

http://git.oschina.net/alchemystar/Rider

.sql文件_自己动手写SQL查询引擎相关推荐

  1. 可视化mysql怎么导入sql文件_使用navicat导入sql文件的方法步骤

    一.打开navicat,打开连接,右击连接名(如果新建连接,需要使用对应数据库的ip地址和密码,本机的是地址localhost,密码是自己mysql数据库的密码),选择新建数据库,数据库名要和想要导入 ...

  2. 转储sql文件_在Linux上SQL Server中更改SQL转储文件位置

    转储sql文件 In this article, we will talk about SQL Dump files and the process to change the dump direct ...

  3. 导出sql文件_(一)SQL基本知识

    一 .SQL的特点 1.综合统一:SQL集数据定义语言DDL.数据控制语言DCL的功能于一体,语言风格统一,可以独立完成数据库生 命周期中的全部活动(定义关系模式,插入数据,建立数据库:对数据库中的数 ...

  4. mysql dump sql文件_用mysqldump导出sql文件的问题。

    调用以下方法就可以了:/** * 导出数据库 * * @return */ public boolean exportDataBase() { boolean isSuccess = false; S ...

  5. 怎么将oracle的sql文件转换成mysql的sql文件

    怎么将sql文件导入PowerDesigner中的方法(将oracle的sql文件转换成mysql的sql文件)呢? 怎么将xx.sql文件的数据库结构导入powerdesigner 的方法呢? 现讲 ...

  6. cmd执行sql文件路径 oracle_oracle 基础 执行sql文件

    Oracle执行外部文件: sql>@new.sql 执行多个sql文件: 1.把所有的文件都放在同一个目录下,然后在命令行里执行命令: c:>dir/b > d:/1.sql 会把 ...

  7. mysql日期维表sql文件_《MySQL必知必会》笔记(SQL练习+建表语句)

    站在巨人的肩上 Standing On Shoulders Of Giants 部分转自:https://www.jianshu.com/p/294502893128 https://blog.csd ...

  8. java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

  9. java执行sql文件_面试官:MyBatis SQL是如何执行的?把这篇文章甩给他

    初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...

最新文章

  1. It is not safe to rely on the system's timezone settings
  2. 新手小白零基础搭建个人博客(一)服务器篇
  3. 《数据库SQL实战》获取所有员工当前的manager
  4. protel布线需要注意事项
  5. Android app 标签,android 获取APP的唯一标识applicationId的实例
  6. 常见的php 字符串函数,php 常用字符串函数总结
  7. 地表径流分布数据/水文站点分布/降雨量分布/辐射分布数据
  8. 离散数学与计算机的发展,计算机学科发展中离散数学的作用与运用
  9. 乐玩模块脚本实战教程辅助脚本制作开发视频
  10. 关于QTTabBar的使用
  11. java 压力测试_记一次完整的java项目压力测试
  12. IIC扩展IO NCA9555代码
  13. DSPE-PEG-Alkyne/CHO 磷脂聚乙二醇炔基/醛基
  14. 【C++】促销商品的折扣计算
  15. 微信weui之actionSheet应用
  16. Genymotion 自配 AndoidSDK 一直Booting
  17. Android重写ImageView实现图片镜像效果
  18. Android关于第三方h5在webview调用摄像头及相机的处理
  19. 微信小程序 -数字滚动动画
  20. php极简wiki,Wiki.js初体验

热门文章

  1. bootstrap-switch 不起作用 class处显示代码_注解KafkaListener不起作用,到底发生了啥?...
  2. windows7中安装jdk1.8
  3. 深入了解hibernate之PO,VO,load,get
  4. 冰原服务器维护,12月2日服务器公告:冰原旅途进发
  5. 章节三、2-方法_演示实例
  6. BZOJ4278 : [ONTAK2015]Tasowanie
  7. Objective-C控制语句
  8. 所有的胜利,与征服自己的胜利比起来,都是微不足道。
  9. Java Calendar 基本用法
  10. 开源 Asp.net mvc 用户中心(nUserCenter) 产品机会评估