mongo dao 提供简便的 mongo 数据库操作 ORM, 支持数据 CRUD 以及 sql 查询, 直接 jdbc driver 查询等.
通过 mongo dao, 没有任何 mongo 基础的开发人员可以将 mongo 直接当作 sql 数据库来使用, 降低上手成本。
因为 mongo 的某些特性, 某些 sql 准换为 mongo 查询的结果可能与 mysql 有所不同, 比如 1 != ‘1’ 等.
本文主要介绍使用 sql 查询 mongo 的能力。
DatasJoinUtil 与 DatasSqlJoinUtil 支持 list / stream 互相 join 操作. 其语法和效果类似与 sql 的 join .
DatasJoinUtil 与 DatasSqlJoinUtil 语法一致, 但实现逻辑略有差异, 其中:
DatasJoinUtil 只需指定想左表插入右边中的哪些字段, 默认会返回左表中的所有字段.
DatasSqlJoinUtil 必须指定返回哪些字段, 左边中未指定的字段不会返回. 其效果更接近 sql.
以下是 DatasJoinUtil 的使用介绍.
SybnDaoDriver 可以作为 mongo, solr, hbase, elastic, redis 等数据源的 jdbc 简易驱动使用.
SybnDaoDriver 的底层实现是 SqlDdlDao, 因此支持 SqlDdlDao 的所有 sql 特性.
SybnDaoDriver 目前只支持 select, show tables 等查询, 暂时只允许单表查询.
因为 SqlDdlDao 短期内暂不考虑支持使用 sql 修改数据, 所以 SybnDaoDriver 短期内也不支持.
如需修改数据,可以使用 SqlDdlDao 中的 commonSave 和 commonUpdate 等方法.
sybn dao 是一个基于异构数据查询 java 工具 (效果有类似于apache.calcite),支持用 sql 联合查询 mongo, solr, elastic, Hbase, redis, List, Stream, json, excel, csv, jdbc(mysql, presto, gbase, hive2), 等数据源。
这里准备了专门的 web 版的 adhoc 查询环境 (类似于 hadoop 的 HUE),用于测试不同数据库的 sql 查询效果。
所有测试 sql 仅作为抛砖引玉,大家可以按自己的兴趣尝试修改和测试。
注: 本工具对于sql规范的支持说明: 点此查看
依赖 jre 1.8+
依赖 slf4j (默认不自动引入 slf4j 实现)
支持与 spring boot / spring data / spring mvc / hibernate / spark / spark sql 等生态系统共存
常有人问起, SqlDdlDao 工具类对于 sql 规范的支持版本和支持程度.
因此, 在这里对 sql 规范的支持版本和程度做一下简单的归纳.
目前主要实现的是 sql 规范的 DQL 部分, 因此主要实现的是 SqlDqlDao 部分.
需求 | 对应接口 | 说明 | jdbc完成度 | java完成度 |
---|---|---|---|---|
DQL | SqlDqlDao SqlDqlStreamDao |
负责数据查询, 主要是: select | 80% | 100% |
DML | SqlDmlDao | 负责数据修改, 主要是: insert, update, delete | 0% | 90% |
DDL | SqlDdlDao SqlDdlStreamDao |
负责表结构管理, 比如: create table / index 继承前两个接口 |
0% | 20% |
DCL | 无 | 事务等管理 | 0% | 0% |
下面是SQL发展的简要历史:
* 1986年,ANSI X3.135-1986,ISO/IEC 9075:1986,SQL-86
* 1989年,ANSI X3.135-1989,ISO/IEC 9075:1989,SQL-89
* 1992年,ANSI X3.135-1992,ISO/IEC 9075:1992,SQL-92(SQL2)
* 1999年,ISO/IEC 9075:1999,SQL:1999(SQL3)
* 2003年,ISO/IEC 9075:2003,SQL:2003
* 2008年,ISO/IEC 9075:2008,SQL:2008
* 2011年,ISO/IEC 9075:2011,SQL:2011
其中比较重要的标准是 SQL-92, 因此本文主要讨论 SqlDdlDao 对于 SQL-92 版标准内容的支持程度.
参考链接: https://blog.csdn.net/BeiiGang/article/details/43194453
SqlDdlDao 目前只是一个查询工具, 因此基于SQL语句的增删改基本上都没有实现.
修改数据的能力由 common 开放的 java 方法实现.
[ WITH tableName1 AS ( query ), tableName2 AS ( query ), ... ]
SELECT [ DISTINCT ] { * | exprs }
FROM { table | ( query ) }
[ WHERE expr ]
[ GROUP BY exprs ]
[ HAVING expr ]
[ ORDER BY expr [ ASC | DESC ], expr [ ASC | DESC ], ... ]
[ SKIP skip]
[ LIMIT [ skip, ] limit ]
[ UNION [ ALL ] <another query> ]
查询语句 | 支持程度 |
---|---|
USE | 支持 |
SHOW DATABASES [LIKE ‘%aa%’] | 支持 |
SHOW TABLES [FROM DB_NAME] [LIKE ‘%aa%’] | 支持, 允许跨数据源 |
SHOW TABLE STATUS [FROM DB_NAME] [LIKE ‘%aa%’] | 支持 |
SHOW CREATE TABLE | 支持 (nosql数据库使用第一行模拟) |
SHOW COLUMNS FROM / DESCRIBE / DESC | 支持 (nosql数据库使用第一行模拟) |
SHOW [FULL] PROCESSLIST | 支持 (模拟) |
SHOW FUNCTIONS | 支持 (模拟) |
SET @a := 1 | 支持 |
UNION / UNION ALL | 支持, 允许跨数据源 |
SELECT DISTINCT | 支持 |
CASE WHEN THEN ELSE END | 支持 |
FROM table / FROM (select …) | 支持 |
FROM table1 a, table2 b | 非 jdbc 数据源: 不支持 jdbc 数据源: 直接转发给数据库 |
WHERE a in (select …) | 支持, 允许跨数据源 |
GROUP BY | 支持 |
HAVING a in (select …) | 支持, 允许跨数据源 |
ORDER BY | 支持 |
SKIP / LIMIT | 支持 |
[INNER / LEFT / RIGHT / FULL] JOIN | 非标准语法支持, 允许跨数据源 |
ON / USING | 支持 |
数据类型 | 支持程度 |
---|---|
BOOLEAN | 支持 |
CHAR(n) / CHARACTER(n) | 支持 |
VARCHAR(n) / VARCHAR2(n) | 支持 |
CHARACTER VARYING(n) | 支持 |
INTEGER / INT / SMALLINT | 支持 |
DECIMAL(p,s) / DEC(p,s) / NUMERIC(p,s) / FLOAT(p) / REAL | 支持 |
DOUBLE PRECISION | 支持 |
DATE / datetime / timestamp | 支持 |
TIME | 未评估 |
INTERVAL year-month / day | 未评估 |
BLOB | 不支持 |
条件 | 支持程度 |
---|---|
< > <= >= <> = | 支持 |
AND OR NOT | 支持 |
IS [NOT] NULL | 支持 |
[NOT] LIKE | 支持 |
[NOT] IN ( [,…] ) | 支持 |
[NOT] BETWEEN x AND y | 支持 |
[CONDITIONAL] ANY ( [,…] ) | 不支持 |
[CONDITIONAL] ALL ( [,…] ) | 不支持 |
‘abc’ [NOT] REGEXP ‘^a.*’ | 支持 |
‘abc’ [NOT] RLIKE ‘^a.*’ | 支持 |
函数 | 支持程度 |
---|---|
AVG / MAX / MIN / SUM / COUNT | 支持 |
GREATEST / LEAST(x,y,…) | 支持 |
ROUND | 支持 |
TRUNC(x,places/date,format) | 不支持 |
POSITION(s1 IN s2) | 不支持 |
EXTRACT(datetime FROM datetime_value) | 支持 |
CHAR_LENGTH(s1) / LENGTH(s1) | 支持 |
SUBSTRING(string FROM start [FOR length]) / SUBSTR(string,start,length) | 部分支持 |
INSTR(str,substr,start,mnth) | 不支持 |
INITCAP | 支持 |
UPPER / LOWER(string) | 支持 |
TRIM(BOTH/LEADING/TRAILING char FROM string) | 支持 |
[L/R]TRIM(str,chrset) | 支持 |
TRANSLATE / CONVERT(char USING value) / TRANSLATE(str,from,to) | 部分支持 |
[L/R]PAD(str,to_len,str2) | 支持 |
DECODE(expr,search1,result1,…[,default]) | 不支持 |
NVL(expr,replace) | 支持 |
Date Format - ROUND / TRUNC / TO_CHAR / TO_DATE(value,fmt) | 部分支持 |
IF / IFNULL / COALESCE | 支持 |
参考链接: https://blog.csdn.net/zhongmengya/article/details/5049025
像 now(), curdate(), FIND_IN_SET() 等函数, 未被此版规范提及, 因此上表未有列出.
可以使用 show functions 查询所有支持使用的非聚合函数.
set @a = 1+1;
set @a = (select count(1) from t)
可以用以下链接尝测试执行sql, 其中的 sql 及 json数据 可以随意替换. 也可以使用测试表: sql_demo_table,mongo_demo_table,cinema_info