历经 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

24305 次点击
所在节点    Java
163 条回复
Braisdom
2020-11-22 11:39:19 +08:00
@renyijiu 现在有 4,5 个公司在用,毕竟刚刚发布 2 个月左右,问题肯定比较多,我也会及时修复的。
avalon8
2020-11-22 11:42:18 +08:00
为老哥点个赞,牛逼
Braisdom
2020-11-22 11:46:53 +08:00
社区的建设也在准备中,希望更多兄弟参与进来,后面我也将内部的技术原理整理并分享出来。里面的骚操作比较多,不是很常用,缺很实用。
mzlgx
2020-11-22 11:47:15 +08:00
有点意思
fafa2npu
2020-11-22 11:53:20 +08:00
@Braisdom 首先题主真的很牛逼。但是,querable 的 LINQ 确实是在 SQL 中过滤的,EF 中有个 lazy load,只有在 ToList()等需要取数据的时候才会真正在数据库端执行查询语句。
fafa2npu
2020-11-22 11:55:11 +08:00
给老哥点个赞
Braisdom
2020-11-22 11:58:30 +08:00
@fafa2npu 我仔细研究一下 LINQ,要看最终执行的 SQL 是什么,可以参考一与它的实现原理。其实动态 SQL 只是其中一部分特性
running17
2020-11-22 11:59:50 +08:00
点赞,牛逼
abcbuzhiming
2020-11-22 12:00:01 +08:00
感觉有点像 Linq,但是我要说的是,这条路已经有人试验过了,不太合适——所有像 SQL 的,为啥不直接用 SQL ?这就是问题的根源,SQL 虽然表达能力一般,但是生命力很强,强到像它的都没熬过它
Braisdom
2020-11-22 12:04:41 +08:00
@abcbuzhiming 我要解决的问题如下:
1 )重用性,一个复杂查询中经常会多次 JOIN 同一张表,只有少量变化,SQL 无法解决,只通过通过过程化编程语言解决,Java 只是一种选择而已。
2 )动态性,一个复杂查询中会根据参数不一样,JOIN 不同的表 /子查询,投影不同的字段,当然 Where 后的表达式会有较大的变化。
3 )单元测试,一个复杂 SQL 拆分成多个过程,针对过程进行单元测试,而不是一条非常复杂的 SQL 进行测试
xiangwan
2020-11-22 12:07:15 +08:00
@abcbuzhiming sql 是声明式语言,更先进

@Braisdom jooq 模仿的 linq
Braisdom
2020-11-22 12:15:13 +08:00
@xiangwan jooq 我参考过,看过它的代码,设计理念很好,但程序设计一般,不够灵活,最关键是的它的代码需要手动生成,每次调整完之后,都得生成一下代码才能编译通过,好麻烦。

SQL 语言设计的初衷是为数据分析人员提供的一种语言,比较接近自然语言,但和逻辑型编译语言结合不是很友好,
目前所有逻辑型编程语言里,都是以字符串的形式存在。

其实回归本质,Java 语言是一门高度抽象的语言,它可以解释一切知识领域,数据库只是一个领域而已,如果没有 SQL 你会怎么设计,怎么样用面向对象的方式设计数据库的访问。

第一性原理,我设计时,先参考现有的知识,然后再忘掉所有的知识,它原本应该怎么样。
Betsy
2020-11-22 12:19:14 +08:00
印象中 calcite-linq4j 貌似也实现了这样玩法,老哥这个项目跟那个有啥不一样的地方吗?
Braisdom
2020-11-22 12:35:27 +08:00
@Betsy Calcite 在我们公司里用了,linq4j 和我的差别很大的,它只是 Java8 Stream 中的扩展,只是对内存中的数据进行过滤和计算,Calcite 本质上是一个关系数据库的计算引擎,做的很不错,后面我也会集成进我的项目,实现异构数据源的计算。
dswyzx
2020-11-22 12:50:09 +08:00
我还是喜欢自己掌控 sql 语句,说实在的,通过 linq 去规范以达到运行时报错,或怎么样的好处。在我的狭隘理解里,为何不去掌握好好写 sql 的能力,甚至还可以让公司的 dba 来主动优化这个东西。有人可以辩论一二吗
comsweetcs
2020-11-22 12:53:03 +08:00
首先为楼主的技术点赞。但我真是讨厌 SQL,SQL 调试起来没代码直观,我就是做数据开发的,感觉写代码控制粒度更好,个人觉得后端不可能演变成这种方式,过于死板,不够灵活。
Braisdom
2020-11-22 12:54:54 +08:00
@dswyzx DBA 和程序员的职责不一样,面对的问题域也不一样。
DBA:通常面对的是静态问题,考虑的场景也比较单一,用 SQL 作为工具是比较合适,无论是优化,还是维护 SQL 可能是最价的选择,就像脚本型语言是 运维工程师的最爱。

程序员:通过面对的是动态问题,一段含有 SQL 和 Java 的代码逻辑需要满足很多场景,各种奇怪的使用方式,SQL 的构造过程也非常复杂,此时 SQL 语法逻辑和表现力就够用了,如果是纯粹的字符串拼接,也会让程序员崩溃,简单的还好,真复杂起来解决 Bug 的成本 就很高了。
Braisdom
2020-11-22 12:57:27 +08:00
@comsweetcs 思考的角度不一样,处理的问题域不一样,对工具的选择就会不同,我们需要更客观的分析
dingyaguang117
2020-11-22 13:05:10 +08:00
赞 像 sqlalchemy
Pursue9
2020-11-22 13:27:41 +08:00
.net 这边已经不写 sql 很多年了,EFcore 已经完全满足操作数据库的需要,生成的 sql 也可以记录在日志里
完全不写 SQL 的 orm 是可行的

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

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

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

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

© 2021 V2EX