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

25971 次点击
所在节点    Java
163 条回复
heiheidewo
2020-11-22 17:50:56 +08:00
牛逼,长见识了
felixcode
2020-11-22 17:55:22 +08:00
如果要针对数据库做 sql 优化能做吗?
Braisdom
2020-11-22 17:57:21 +08:00
@Cbdy 你说的很对,SQL 的复杂度相比其它是高出很多,但从抽象的角度去看,它就是一种协议,只不过这种协议承载了较多关系型数据的计算逻辑和统计方式而已。

我只是做了一个类比,传输层协议更多是定义结构,其内存的逻辑更多是由程序控制的。

数据库设计的初衷就是为了封装数据的计算逻辑,降低外部应用程序的复杂度,提供简单的交互协议实现数据计算,但随着数据统计方式的发展,问题领域的复杂度变化,传统的方式编写 SQL 已经很难满足分析需求了,只就需要逻辑型编程语言提供封装,隐藏复杂的构造过程。
Braisdom
2020-11-22 18:00:32 +08:00
@felixcode 你说的其实一个 SQL 性能测试引擎,完全做到很难,毕竟场景太复杂,但随着不断的迭代,能够避免大量 SQL 的错误,这是我下一阶段工作的重点。
vipcc
2020-11-22 18:05:07 +08:00
.net core 中的 ef core +linq,老哥可以看一看
现在都是开源的
Braisdom
2020-11-22 18:06:17 +08:00
@vipcc 感谢,我会参考一下,前面已经有好几位兄弟介绍了。
felixcode
2020-11-22 18:06:23 +08:00
你做的东西可能比较有用,但你对 SQL 语言的理解局限性太大了。

结合 dbms 的具体实现,sql 从顶层的描述到底层的控制都是能做的,你做一层翻译后,牺牲了 sql 语言的很多特性。
Cbdy
2020-11-22 18:20:42 +08:00
传统的方式编写 SQL 已经很难满足分析需求了,只就需要逻辑型编程语言提供封装,隐藏复杂的构造过程

难道不是 data flow 、data structure 设计有问题吗?😂
beginor
2020-11-22 18:26:40 +08:00
楼主的这个项目非常有意义,Java 确实没有强大的,广为人知并且深入人心的类似于 Linq2SQL 的 ORM 框架, 但是 Linq2SQL 的功能在 .Net 平台上已经深入人心, 被绝大多数人所接受。

在 .Net 平台的刚刚开始出现 Linq2SQL 的功能的时候, 很多人也是类似的泼冷水。 但是 Linq2SQL 确实成功的提升了许多 .Net 开发者的生产力。

我是做 .Net 出身, 最近几年也接触过一些 Java 的项目, 两个平台都了解一些, 也可以说是深有感触。

不过这种项目最好有大公司参与推广, 单纯个人推广会很难。
optional
2020-11-22 19:21:43 +08:00
隔壁有个 ktorm,虽然不是 java 但是可以一起用的
hangs
2020-11-22 20:15:55 +08:00
@Braisdom 请教两点

1. 插件是必须装的吗,还是引入对应的 maven 依赖即可。

2. 在简单 ORM 不涉及复杂计算的情况下,mybatis 、hibernate 和您这个框架优劣势分别是哪些呢
Tlin
2020-11-22 20:19:19 +08:00
这些都是什么人啊 那么厉害吗
看来我不敢发言了………………

真厉害啊!👍👍👍👍👍
怎么看老哥像技术胖呢
xrr2016
2020-11-22 21:06:30 +08:00
看起来像一种 ORM,类似于 https://www.prisma.io 这个吗?
WhoMercy
2020-11-22 21:13:10 +08:00
感谢、收藏。

下次做练手项目再来试试老哥这个框架。
bojue
2020-11-22 21:14:27 +08:00
@Tlin 你不是一个人,技术胖没这个实力
Braisdom
2020-11-22 21:26:51 +08:00
@beginor 非常认可你的说法,没有大公司的背书,项目很难起来。
Braisdom
2020-11-22 21:28:33 +08:00
@hangs 兄弟,插件是必须的,由于 IntelliJ IDEA 的 Java 语法检测太严谨,我已经提了 issue 给他们了,说是会有改进,我是自动生成 java 代码,没有 IDE 的支持很难完成。
Braisdom
2020-11-22 21:30:14 +08:00
@Cbdy 问题领域的复杂度是无法避免的,所以需要通过 Java 去避免复杂度的蔓延
Braisdom
2020-11-22 21:43:34 +08:00
@hangs 如果不涉及复杂 SQL,你可参考一下我 git 文档里的描述,自动代码生成相比其它 ORM,优势自已体会一下,我说再说也不没有说服力。
Braisdom
2020-11-22 21:48:32 +08:00
@zhangysh1995 感谢支持

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

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

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

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

© 2021 V2EX