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

25977 次点击
所在节点    Java
163 条回复
CatTom
2020-11-23 17:15:58 +08:00
老哥,我在导入你的 jar 时 maven 一直报错识别不到。。。。。
Braisdom
2020-11-23 17:30:39 +08:00
@CatTom 你加我微信, braisdom
Braisdom
2020-11-23 17:33:42 +08:00
@CatTom 稍等,我知道原因了。
bxb100
2020-11-23 17:40:14 +08:00
有性能优化的比较吗
Braisdom
2020-11-23 17:53:52 +08:00
@CatTom 这两天一直写分页的,忘记发布一个 pom 了,不好意思,正在搞。
Braisdom
2020-11-23 17:54:14 +08:00
@bxb100 你所说的性能是指哪方面性能
bxb100
2020-11-23 17:58:02 +08:00
@Braisdom #146 内存, 速度之类的
Gugetech
2020-11-23 17:59:55 +08:00
很赞哦,已 star
Braisdom
2020-11-23 18:30:02 +08:00
@bxb100 老实说,性能指标还真的不好搞,主要因为 ObjectiveSQL 是一个无状态的框架,本身不存储任何东西,唯一需要验证的是内存泄露,SQL 的构造也都是字符串拼接,本质上不会有性能问题。
a4854857
2020-11-23 19:31:27 +08:00
等楼主成了.以后有人再来挖贴的时候
记得我是第一个叫你 B 大的人
henryshen233
2020-11-23 19:48:33 +08:00
@Braisdom 楼主,#114 好像说的是首页有些人说话语气有问题
Braisdom
2020-11-23 21:12:35 +08:00
@CatTom 抱歉,1.3.8 版本是我测试不充分,我调整了 pom 依赖,
tt0411
2020-11-23 21:31:07 +08:00
为楼主点个赞.

但从实用角度和个人偏好来说, 能直写 sql 就绝不用各类 dsl/自动 SQL 生成 的框架: 一方面专门学一套新的接口 ROI 不高, 另一方面真的遇到问题是, 看 SQL 改 SQL 也比接口更容易.
Braisdom
2020-11-23 21:42:04 +08:00
@tt0411 其实我不是很喜欢 DSL 这个概念,按道理说 SQL 是一个 DSL,而 Java 是基于自身的抽象能力与表达能力使得 SQL 更便于逻辑控制。
当然,这是我个人的感觉,每个人有不同的背景,也会有不一样的认知,没有对与错,只是会用不同的方式进行工作而已。
Braisdom
2020-11-24 12:47:37 +08:00
@CatTom 已经更新,可以按 readme 更新一下版本信息
aguesuka
2020-11-24 12:49:32 +08:00
楼主了解依赖类型(dependent type)吗。我想过为什么 java 表现不了 sql,这个是答案之一。不过 sql 是基于集合论而非类型论,所以拘束于 sql 语法是实现不了类型安全的
Braisdom
2020-11-24 13:05:03 +08:00
@aguesuka 你说的很对,SQL 语言是一种已经被习惯的数据查询和分析语言,最初的设计是直接给人使用的,而不是为程序设计的,逻辑控制、强类型等程序化的概念的使用是需要专业训练的。

我挑战的是 SQL 语言在程序上的表现力,目前只是第一个版本,我的想法还没有充分彰显。

对权威的挑战必定会迎来更多人的挑战,这是正常的,没有对权威的挑战,这个时代也就不会进步了。
Joker123456789
2020-11-25 14:16:37 +08:00
我也是做开源项目的,也遭遇过不少质疑,从这个角度来看,我真的很想说一些鼓励的话,甚至支持一下。我最近也看到这个项目在 osc 上得奖了。

但是我还是想理性分析一下:

1. 一般来说,我们在开发的时候如果需要操作数据库,会怎么办?我想大多数人都是在 navicat 里写 sql,测好以后,再贴到项目中来, 而用了你这个,只需要直接在项目中写代码即可,省去了粘贴的步骤。

2. 第 1 点看似是提高了效率,但是也引发了另一个问题,如果在 navicat 里写 sql,用工具也可以通过可视化的方式生成 sql,写起来并不慢,而且验证速度非常快,只需要点击一个按钮即可, 而在项目中用你这个写的话,验证就得启单测了,这个速度相差的可不是一点点。

我之前也想过要在我的项目中加入类似的功能,但是考虑到开发效率,就放弃了。毕竟一切的工具都是为了提高干活的效率,或者运行效率,如果没有这个前提的话,所有的花样都只是一种新鲜感。

如果你可以解决这个问题的话,比如开发配套的 idea 插件 或者 其他方法,相信大家会更愿意使用的。
Braisdom
2020-11-25 15:11:45 +08:00
@Joker123456789 你的分析很到位,一个工具很难做到面面俱到,不太可能适应所有的场景,有舍才有得。
1 ) ObjectiveSQL 主要解决动态 SQL 的编程,所谓动态:也就是 SQL 结构很难通过字符串接近的形式实现,这种场景下,传统 SQL 想变为程序很困难,将这样的程序直接变成 SQL 也不容易,ObjectiveSQL 会通过单元测试的形式提供完成 SQL 。

2 )其实,程序员到底是看到 SQL 呢,还是还到 Java 一直是矛盾的中点,试想一下,如果没有 SQL 的存在,大家直看 Java 会是什么样的一种状态。
CatTom
2020-12-17 10:19:40 +08:00
@Braisdom 没事没事,大佬辛苦了

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

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

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

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

© 2021 V2EX