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

24238 次点击
所在节点    Java
163 条回复
vone
2020-11-22 01:33:41 +08:00
@liuhan907
@chinvo
很明显楼主没接触过 .NET 生态。Entity Framework 很多年前就做到了楼主想做的,不仅提供更像 SQL 的 C# ,同时也提供的一套更像 C# 的 SQL 。

假设目标 SQL 为:
SELECT TOP 10 OrderID, Freight FROM Orders ORDER BY Freight DESC


在 .NET (C#) 中使用兰姆达表达式的写法:
Orders.OrderByDescending (m => m.Freight).Select (m =>new{OrderID = m.OrderID,Freight = m.Freight}).Take (10)

在 .NET (C#) 中 LINQ (类 SQL )的写法:
(from m in Orders orderby m.Freight descending select new { m.OrderID,m.Freight }).Take(10)

详细文档:
https://docs.microsoft.com/zh-cn/dotnet/csharp/programming-guide/concepts/linq/basic-linq-query-operations
pagepancn
2020-11-22 01:36:38 +08:00
为你的执行力和技术能力点赞,但是真的用处不大。程序员思维啊,缺乏商业眼光
laminux29
2020-11-22 02:18:27 +08:00
1.题主的精神还是值得赞扬的,开源就是需要这种精神,不然开源界完蛋了。

2.做开源有两个麻烦的地方,第一是花了几年功夫辛辛苦苦实现了某个功能,结果官方或别的组织更新一下出了更好的组件,这就尴尬了。第二是写之前没有去做大量的调研,没注意到市面上已经有了更好的实现,比如各大语言的 lambda 表达式。
msg7086
2020-11-22 03:55:05 +08:00
表现力是硬伤。用惯 Ruby 的表示这些用 DSL 写写真是小菜一碟……Java 的话可能会难不少。
kingfalse
2020-11-22 04:24:49 +08:00
不喜欢 Lombok,更不喜欢再多装一个同类的,好奇两个会不会冲突什么的
justin2018
2020-11-22 08:32:20 +08:00
以为是 iOS 的 Objective-C
Braisdom
2020-11-22 09:28:50 +08:00
@vone 兄弟我还真看过,Entity Framework 针对 比较运算符和逻辑运算符是无法支持的,例如

SELECT * FROM Orders WHERE OrderID > 10 AND Freight = 1

这类写起来太复杂了。

在 ObjectiveSQL 中,缺很方便。

select.where( order.orderId > 10 && order.freight.eq(1) )
Braisdom
2020-11-22 09:29:38 +08:00
@kingfalse 两者不会冲突,Lombok 有人爱,有人恨,很正常的,就像 Java 一样,你可以爱他,也可以恨他。
dick20cm
2020-11-22 09:38:02 +08:00
老哥真的牛逼!!
cmlanche
2020-11-22 09:43:42 +08:00
@pagepancn 我觉得很好
zhuangzhuang1988
2020-11-22 09:45:51 +08:00
牛逼.
nannanziyu
2020-11-22 09:49:47 +08:00
@Braisdom
LINQ 里
Orders.Where(x=>x.orderId > 10 && x.freight == 1)
huskar
2020-11-22 10:38:07 +08:00
我感觉这种特性只有在语言层面支持才有意义,第三方库实现的总归写起来麻烦。。。就像各种语言都有类似这种库,但实际用的多的只有 c#的 linq 。
之前刚学 kotlin 的时候也仿照 linq 写了一个类似的东西,利用 kotlin 的中缀表达式能搞的很像直接写 sql,但写完后自己也从来没用过。。。
Braisdom
2020-11-22 10:39:06 +08:00
@nannanziyu 兄弟,那是对已经出来的数据进行过滤,而不是在 SQL 中过滤的,
Braisdom
2020-11-22 10:39:55 +08:00
@huskar kotlin 和 Scala 很容易的,语言自身就支持运算符重载的。
nannanziyu
2020-11-22 10:57:03 +08:00
@Braisdom
你的理解是错误的,你需要再了解一下 linq
renyijiu
2020-11-22 11:05:58 +08:00
有实际生产项目使用经验吗?
icew4y
2020-11-22 11:19:12 +08:00
@Braisdom 楼主很牛,楼上有些嘲讽的,估计都是调包侠
levon
2020-11-22 11:25:53 +08:00
@Braisdom 并不是对已经读出来的数据过滤,这些最后都会生成对应的 sql 语句的
uselessVisitor
2020-11-22 11:26:51 +08:00
支持

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

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

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

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

© 2021 V2EX