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

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

  •  
  •   7911364440 · 2022-06-07 19:49:12 +08:00 · 3227 次点击
    这是一个创建于 904 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

    其实个人觉得最好的方式是 jooq
    SMGdcAt4kPPQ
        12
    SMGdcAt4kPPQ  
       2022-06-07 22:02:38 +08:00
    @EscYezi 个人觉得最好的是 EF Core 这种
    zoharSoul
        13
    zoharSoul  
       2022-06-07 23:29:31 +08:00
    mybatis
    anakinsky
        14
    anakinsky  
       2022-06-08 09:14:48 +08:00
    querydsl
    sorakylin
        15
    sorakylin  
       2022-06-08 10:11:35 +08:00
    Ktorm 解君愁
    brust
        16
    brust  
       2022-06-08 15:48:52 +08:00
    如果不是太追求效率问题 还是用框架吧
    fpure
        17
    fpure  
       2022-06-08 15:50:19 +08:00
    答案就是 mybatis
    james122333
        18
    james122333  
       2022-06-08 19:14:33 +08:00
    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-06-08 19:59:23 +08:00 via Android
    QueryCreator.ifNotNull(Object ... objs) QueryParams
    QueryCreator create(
    james122333
        20
    james122333  
       2022-06-08 20:00:21 +08:00 via Android
    QueryCreator.create(Object ... objs) MyStatement
    suyabgaran
        21
    suyabgaran  
       2022-06-09 09:35:10 +08:00
    JOOQ 解君愁
    ychost
        22
    ychost  
       2022-06-10 11:28:11 +08:00
    mybatis-plus YYDS ,JPA (千万别用,MD 升级 API 都没了)
    coderstory
        23
    coderstory  
       2022-06-16 09:23:02 +08:00
    jsqlparser ?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1201 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 18:21 · PVG 02:21 · LAX 10:21 · JFK 13:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.