Java 中的复杂 SQL 编程 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Braisdom
V2EX    Java

Java 中的复杂 SQL 编程

  •  2
     
  •   Braisdom
    braisdom 2020-12-07 13:04:35 +08:00 4022 次点击
    这是一个创建于 1776 天前的主题,其中的信息可能已经有所发展或是发生改变。

    复杂 SQL 没有一个明确的边界和标准,站在不同角度的人也有不的看法,从客观的角度分析,我大致整理了几点:

    1 )涉及多张表:无论是 join 、union 、subquery 、以及 exists 语法结构中,多张表组合查询实现一项业务目标

    2 )动态化:整个 SQL 语句会根据参数的不同构造不同的过滤条件或 join 不同的表

    3 )复杂表达式:在数据统计领域,时常会出现各种数学计算的表达式,不仅复杂,而且多,例如:大量 case when 、类似同环比计算、以及窗口函数内的计算等

    肯定有人会问,为什么要分清复杂 SQL 和简单 SQL ?道理很简单,简单的 SQL 我们通过字符串形式的编程可以解决,也容易维护,但复杂 SQL 通过字符串的形式进行编程,不仅容易出错,长期而言维护成本非常高。

    无论是简单 SQL 编程,还是复杂 SQL 编程,ObjectiveSQL 都提供了近乎完美的解决方案,有兴趣的可以了解一下。

    github: https://github.com/braisdom/ObjectiveSql 800+ stars

    18 条回复    2020-12-08 10:08:11 +08:00
    gowk
        1
    gowk  
       2020-12-07 13:57:56 +08:00 via Android   3
    这一波推广 666
    Braisdom
        2
    Braisdom  
    OP
       2020-12-07 13:58:29 +08:00
    @gowk 总是需要一些干货的,兄弟支持一下
    lower
        3
    lower  
       2020-12-07 14:17:17 +08:00
    ky 一下,看了你网站介绍示例里的复杂 sql 的处理,
    我觉得还是直接简单查询数据到内存,然后用代码处理更方便灵活。。。
    Braisdom
        4
    Braisdom  
    OP
       2020-12-07 14:20:43 +08:00
    @lower 简单 SQL 更方法,不需要写代码

    如果数据都在内存里,保持内存与数据库的一致性需要挑战的
    WhereverYouGo
        5
    WhereverYouGo  
       2020-12-07 17:28:14 +08:00
    额 对比 Mybatis 和 Spring Data JPA 有啥优势呢
    dfzj
        6
    dfzj  
       2020-12-07 17:32:05 +08:00
    ORM 其实没啥必要,现在都可以直接写 SQL 开发系统了:wuyuan.io
    Braisdom
        7
    Braisdom  
    OP
       2020-12-07 18:26:59 +08:00
    @dfzj 场景不一样,如果你的系统里有 300 条 超过 500 行的 SQL,你就会放弃写 SQL 的想法了
    Braisdom
        8
    Braisdom  
    OP
       2020-12-07 18:28:02 +08:00
    @sweetsorrow211 MyBatis 和 JPA 比我成熟,但从易用的角度讲,ObjectiveSQL 远远超越他们,现在需要的是时间和各多人尝试
    kingfalse
        9
    kingfalse  
       2020-12-07 20:47:21 +08:00 via Android
    互相安利可还行
    Braisdom
        10
    Braisdom  
    OP
       2020-12-07 21:25:24 +08:00
    @kingfalse 可行
    dfzj
        11
    dfzj  
       2020-12-07 21:51:43 +08:00
    @Braisdom 那就应该存储过程了,然后直接调用存储过程。似乎这种场景下做 ORM 会更糟糕的,比如财务系统做一个期末结转操作,你会发现用 ORM 去做基本就是灾难
    Braisdom
        12
    Braisdom  
    OP
       2020-12-07 22:09:28 +08:00
    @dfzj 存储过程是一种方法,但单元测试怎么做,版本管理怎么做呢?
    Braisdom
        13
    Braisdom  
    OP
       2020-12-07 22:12:40 +08:00
    @dfzj ORM 只是一种 SQL 的代替方案,用 Java 的方法写 SQL,完全等价于你写 SQL,从而代替 SQL 的动态化
    dfzj
        14
    dfzj  
       2020-12-07 22:29:57 +08:00
    @Braisdom 存储过程的测试和管理由数据库管理软件来做 等价于 测试 Java 程序的 eclipse IDE
    dfzj
        15
    dfzj  
       2020-12-07 22:34:19 +08:00
    @Braisdom 等价是必须的,功能上如果有缺失,那就是没得选了,实际上只有合适不合适而已。但实际情况是,一条 SQL 内,涉及到主从多表关联的情况 ORM 是很难受的。
    另外,别说 300 行 SQL 。完成一个 30 行的 SQL 事务,彼此上下文依赖的话,b 如果用 JAVA ORM 来做,明显 JAVA 程序跟数据库之间 30 次 IO 。用存储过程就一次了。
    业务系统做得多了,就知道,本质就是 SQL 的执行。
    Braisdom
        16
    Braisdom  
    OP
       2020-12-07 22:47:49 +08:00
    @dfzj 存储过程在某些场景下是有优势的,

    大部分场景下 SQL 是以查询为主,也就不存在事务的问题,我的框架只是让 Java 实现一个等价的 SQL 查询。
    dfzj
        17
    dfzj  
       2020-12-07 22:51:20 +08:00
    @Braisdom 嗯嗯,适合互联网应用
    Braisdom
        18
    Braisdom  
    OP
       2020-12-08 10:08:11 +08:00
    @dfzj 普通的应用系统都可以使用的
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2539 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 30ms UTC 02:20 PVG 10:20 LAX 19:20 JFK 22:20
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86