历经 3 年,终于得以实现了

2020-11-21 23:19:37 +08:00
 Braisdom

写了 15 年的程序,人到中年总有很多话要说,千言万语尽在项目里,里面有我想说的一切。

项目地址: https://github.com/braisdom/ObjectiveSql

ObjectiveSQL 是我构想了很长时间,到底是让 Java 像 SQL 一样编程,还是让 SQL 让 Java 一样编程,纠结了很久,还是让 Java 更像 SQL,Java 的语法表现力不够,只能扩展 Javac,实现了算法运算,比较运算,逻辑运算符重载,并封装了常用数据的的函数,抽象了 Expression,使的 Java 非常接的 SQL,同时也实现了简单 SQL 编程的代码生成,基本不需要写代码,也不需要配置就能实现简单 SQL 的编程,话不多说,先看示例,有兴趣可以到 github 上看。

Order.Table orderTable = Order.asTable();
Select select = new Select();

select.project(sum(orderTable.amount) / sum(orderTable.quantity) * 100)
    .from(orderTable)
    .groupBy(orderTable.productId);
Member.Table member = Member.asTable();
Order.Table order = Order.asTable();

Select select = new Select();

select.from(order, member)
        .where(order.memberId.eq(member.id));
select.project(member.no,
        member.name,
        member.mobile,
        countDistinct(order.no).as("order_count"),
        sum(order.quantity).as("total_quantity"),
        sum(order.amount).as("total_amount"),
        min(order.salesAt).as("first_shopping"),
        max(order.salesAt).as("last_shopping"));
select.groupBy(member.no, member.name, member.mobile);

ObjectiveSQL is an ORM framework in Java base on ActiveRecord pattern, which encourages rapid development and clean, codes with the least, and convention over configuration.

Features

25969 次点击
所在节点    Java
163 条回复
Braisdom
2020-11-22 13:42:16 +08:00
@Pursue9 认可你的想法,数据分析只是一个问题域,SQL 只是一个协议,我们访问网络时,完全不知道它底层的结构,我们在做 HTTP 应用时,基本也不会接触 HTTP 协议本身,统计和分析数据理论上也应该一样的方式进行演进。
Lemeng
2020-11-22 13:46:19 +08:00
赞,学习学习的
beginor
2020-11-22 14:01:50 +08:00
linq 在 .net 上存在好多年了, 这是不争的事实, 在很多场景下确实比手写 SQL 方便。

在 .net 中有表达式树的概念, 通过分析代码中的表达式树, 动态的转换成 SQL 表达式, 甚至是不同数据库的方言,NHibernate 可以说是典范, 这大概是为什么 NHibernate 仍在活跃开发的原因吧。

当年, .net 平台上也有 mybatis.net , 但是基于 linq 的查询流行之后, 这种手写 SQL 的半自动框架就逐渐没落了。

当然, 完全不写 SQL 也是不可能的, 毕竟 SQL 是基础, 很多复杂的查询也用 SQL 来实现最高效。

凡是都有个二八原则, 不必求全责备。
fangcan
2020-11-22 14:06:03 +08:00
牛皮 点赞
Braisdom
2020-11-22 14:08:51 +08:00
@beginor 是的,SQL 历史已经很长,新型技术完全替代,可能需要很长的时间,甚至需要的是一代人。
我们的脑子里要有两个世界,一个是客观存在的世界,一个是我们主观认为的一种世界(也就是世界应该怎么样)。

有时主观认为的世界里有一些正确的事情,客观世界里不一定接受,随着技术的进步,有可能被超越,也有可能在若干后成为主流。
beginor
2020-11-22 15:57:05 +08:00
这个也可以参考一下,https://github.com/my2iu/Jinq
Braisdom
2020-11-22 16:08:49 +08:00
@beginor Jinq 和 ObjectiveSQL 有点类似,但还是有本质的区别,
1 ) Jinq 的表达式依然是 Java 基础表达式形式,也就是只能按 Java 规范进行表达式计算,但在 SQL 中通常会遇到函数调用后的表达式计算
2 ) Select 和 Where 是通过 lambda 解析实现,代码表现力差太多了
tikazyq
2020-11-22 16:26:08 +08:00
这是要跟 Entity Framework 一较高下么
zhangysh1995
2020-11-22 16:36:40 +08:00
点了,支持一下!
Cbdy
2020-11-22 16:46:06 +08:00
很厉害。
说说我的看法,你的目的是类型安全(基于 Java 的类型系统),你尝试达到这个目的的方法是设计一个基于 Java 的 DSL 。
但是(我要泼一下冷水),SQL 就是 SQL,你的 SQL 生成器再精妙,还是不如直接写 SQL 来得简洁有力。
我就不喜欢什么 Linq 、JOOQ,这些东西都是脱裤子放屁,千方百计要用代码去生成 SQL 语句,而不是直接写 SQL 。
一方面,写 SQL 是必要的工作,最终调优的时候、Troubleshooting 的时候还不是要去看 SQL ?类型不安全的 SQL 往往在写代码的时候就会发现,这个问题也不是写 SQL 面临的主要矛盾。更多的,SQL 也是一门久经考验的“语言”,也有丰富的静态检查工具。
我支持 SQL 。
Braisdom
2020-11-22 16:53:52 +08:00
@Cbdy 其实很多人都有你这样的想法,我前期遇到很多这样的想法来挑战 ObjectiveSQL,喜欢与不喜欢是很主观的,我也不参与这样的争论,就像争论哪种编程语言好一样

我们需要更客观一点看,有的公司 SQL 多,有的公司 SQL 少,有的复杂,有的相对简单,这样的背景下在选择工具时就会有不同的想法。

我是经历过一个项目中存在 500 - 1000 条长度超过 400 行的 SQL,平均每个 SQL 需要 JOIN 20 张表或子查询(有较多重复),在这样的场景下 SQL 的维护成本,修复 Bug 的成本,单元测试的成本是巨大的。

这些经历导致了我的项目的出现,当然 @Cbdy 你可能有不一样的背景。
Cbdy
2020-11-22 17:07:08 +08:00
@Braisdom 确实可能存在你说的情况,那种情况无论用什么工具都是很复杂的,因为数据存成这样,已经有一个复杂度在了。我觉得要控制这个复杂度的话,应该从数据角度出发。

这种场景基本是 OLAP 或者出报表吧,如果是这样,可以考虑抽取数据到宽表,或者更灵活的非关系存储
uptonking
2020-11-22 17:07:52 +08:00
虽然有很多质疑,我还是觉得楼主很厉害,开源就是要经得起检验,,,可以参考下大家提到的优秀方案,然后吸收一部分到 objectiveSQL,把 README 或项目主页写详细点
Braisdom
2020-11-22 17:18:11 +08:00
@Cbdy 很多应用都会有报表的,只是多少的问题,Java 的代码可以成千上万行,有语法层结构化的形式进行管理,同样也存在很多模式和规范,这块在 SQL 上就很少了,SQL 的工程化能力远远不如 Java 。

所以通过 Java 的形式去写 SQL 是很必要的,但 SQL 已经诞生了很多年,而且被很多人所接受,如果设计一套全新的语法模式,大众很难接受,这样项目的生命力也不强,所以我尽可能的让 Java 代码接近 SQL,符合大众的味口,哈哈。

“Dynamically SQL programming with Java syntax, and very close to SQL syntax”

我之前设计过一个语言,我称它为 JDS(Java Database Script) 后来放弃了,在我的 github 也有。
Braisdom
2020-11-22 17:27:09 +08:00
@uptonking 是的,只有经得起大家挑战的项目才有生命力,总是靠人扶肯定长不大的。
Cbdy
2020-11-22 17:28:47 +08:00
@Braisdom Java 是通用语言,SQL 是领域特定语言,把 Java 和 SQL 进行比较还是蛮怪的。如果要说他们之间的关系,SQL 可以成为 Java 能力的延伸,本身和 Java 不矛盾。试图用 Java 解决所有问题才是比较奇怪的做法。况且很多数据库都有专有的语法,函数库,用的时候隔着一层“通用”的封装,可能会很鸡肋。
mumubin
2020-11-22 17:29:55 +08:00
自己做出来这个工具,老哥还是很值得肯定的。不过作为程序员我还是喜欢直接写 sql,及其讨厌非 sql 的 orm 。所以我还是最喜欢 mybatis 。维护一个 django 项目,自带 orm 中的坑点不少,而且 slow sql 都挺难定位的。
Braisdom
2020-11-22 17:35:51 +08:00
@Cbdy 要从不同的角度去理解 SQL,SQL 其实和 HTTP,SMTP 这类协议一样,只不过 SQL 是解决 Java 与数据库交互的一种协议,我相信你不会手动编码去实现 HTTP,SMTP 这类协议的,都是通过更高层的封装去访问,当然如果做更底的编码,还是会涉及的。
Braisdom
2020-11-22 17:37:05 +08:00
@mumubin 很多人都有你这样的想法,slow sql 也是我下一阶段需要解决的,如果通过单元测试排查一部分常见的问题。
Cbdy
2020-11-22 17:49:12 +08:00
@Braisdom SQL 是 Query DSL,HTTP 这种事 Application layer communication protocol,他们的复杂度、拓展性、和解决的问题是不同的,怎么能混为一谈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/727939

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX