V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  Braisdom  ›  全部回复第 30 页 / 共 30 页
回复总数  598
1 ... 21  22  23  24  25  26  27  28  29  30  
2020-11-22 12:15:13 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
@xiangwan jooq 我参考过,看过它的代码,设计理念很好,但程序设计一般,不够灵活,最关键是的它的代码需要手动生成,每次调整完之后,都得生成一下代码才能编译通过,好麻烦。

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

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

第一性原理,我设计时,先参考现有的知识,然后再忘掉所有的知识,它原本应该怎么样。
2020-11-22 12:04:41 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
@abcbuzhiming 我要解决的问题如下:
1 )重用性,一个复杂查询中经常会多次 JOIN 同一张表,只有少量变化,SQL 无法解决,只通过通过过程化编程语言解决,Java 只是一种选择而已。
2 )动态性,一个复杂查询中会根据参数不一样,JOIN 不同的表 /子查询,投影不同的字段,当然 Where 后的表达式会有较大的变化。
3 )单元测试,一个复杂 SQL 拆分成多个过程,针对过程进行单元测试,而不是一条非常复杂的 SQL 进行测试
2020-11-22 11:58:30 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
@fafa2npu 我仔细研究一下 LINQ,要看最终执行的 SQL 是什么,可以参考一与它的实现原理。其实动态 SQL 只是其中一部分特性
2020-11-22 11:46:53 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
社区的建设也在准备中,希望更多兄弟参与进来,后面我也将内部的技术原理整理并分享出来。里面的骚操作比较多,不是很常用,缺很实用。
2020-11-22 11:39:19 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
@renyijiu 现在有 4,5 个公司在用,毕竟刚刚发布 2 个月左右,问题肯定比较多,我也会及时修复的。
2020-11-22 10:39:55 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
@huskar kotlin 和 Scala 很容易的,语言自身就支持运算符重载的。
2020-11-22 10:39:06 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
@nannanziyu 兄弟,那是对已经出来的数据进行过滤,而不是在 SQL 中过滤的,
2020-11-22 09:29:38 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
@kingfalse 两者不会冲突,Lombok 有人爱,有人恨,很正常的,就像 Java 一样,你可以爱他,也可以恨他。
2020-11-22 09:28:50 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
@vone 兄弟我还真看过,Entity Framework 针对 比较运算符和逻辑运算符是无法支持的,例如

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

这类写起来太复杂了。

在 ObjectiveSQL 中,缺很方便。

select.where( order.orderId > 10 && order.freight.eq(1) )
2020-11-22 00:29:00 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
@shade apijson 好像不是同一类东西
2020-11-22 00:28:37 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
@liuhan907 什么叫山寨版,相比现有的 ORM 框架,优势主要体现在:
1 )动态代码生成,类似 Lombok
2 ) Java 运算符重载,领先于现有的所有 ORM 框架
3 )函数封装是参考 JOOQ 的
2020-11-22 00:09:25 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
一门语言,它的语法表现边非常重要,能够准确的描述出业务领域的关键特征,是一段代码可维护性的重要标志
2020-11-22 00:07:57 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
@VHacker1989 像这样的代码:“ sum(orderTable.amount) / sum(orderTable.quantity) * 100”
你猜 MyBatis, JOOQ, QueryDSL 会写成什么样?
2020-11-22 00:06:10 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
@VHacker1989
1 )首先我做这个项目前肯定是看过 JOOQ, QueryDSL 这类项目的,它有致命缺点就是 Java 的表达式无法 SQL 表达式重合,这会导致所谓的 SQL Builder 在复杂 SQL 中根本无法使用,我项目里有个计算同环比的简单示例,有大量的数运算和逻辑运算,如果运算符通过函数的形式实现,那样的代码根本无法看。
2 )我的项目中参考了 Lombok 的动态代码生成,能够减少绝大部分的重复代码,它们是无法做的。
2020-11-21 23:50:56 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
@1194129822 是的,我对比过它的 DynamicSQLBuilder,它做的太土了,大都数都是以字符串的形式体现,我的改进有三块:
1 )动态代码生成:模型中的所有字段都会被动态生成一个 Order 的内部类 Table 中的字段。
2 )算术运算、比较运算符和逻辑运算重载,也就是说 Java 中的 +, -, * / , >, <, &&, || 都会转换成 SQL 语句中的表达式,
3 )我封装了常用数据库的常用函数,例如:count, sum 等有上千个的,这样就不会出现字符

上述做法的好处是,最大程度的避免的 SQL 的语法错误,动态代码提示和单元测试。
2020-11-21 23:36:30 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
第二段 Java 代码生成的 SQL 如下:
SELECT
`T0`.`no` ,
`T0`.`name` ,
`T0`.`mobile` ,
COUNT(DISTINCT `T1`.`no` ) AS `order_count`,
SUM(`T1`.`quantity` ) AS `total_quantity`,
SUM(`T1`.`amount` ) AS `total_amount`,
MIN(`T1`.`sales_at` ) AS `first_shopping`,
MAX(`T1`.`sales_at` ) AS `last_shopping`
FROM
`orders` AS `T1`,
`members` AS `T0`
WHERE
(`T1`.`member_id` = `T0`.`id` )
GROUP BY
`T0`.`no` ,
`T0`.`name` ,
`T0`.`mobile`
2020-11-21 23:35:02 +08:00
回复了 Braisdom 创建的主题 Java 历经 3 年,终于得以实现了
补充一下,第一段 Java 代码生成的 SQL 如下:
```sql
SELECT
((((SUM(`T0`.`amount` ) / SUM(`T0`.`quantity` ) )) * 100))
FROM
`orders` AS `T0`
GROUP BY
`T0`.`product_id`
```
大神们有指导建议不
1 ... 21  22  23  24  25  26  27  28  29  30  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2855 人在线   最高记录 6543   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 17ms · UTC 14:55 · PVG 22:55 · LAX 07:55 · JFK 10:55
Developed with CodeLauncher
♥ Do have faith in what you're doing.