DSL风格数据库编程之实践

简介:

现在的应用系统中,绝多多数的情况下都是要用到数据库的,而适合Java框架的数据库处理方案太多了,这里就不一一列出了。

现在又比较流行一种DSL(Domain Specific Language)风格的数据库访问方式,比如:JOOQ、Querydsl等等,都比较成熟。仔细研究了一下,觉得存在如下问题:这两货都是收费的,这明显不符合时代潮流么;第二就是有点过度封装的意思,有许多东西都封装了,导致学习及使用成本上升;再就是体量都比较大,能不能又瘦又小又好用?
当然,也有一些同学有自己的实现,不能一一研究并列举,今天仅做验证性开发,不足之处同学们尽快提出来,只要合情合理,我们都会采纳。

OK,说做就做,花点时间看看,可不可以自己做个实现?

删除代码示例

?
1
2
3
4
5
6
7
delete(USER).where(
                 USER.NAME.eq( "悠然" )
         );
         delete(USER).where(
                 USER.NAME.leftLike( "A" ),
                 USER.AGE.between( 20 , 30 )
         );



插入代码示例

?
1
2
3
4
insertInto(USER).values(
                 USER.NAME.value( "悠然" ),
                 USER.AGE.value( 22 )
         );



更新代码示例

?
1
2
3
4
5
6
update(USER).set(
                 USER.NAME.to( "abc" ),
                 USER.AGE.to( 3 )
         ).where(
                 USER.NAME.eq( "悠然" )
         );



查询代码示例

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
selectFrom(USER);
 
         select(
                 customField( "%s-%s" ),
                 USER.NAME,USER.AGE
         ).from(USER);
 
         select(
                 customField( "upper(%s)-%s" ),
                 USER.NAME,USER.AGE
         ).from(USER);
 
         selectFrom(USER).orderBy(USER.NAME.desc());
 
         selectFrom(USER).where(
                 USER.NAME.eq( "abc" )
         );
 
         selectFrom(USER).where(
                 USER.NAME.like( "abc" )
         );
 
         selectFrom(USER).where(
                 or(
                         USER.NAME.like( "abc" ),
                         USER.AGE.gt( 20 )
                 )
         );
 
         selectFrom(USER).where(
                 USER.AGE.gt( 20 ).and(
                         USER.NAME.like( "abc" ),
                         USER.AGE.gt( 20 )
                 )
         );
         
         selectFrom(USER).where(
                 USER.NAME.leftLike( "abc" )
         );
         
         selectFrom(USER).where(
                 USER.AGE.between( 23 , 25 )
         );
         
         select(USER.AGE.max()).from(USER);
         select(USER.AGE.min()).from(USER);
         select(USER.AGE.avg()).from(USER);
         select(USER.AGE.count()).from(USER);
         select(USER.AGE.sum()).from(USER);
         select(USER.NAME.distinct()).from(USER);
         
         select(USER.AGE.sum()).from(USER).having(
                 USER.AGE.sum().gt( 100 )
         ).union(
                 select(USER.AGE.sum()).from(USER).having(
                         USER.AGE.sum().gt( 100 )
                 )
         );



查询是最复杂,也是最多变的,上面已经列举了大多数情况。

总结

通过上面的示例,基本上涵盖了四种SQL语句的处理方式。当然每种方案都有它自己的优点与缺点,正所谓萝卜芹菜各有所爱。

这个方案的优点是把SQL逻辑用有语义的代码进行编写,更容易理解;同时由于其与SQL语句的结构相当相似,也更容易写出相应的SQL逻辑,熟悉SQL的人的学习成本非常低;同时也可以非常好的避免SQL注入问题;较SQL拼接是有相当的改善的。也避免了SQL与Java代码分离导致的开发和调试的不方便。

当然也有它的缺点,比如,经常听到的反对声音就是不如写原生SQL。

完整实现版即将推出。

如果关心Tiny,可以访问Tiny主站:http://www.tinygroup.org,也可以一起加入我们。

相关文章
|
6月前
|
人工智能 前端开发 JavaScript
代码采纳率从 22% 到 33%,通义灵码辅助数据库智能编码实践
通义灵码本质上是一个AI agent,它已经进行了大量的优化。然而,为了更完美或有效地调用模型的潜在能力,我们在使用时仍需掌握一些技巧。通常,大多数人在使用通义灵码时会直接上手,这是 AI agent 的一个优势,即 zero shot 使用,无需任何上下文即可直接使用通义灵码的能力。
|
6月前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
142 16
|
7月前
|
中间件 关系型数据库 数据库
docker快速部署OS web中间件 数据库 编程应用
通过Docker,可以轻松地部署操作系统、Web中间件、数据库和编程应用。本文详细介绍了使用Docker部署这些组件的基本步骤和命令,展示了如何通过Docker Compose编排多容器应用。希望本文能帮助开发者更高效地使用Docker进行应用部署和管理。
198 19
|
6月前
|
数据库
|
8月前
|
关系型数据库 OLAP API
非“典型”向量数据库AnalyticDB PostgreSQL及RAG服务实践
本文介绍了非“典型”向量数据库AnalyticDB PostgreSQL及其RAG(检索增强生成)服务的实践应用。 AnalyticDB PostgreSQL不仅具备强大的数据分析能力,还支持向量查询、全文检索和结构化查询的融合,帮助企业高效构建和管理知识库。
436 19
|
8月前
|
缓存 NoSQL JavaScript
Vue.js应用结合Redis数据库:实践与优化
将Vue.js应用与Redis结合,可以实现高效的数据管理和快速响应的用户体验。通过合理的实践步骤和优化策略,可以充分发挥两者的优势,提高应用的性能和可靠性。希望本文能为您在实际开发中提供有价值的参考。
182 11
|
9月前
|
弹性计算 安全 关系型数据库
活动实践 | 自建数据库迁移到云数据库
通过阿里云RDS,用户可获得稳定、安全的企业级数据库服务,无需担心数据库管理与维护。该方案使用RDS确保数据库的可靠性、可用性和安全性,结合ECS和DTS服务,实现自建数据库平滑迁移到云端,支持WordPress等应用的快速部署与运行。通过一键部署模板,用户能迅速搭建ECS和RDS实例,完成数据迁移及应用上线,显著提升业务灵活性和效率。
|
9月前
|
SQL Java 数据库连接
JDBC编程安装———通过代码操控数据库
本文,教你从0开始学习JBCD,包括驱动包的下载安装调试设置,以及java是如何通过JBDC实现对数据库的操作,以及代码的分析,超级详细
|
9月前
|
运维 监控 Cloud Native
云原生之运维监控实践:使用 taosKeeper 与 TDinsight 实现对 时序数据库TDengine 服务的监测告警
在数字化转型的过程中,监控与告警功能的优化对保障系统的稳定运行至关重要。本篇文章是“2024,我想和 TDengine 谈谈”征文活动的三等奖作品之一,详细介绍了如何利用 TDengine、taosKeeper 和 TDinsight 实现对 TDengine 服务的状态监控与告警功能。作者通过容器化安装 TDengine 和 Grafana,演示了如何配置 Grafana 数据源、导入 TDinsight 仪表板、以及如何设置告警规则和通知策略。欢迎大家阅读。
295 0
|
10月前
|
数据库连接 Go 数据库
Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性
本文探讨了Go语言中的错误注入与防御编程。错误注入通过模拟网络故障、数据库错误等,测试系统稳定性;防御编程则强调在编码时考虑各种错误情况,确保程序健壮性。文章详细介绍了这两种技术在Go语言中的实现方法及其重要性,旨在提升软件质量和可靠性。
159 1