Jdbc 字符串拼接 sql 最佳实践是什么 - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
7911364440
V2EX    Java

Jdbc 字符串拼接 sql 最佳实践是什么

  •  
  •   7911364440 2022 年 6 月 7 日 3916 次点击
    这是一个创建于 1419 天前的主题,其中的信息可能已经有所发展或是发生改变。

    感觉字符串拼接 sql 太麻烦了,尤其是 sql 中间还有动态参数,需要根据参数是否为空动态拼接 sql 段落,代码太丑了,可读性也很差。想问下有没有更好的拼接 sql 方式。

    23 条回复    2022-06-16 09:23:02 +08:00
    cpstar
        1
    cpstar  
       2022 年 6 月 7 日
    preparestatement?
    Edward4074
        2
    Edward4074  
       2022 年 6 月 7 日 via iPhone
    最近刚做了一个基于 mybatis plus 条件构造器的 sql 生成器。动态拼接的部分 mybatis plus 实现得特别优雅
    adoal
        3
    adoal  
       2022 年 6 月 7 日 via iPhone
    不拼接
    git00ll
        4
    git00ll  
       2022 年 6 月 7 日
    mybatis 拼 xml 。

    mybatis dynamic 代码拼 sql
    yousabuk
        5
    yousabuk  
       2022 年 6 月 7 日 via iPhone
    preparestatement?
    {}?
    zed1018
        6
    zed1018  
       2022 年 6 月 7 日
    JDBC 我不知道,但是如果参数都是 equals 的话,在 JPA 里可以用 Example 查询,hibernate 会自动把有值的字段传递到 where 里
    SMGdcAt4kPPQ
        7
    SMGdcAt4kPPQ  
       2022 年 6 月 7 日
    ebean
    dcsuibian
        8
    dcsuibian  
       2022 年 6 月 7 日   1
    拼接 SQL 分分钟被注入,至少上个预编译
    dcsuibian
        9
    dcsuibian  
       2022 年 6 月 7 日
    条件动态的话,感觉 Spring Data JPA 的 Specification 是个好东西
    BBCCBB
        10
    BBCCBB  
       2022 年 6 月 7 日
    mybatis xml.
    EscYezi
        11
    EscYezi  
       2022 年 6 月 7 日 via iPhone
    mybatis 就是用来解决这个的,虽然复杂到一定程度可读性也不太好,但总比 java 代码拼接强

    其实个人觉得最好的方式是 jooq
    SMGdcAt4kPPQ
        12
    SMGdcAt4kPPQ  
       2022 年 6 月 7 日
    @EscYezi 个人觉得最好的是 EF Core 这种
    zoharSoul
        13
    zoharSoul  
       2022 年 6 月 7 日
    mybatis
    anakinsky
        14
    anakinsky  
       2022 年 6 月 8 日
    querydsl
    sorakylin
        15
    sorakylin  
       2022 年 6 月 8 日
    Ktorm 解君愁
    brust
        16
    brust  
       2022 年 6 月 8 日
    如果不是太追求效率问题 还是用框架吧
    fpure
        17
    fpure  
       2022 年 6 月 8 日
    答案就是 mybatis
    james122333
        18
    james122333  
       2022 年 6 月 8 日
    mybatis 也是要写 if 差别在于写在设定而已 然而设定难以除错和补全
    "需要根据参数是否为空" 这个写函数包起来就好(当然三元运算更丑一点) lambda 都可以 为空就拼接空字串 只是看你要不要写的完整 随便一个范例
    MyStatement s = QueryCreator.create(
    "select * from user where status = 1",
    QueryCreator.ifNotNull(
    "name", name,
    "email", email,
    "address", address
    )
    )

    生成"select * from user where status = 1 where name = ? and email = ? and address = ?" PreparedStatement 再带入参数而已
    james122333
        19
    james122333  
       2022 年 6 月 8 日 via Android
    QueryCreator.ifNotNull(Object ... objs) QueryParams
    QueryCreator create(
    james122333
        20
    james122333  
       2022 年 6 月 8 日 via Android
    QueryCreator.create(Object ... objs) MyStatement
    suyabgaran
        21
    suyabgaran  
       2022 年 6 月 9 日
    JOOQ 解君愁
    ychost
        22
    ychost  
       2022 年 6 月 10 日
    mybatis-plus YYDS ,JPA (千万别用,MD 升级 API 都没了)
    coderstory
        23
    coderstory  
       2022 年 6 月 16 日
    jsqlparser ?
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2927 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 89ms UTC 13:10 PVG 21:10 LAX 06:10 JFK 09:10
    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