V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
null123456
V2EX  ›  程序员

[开源项目] Java 动态 SQL 构建框架 - Dynamic-SQL2

  •  
  •   null123456 · 12 小时 25 分钟前 · 717 次点击

    Dynamic-SQL2 是一个 纯 Java 、低侵入、跨数据库、可组合的动态 SQL 构建框架。 它提供 优雅的 DSL 风格 API ,让你可以像写代码一样构建 SQL ,同时保持 SQL 的表达力与可控性。

    它不是完整的 ORM ,也不是 MyBatis 的替代品,而是定义为 Lightweight ORM / Micro ORM:

    补足传统 ORM 在“动态 SQL + 多表查询 + 跨库兼容 + 类型检查”上的空白和拓展。

    适用于 企业级业务系统、SaaS 平台、多租户架构、复杂动态查询场景。

    核心特性:

    • 动态 SQL 构建:链式 DSL ,告别字符串拼接
    • 跨数据库兼容:内置 MySQL / Oracle / DB2 方言
    • 高级 SQL 支持:子查询、窗口函数、CTE 、递归查询
    • 现代化分页:支持 List / Map / 一对多结构分页
    • Spring 友好:可与 Spring 、JDBC 、MyBatis 灵活组合
    • 可扩展性强:自定义函数、条件生成器、值解析器
    • 可测试性强:SQL 由 Java 构建,天然适合单元测试
    • 专业日志模块:结构化、可自定义、可读性极高的 SQL 输出
    • 提升团队协作和代码一致性:遵循统一的 SQL 构建方式,确保代码的一致性和可读性

    项目地址 https://github.com/pengweizhong/dynamic-sql2

    9 条回复    2026-02-25 18:53:06 +08:00
    a0210077
        1
    a0210077  
       10 小时 22 分钟前
    轮子不错,但企业级一般用完整的稳定的 ORM 框架,暂时还没想到特别合适的应用场景。
    Jackysunhp
        2
    Jackysunhp  
       9 小时 37 分钟前
    让我想到了 ES 的 DSL 语句转 SDK ,对于看 sql 的时候不直观, 捞 sql 定位问题不是很方便吧。
    bojue
        3
    bojue  
       9 小时 30 分钟前
    @a0210077 我们自研的 ORM 框架,可以适配一个前端低代码或者代码生产工具是不是有点市场,我公司之前买了一套适配的前端 200 万
    a0210077
        4
    a0210077  
       9 小时 16 分钟前
    @bojue 确实可以,低代码平台和代码工具是个不错的方向。不过 OP 的项目与您说的方向上有点差异
    dcsuibian
        5
    dcsuibian  
       9 小时 10 分钟前
    感觉,有点像 jOOQ 啊
    bojue
        6
    bojue  
       8 小时 24 分钟前
    @a0210077 #4 我知道 op 的意思,我看你说到了应用场景刚好我们搞过,现在客户基本上还是以整体方案为主,单点方案得话要 op 给用户讲清楚就行,罗列功能吸引力不大了,尤其现在有 ai
    ikas
        7
    ikas  
       6 小时 44 分钟前
    看了首页的例子.没有看到怎么根据参数动态加条件的?

    比如我们用的:

    public interface PetDao {
    @SelectProvider(type = PetMapperSql.class)
    List<Pet> queryPet(@Param("param") PetQueryParam param);
    }


    public class PetMapperSql extends BaseMapperSql {
    public SelectModel queryPet(@Param("param") PetQueryParam param) {
    return select(Pet.id, Pet.name, Pet.petType, Pet.birthday, Pet.updateTime)
    .from(Pet)
    .where().and(Pet.name, isLikeWhenPresent(param.getName()).then(x -> "%" + x + "%"))
    .and(Pet.birthday, isGreaterThan(param.getBirthdayStart()).when(Objects::nonNull))
    .and(Pet.birthday, isLessThanWhenPresent(param.getBirthdayEnd()))
    .build();
    }

    }

    .and(Pet.birthday, isGreaterThan(param.getBirthdayStart()).when(Objects::nonNull))
    xuld
        8
    xuld  
       6 小时 32 分钟前
    初步看了下,和我的想法比较接近,有没有群可以深度交流下
    micean
        9
    micean  
       6 小时 18 分钟前
    这种有 jOOQ 就已经够了,稍微复杂一点脑子里还得转一遍 SQL 。
    如果能整一个嵌套 dsl 转 sql ,查询结果直接返回 json 还差不多,jimmer 实现的我觉得还不够完美友好
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1198 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 17:11 · PVG 01:11 · LAX 09:11 · JFK 12:11
    ♥ Do have faith in what you're doing.