V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
7911364440
V2EX  ›  Java

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

  •  
  •   7911364440 · Jun 7, 2022 · 3919 views
    This topic created in 1419 days ago, the information mentioned may be changed or developed.

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

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

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

    其实个人觉得最好的方式是 jooq
    SMGdcAt4kPPQ
        12
    SMGdcAt4kPPQ  
       Jun 7, 2022
    @EscYezi 个人觉得最好的是 EF Core 这种
    zoharSoul
        13
    zoharSoul  
       Jun 7, 2022
    mybatis
    anakinsky
        14
    anakinsky  
       Jun 8, 2022
    querydsl
    sorakylin
        15
    sorakylin  
       Jun 8, 2022
    Ktorm 解君愁
    brust
        16
    brust  
       Jun 8, 2022
    如果不是太追求效率问题 还是用框架吧
    fpure
        17
    fpure  
       Jun 8, 2022
    答案就是 mybatis
    james122333
        18
    james122333  
       Jun 8, 2022
    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  
       Jun 8, 2022 via Android
    QueryCreator.ifNotNull(Object ... objs) QueryParams
    QueryCreator create(
    james122333
        20
    james122333  
       Jun 8, 2022 via Android
    QueryCreator.create(Object ... objs) MyStatement
    suyabgaran
        21
    suyabgaran  
       Jun 9, 2022
    JOOQ 解君愁
    ychost
        22
    ychost  
       Jun 10, 2022
    mybatis-plus YYDS ,JPA (千万别用,MD 升级 API 都没了)
    coderstory
        23
    coderstory  
       Jun 16, 2022
    jsqlparser ?
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   4125 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 73ms · UTC 05:15 · PVG 13:15 · LAX 22:15 · JFK 01:15
    ♥ Do have faith in what you're doing.