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

2 月 25 日
 null123456

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

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

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

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

核心特性:

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

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

比如我们用的:

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
2 月 25 日
初步看了下,和我的想法比较接近,有没有群可以深度交流下
micean
2 月 25 日
这种有 jOOQ 就已经够了,稍微复杂一点脑子里还得转一遍 SQL 。
如果能整一个嵌套 dsl 转 sql ,查询结果直接返回 json 还差不多,jimmer 实现的我觉得还不够完美友好
null123456
3 月 1 日
@a0210077 是的 所以推广起来很难
null123456
3 月 1 日
@Jackysunhp 只能看打印的 SQL ,和 xml 区别不是太大,因为基本都是按照 SQL 语义写的 DSL 代码
null123456
3 月 1 日
@bojue 确实,也可以做,适配下低代码平台,但我们毕竟都是打工的牛马,平常加班都累成🐶了
null123456
3 月 1 日
@dcsuibian 是的 我后来也发现了,但是当时我并没有看 JOOQ ,事后觉得好的解决方案都是类似的,jooq 大而全,覆盖场景广,但是侵入太大,dynamic-sql2 小而美,比较有业务针对性,侵入极低
null123456
3 月 1 日
@xuld 有的,我也特别期盼向您这样志同道合的朋友,QQ 群:749973146
null123456
3 月 1 日
@ikas 您描述的这些功能都是有的,我还有些疑问,像:Pet.id, Pet.name, Pet.petType, Pet.birthday, Pet.updateTime 这些字段都是常量吗?还是普通字符串?
null123456
3 月 1 日
@micean 这个 toJSON 其实是变相支持的,因为 dynamic-sql2 可以直接返回原始 map ,调用方手动转下 JSON 就可以了。当然 dynamic-sql2 可以直接转 JSON 后输出,但是这会让它越来越臃肿,而且每个人喜欢的 json 格式化组件也不一样,所以目前来说,不计划直接引入该功能
bojue
3 月 1 日
@null123456 #12 这个就是我手上的一部分工作,在公司做的

1. 我们 22-23 年做了一版本被被一个沙雕暂定了
2. 最近有启动了一部分,前端 jsonSchame 配置作为开发,简单的就是传递一个表单作为 Entity,Form+Table JSON 化配置已经很成熟了,整个项目做了重构完成完全 cover80%-90%的任务
3. 接下来把 JSON 配置抽象成 3 部分工程任务:
a.将代码开发模版抽象成脚手架模版 b.将 json 配置表单化 c.集成拖拉拽的交互
ikas
3 月 5 日
@null123456 翻看测试用例看到用法了.不是字符串,是根据实体使用注解处理器生成的 table 与 column 结构
null123456
4 月 6 日
@bojue 很棒,程序员就是需要不断的重构
null123456
4 月 6 日
@ikas 是的,但是注解处理器加入后又移除了,因为负担太多,我的想法是尽量简洁

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/1193965

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX