V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Geekerstar
V2EX  ›  Java

如何评价 Java 类中写 SQL 的行为?

  •  
  •   Geekerstar · 41 天前 · 4983 次点击
    这是一个创建于 41 天前的主题,其中的信息可能已经有所发展或是发生改变。

    不是 JPA,不是 Mybatis,Java 类里直接 String sql ="select xxxx" ,然后调用一个封装的 xxx.select()方法,大家如何看待这种行为?

    第 1 条附言  ·  41 天前
    不是 Demo 哦,挺大的项目,CRUD 都是这样写的。。。。个人找不到啥优点,参数代码拼接,极难维护,想看看大家怎么看-_-||
    57 条回复    2020-10-28 14:57:26 +08:00
    chendy
        1
    chendy   41 天前
    见过的这种写法都很水,一般连接池也没有,事务,异常处理也不完善
    但是项目不重要的话也就无所谓了…
    libook
        2
    libook   41 天前
    有很多看起来“非主流”的代码可能是菜鸡写的烂代码也可能是大牛精心构造,得看这么写的理由是什么,有没有更好的方案。理由说得过去就合理,说不过去就不合理,只要满足高可读性、高可靠性、高性能的原则就是好代码。
    zoharSoul
        3
    zoharSoul   41 天前
    你说的是 jdbc?
    我觉得没啥问题啊..
    有点就是简单查询下没必要引入个 jpa 吧
    lxk11153
        4
    lxk11153   41 天前
    JdbcTemplate ?
    cpstar
        5
    cpstar   41 天前
    最终不还要翻译到 SELECT ?
    这种还好,就是不知道条件那里怎么写,如果写成 String sql = "SELECT * FROM xxx WHERE id='"+id+"'",那就真蜜汁自信了。
    LowBi
        6
    LowBi   41 天前 via Android
    哈哈哈,目前公司写接口就这样,啥也不是
    iisky1121
        7
    iisky1121   41 天前
    ???,jdbc 不是这样的吗?
    oma1989
        8
    oma1989   41 天前
    刚写了个调用 API 接口取数,JDBC 直连落库的一次性 JAR .....
    oma1989
        9
    oma1989   41 天前
    简单的功能简单写,总不至于大炮打苍蝇吧.....
    Bromine0x23
        10
    Bromine0x23   41 天前
    要是 Java 多行字符串给力点的话,早就直接用 JdbcTemplate 了
    vincent7245
        11
    vincent7245   41 天前
    这个需要具分析了,看业务需求,比如并不是所有的 jdbc 都要用连接池,甚至有的项目绝对不能用连接池。还有就是可能受限于项目规模没必要用第三方的框架,没必要大炮打蚊子。不过直接 String sql = “”; 确实是有点 low,好歹封装一下吧
    xiangyuecn
        12
    xiangyuecn   41 天前
    返璞归真的写法。前提该懂的都懂。是最高效最简洁的写法。对于维护难易,就算是 Mybatis 也都是各有千秋,评价不了。

    但看这个 sql 用 String 类型,应该是菜鸟,100%进行了字符串无任何处理的拼接。
    nulIptr
        13
    nulIptr   41 天前
    曾经我也用 ef,后来发现还是 dapper 好用。
    模板生成增删查改方法,更复杂的方法直接上 sql
    写好注释,复杂业务下 sql 可维护性比 orm 高
    再说你们用 orm 的就没见过慢查询吗。。。
    FireFoxAhri
        14
    FireFoxAhri   41 天前
    之前用 scala 写 play 框架,就是 anorm 。。封装了下 jdbc,全部手写 sql
    koal
        15
    koal   41 天前
    手工写 mysql 到 java 代码中厮混,就是耍流氓!
    Qlccks2
        16
    Qlccks2   41 天前
    得看需要才知道合理不合理,如果整个系统全是这么写的肯定不合理。
    lichao
        17
    lichao   41 天前
    古代的项目都是这么写的
    kanemochi
        18
    kanemochi   41 天前
    项目很简单,就几个 sql 的规模的话也未尝不可
    zgzhang
        19
    zgzhang   41 天前
    注入教做人
    SabaPing
        20
    SabaPing   41 天前
    我们就这么写啊,直观,sql 不留坑,所见即所得。

    当然楼上老哥说的好,具体分析,看业务需求
    yuhuan66666
        21
    yuhuan66666   41 天前   ❤️ 1
    碰见过通过 http 传 sql 到另一个系统执行的
    yinzhili
        22
    yinzhili   41 天前
    都是赶时间引起的
    wanguorui123
        23
    wanguorui123   41 天前 via iPhone
    碰见过一个 sql 比我写的作文还长的栗子
    fhsan
        24
    fhsan   41 天前
    具体问题具体分析,不要生搬硬套,懂得都懂
    wysnylc
        25
    wysnylc   41 天前
    哦吼,注入
    superrichman
        26
    superrichman   41 天前 via iPhone
    sqlmap 狂喜(不是

    赶紧跑吧,说不定哪天就被脱裤(划掉
    wysnylc
        27
    wysnylc   41 天前
    @superrichman #26 我真佩服他们不怕死的劲头
    qwerthhusn
        28
    qwerthhusn   41 天前
    主要是 Java 不支持多行文本(除了最新版本,但是这个应该没真正的项目去用),所以写出来的多行 SQL 没法看
    但是如果换了 Kotlin,有多行文本的话,就好多了
    wowo243
        29
    wowo243   41 天前
    我们现在的项目里就是这么写的。。。。
    用的是 spring jdbc
    wowo243
        30
    wowo243   41 天前
    感觉好处就是直接写 sql,能针对性的优化吧,囧;
    还有就是啥都能自己造;
    坏处,就是好像这玩意没那么流行,感觉更常见的还是 mybatis
    wangritian
        31
    wangritian   41 天前
    我查询全写 sql,增删改用对象
    wangyanrui
        32
    wangyanrui   41 天前 via Android
    ORM + 充血模型 万岁
    codingbody
        34
    codingbody   41 天前 via iPhone
    我以前公司项目全是 jdbcTemplate,现在做 ETL 连 Spring 都没有映入。
    iTanX
        35
    iTanX   41 天前
    @chendy
    有没有连接池取决于获取到的是什么数据源,有没有事务取决于数据源有没有事务控制器控制,异常处理完善不完善取决于楼主说的那个 select()方法是否写的漂亮。你确定很水?事实上,很多场景 JDBC 才能满足需求,mybtis 等框架不适用于所有业务场景的
    hafuhafu
        36
    hafuhafu   41 天前
    新项目,除非只写个位数的简单 sql,不然就算是全手写也肯定是 mybatis 更方便和易读吧,加个依赖可能一两分钟的事吧。
    老项目可能是遗留呢,以前的人都这么写,接盘的人也纷纷跟着写。
    jzmws
        37
    jzmws   41 天前
    我就是这样写的 , jpa 预编译的 动态生成 sql 语句
    fansangg
        38
    fansangg   41 天前
    怎么办,Google 的 room 也是在类里写 sql 语句
    fansangg
        39
    fansangg   41 天前
    怎么评价?
    @Query("SELECT * FROM xxx ORDER BY id DESC LIMIT 1")
    wflwq
        40
    wflwq   40 天前
    有个需求要批量执行某一条更新语句 N 次,碍于 mybaits 性能,采用了原生的 batch 模式,语句就直接怼代码里了。
    仔细想想写 xml 文件里解析出来也便于维护一点
    melkor
        41
    melkor   40 天前 via iPhone
    @yuhuan66666 这脑洞,长见识了
    jzphx
        42
    jzphx   40 天前
    我见过,之前接手了老外同事的项目,原汁原味的 sql,数据库连接池都不用。看到有个热帖有人回复说国内码农不写注释嘛,国外的摸鱼码农也不写注释。
    Achiii
        43
    Achiii   40 天前
    这样不怕注入吗
    forbreak
        44
    forbreak   40 天前
    如果参数不是通过+号拼接,那就是正常行为。
    PDX
        45
    PDX   40 天前 via iPhone
    这样写没毛病吧?
    rodrick
        46
    rodrick   40 天前
    我这甚至有前端动态拼 sql 在请求接口里,后台直接拿封装好的一套方法拿出这个接口的 sql 去跑的。。
    sun1991
        47
    sun1991   40 天前
    @nulIptr 同 EF 转 Dapper 爱好者.
    感觉简单的事情 ORM 能做的挺好, 但是复杂度上去了, ORM 同样处理不好, 还不如直写 SQL 来的简单明了.
    yjxjn
        48
    yjxjn   40 天前
    @xiangyuecn 说的对,最简洁高校,除了不易维护,其他都还好。。
    xumng123
        49
    xumng123   40 天前 via iPhone
    框架大多数都提供原生 sql 访问,这样写也不是不行,比如数据访问层无法满足需求
    shadownet
        50
    shadownet   40 天前
    就是你们这些观点让原本简单的事情复杂化,本来一个 sql,10 毫秒搞定的,外面套一堆东西,最后 100 毫秒都不够,然后让客户加硬件
    janus77
        51
    janus77   40 天前
    我们的项目需要跑每日报表,计算量大 计算逻辑复杂,就是直接 jdbc,不然性能跟不上
    elintwenty
        52
    elintwenty   40 天前
    看项目复杂度,十万行和五百行当然不会是同一个结构。但是直接传 sql 需要处理注入等安全问题吧?
    DoctorCat
        53
    DoctorCat   40 天前
    小明:劳资刚从写 js 转 java,明明 run 起来了但你竟然告诉我这么写不行?
    skinny
        54
    skinny   39 天前
    只要不是直接拼接字符串,用户输入用绑定参数,不用视之为洪水猛兽。
    php01
        55
    php01   39 天前
    我是万万没想到居然有这么多人支持直接写 sql,看来我在 java 里也能混口饭吃了
    Bromine0x23
        56
    Bromine0x23   39 天前
    首先要明确:直接写 SQL≠拼接参数。
    拼接参数是有安全问题,但是只要是用绑定参数,直接写 SQL 就不存在安全隐患。
    CantSee
        57
    CantSee   36 天前
    亚信?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1154 人在线   最高记录 5298   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 20:25 · PVG 04:25 · LAX 12:25 · JFK 15:25
    ♥ Do have faith in what you're doing.