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

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

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

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

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

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

    其实个人觉得最好的方式是 jooq
    ComputerIdiot
        12
    ComputerIdiot  
       65 天前
    @EscYezi 个人觉得最好的是 EF Core 这种
    zoharSoul
        13
    zoharSoul  
       65 天前
    mybatis
    anakinsky
        14
    anakinsky  
       65 天前
    querydsl
    sorakylin
        15
    sorakylin  
       65 天前
    Ktorm 解君愁
    brust
        16
    brust  
       64 天前
    如果不是太追求效率问题 还是用框架吧
    fpure
        17
    fpure  
       64 天前
    答案就是 mybatis
    james122333
        18
    james122333  
       64 天前
    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  
       64 天前 via Android
    QueryCreator.ifNotNull(Object ... objs) QueryParams
    QueryCreator create(
    james122333
        20
    james122333  
       64 天前 via Android
    QueryCreator.create(Object ... objs) MyStatement
    suyabgaran
        21
    suyabgaran  
       64 天前
    JOOQ 解君愁
    ychost
        22
    ychost  
       63 天前
    mybatis-plus YYDS ,JPA (千万别用,MD 升级 API 都没了)
    coderstory
        23
    coderstory  
       57 天前
    jsqlparser ?
    关于   ·   帮助文档   ·   API   ·   FAQ   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   4194 人在线   最高记录 5497   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 34ms · UTC 06:51 · PVG 14:51 · LAX 23:51 · JFK 02:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.