.sql文件_自己动手写SQL查询引擎
自己动手写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截图
公众号
关注笔者公众号,获取更多干货文章:
github链接
https://github.com/alchemystar/Rider
码云链接
http://git.oschina.net/alchemystar/Rider
.sql文件_自己动手写SQL查询引擎相关推荐
- 可视化mysql怎么导入sql文件_使用navicat导入sql文件的方法步骤
一.打开navicat,打开连接,右击连接名(如果新建连接,需要使用对应数据库的ip地址和密码,本机的是地址localhost,密码是自己mysql数据库的密码),选择新建数据库,数据库名要和想要导入 ...
- 转储sql文件_在Linux上SQL Server中更改SQL转储文件位置
转储sql文件 In this article, we will talk about SQL Dump files and the process to change the dump direct ...
- 导出sql文件_(一)SQL基本知识
一 .SQL的特点 1.综合统一:SQL集数据定义语言DDL.数据控制语言DCL的功能于一体,语言风格统一,可以独立完成数据库生 命周期中的全部活动(定义关系模式,插入数据,建立数据库:对数据库中的数 ...
- mysql dump sql文件_用mysqldump导出sql文件的问题。
调用以下方法就可以了:/** * 导出数据库 * * @return */ public boolean exportDataBase() { boolean isSuccess = false; S ...
- 怎么将oracle的sql文件转换成mysql的sql文件
怎么将sql文件导入PowerDesigner中的方法(将oracle的sql文件转换成mysql的sql文件)呢? 怎么将xx.sql文件的数据库结构导入powerdesigner 的方法呢? 现讲 ...
- cmd执行sql文件路径 oracle_oracle 基础 执行sql文件
Oracle执行外部文件: sql>@new.sql 执行多个sql文件: 1.把所有的文件都放在同一个目录下,然后在命令行里执行命令: c:>dir/b > d:/1.sql 会把 ...
- mysql日期维表sql文件_《MySQL必知必会》笔记(SQL练习+建表语句)
站在巨人的肩上 Standing On Shoulders Of Giants 部分转自:https://www.jianshu.com/p/294502893128 https://blog.csd ...
- java执行sql文件_面试官问你MyBatis SQL是如何执行的?把这篇文章甩给他
初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...
- java执行sql文件_面试官:MyBatis SQL是如何执行的?把这篇文章甩给他
初识 MyBatis MyBatis 是第一个支持自定义 SQL.存储过程和高级映射的类持久框架.MyBatis 消除了大部分 JDBC 的样板代码.手动设置参数以及检索结果.MyBatis 能够支持 ...
最新文章
- It is not safe to rely on the system's timezone settings
- 新手小白零基础搭建个人博客(一)服务器篇
- 《数据库SQL实战》获取所有员工当前的manager
- protel布线需要注意事项
- Android app 标签,android 获取APP的唯一标识applicationId的实例
- 常见的php 字符串函数,php 常用字符串函数总结
- 地表径流分布数据/水文站点分布/降雨量分布/辐射分布数据
- 离散数学与计算机的发展,计算机学科发展中离散数学的作用与运用
- 乐玩模块脚本实战教程辅助脚本制作开发视频
- 关于QTTabBar的使用
- java 压力测试_记一次完整的java项目压力测试
- IIC扩展IO NCA9555代码
- DSPE-PEG-Alkyne/CHO 磷脂聚乙二醇炔基/醛基
- 【C++】促销商品的折扣计算
- 微信weui之actionSheet应用
- Genymotion 自配 AndoidSDK 一直Booting
- Android重写ImageView实现图片镜像效果
- Android关于第三方h5在webview调用摄像头及相机的处理
- 微信小程序 -数字滚动动画
- php极简wiki,Wiki.js初体验
热门文章
- bootstrap-switch 不起作用 class处显示代码_注解KafkaListener不起作用,到底发生了啥?...
- windows7中安装jdk1.8
- 深入了解hibernate之PO,VO,load,get
- 冰原服务器维护,12月2日服务器公告:冰原旅途进发
- 章节三、2-方法_演示实例
- BZOJ4278 : [ONTAK2015]Tasowanie
- Objective-C控制语句
- 所有的胜利,与征服自己的胜利比起来,都是微不足道。
- Java Calendar 基本用法
- 开源 Asp.net mvc 用户中心(nUserCenter) 产品机会评估