`
j2eetop
  • 浏览: 64430 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

DSL风格数据库编程之实践

 
阅读更多

目录[-]
删除代码示例
插入代码示例
更新代码示例
查询代码示例
总结


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

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

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

 

删除代码示例

 

delete(USER).where(
                USER.NAME.eq("悠然")
        );
        delete(USER).where(
                USER.NAME.leftLike("A"),
                USER.AGE.between(20,30)
        );

 

插入代码示例

 

insertInto(USER).values(
                USER.NAME.value("悠然"),
                USER.AGE.value(22)
        );

 

更新代码示例

 

update(USER).set(
                USER.NAME.to("abc"),
                USER.AGE.to(3)
        ).where(
                USER.NAME.eq("悠然")
        );

 

查询代码示例

 

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。

完整实现版即将推出。

 

欢迎登录关注:http://bbs.tinygroup.org,本例涉及的代码和框架资料,将会在论坛分享。技术交流群:228977971,让我们一起动手,了解框架的奥秘!

0
0
分享到:
评论

相关推荐

    Java8采用Martin Fowler的方法创建内部DSL

    Lambda表达式使得函数式编程风格在Java中变得更加自然,而流API则为处理集合数据提供了强大的工具。这些新特性使得Java代码可以写得更加简洁、优雅,类似于函数式编程语言中的链式操作。 在Martin Fowler的方法中,...

    kotlin编程实践

    Kotlin编程实践 Kotlin是一种运行在Java虚拟机上的静态类型编程语言,同时也支持编译为JavaScript源代码或使用Kotlin/Native运行在本地平台。Kotlin以其简洁、易读且与Java完全兼容的特点被广大开发者喜爱,并逐渐...

    《自己动手写前端框架》电子书.pdf

    在电子书的目录中,还列出了许多具体的技术话题,如J2Cache的吐槽、DSL风格数据库编程的实践、RESTful风格的支持实践、模板引擎的应用示例、前端展现框架的讨论等。这些内容从不同角度展示了Tiny框架的特点和使用...

    Groovy in Action 配套源码

    2. **闭包和函数式编程**:Groovy的闭包是其强大之处,它们可以作为参数传递,也可以返回,这在处理集合数据时特别有用。函数式编程风格使得代码更加简洁和易于测试。 3. **元编程**:Groovy允许在运行时修改类和...

    msm-flexjson-serializer-1.8.2.zip

    例如,通过Groovy DSL,我们可以用更自然的语言风格来定义表、列、索引等数据库元素,从而提高开发效率。 在"groovy-liquibase.zip"这个压缩包中,包含的是"groovy-liquibase-master",这表明它是Groovy Liquibase...

    JavaScript DSL 流畅接口(使用链式调用)实例

    总之,流畅接口是一种通过精心设计方法调用方式来提高代码可读性的编程实践。链式调用和表达式生成器是实现流畅接口的两种典型方法。它们能够帮助开发者用更符合人类直觉的方式编写代码,尤其是在构建面向特定领域的...

    Metaprogramming Ruby(Second Edition)

    《Metaprogramming Ruby(Second Edition)》不仅讲解了上述概念,还提供了丰富的示例和实践指导,帮助读者理解并熟练掌握Ruby元编程技术,从而编写出更加专业且高效的代码。书中涵盖了如何避免元编程带来的复杂性和...

    JAVA:dslab.us存储库

    7. **函数式编程DSL**:Java 8引入的Lambda表达式和Stream API,提供了一种函数式编程风格,可以看作是处理集合数据的DSL。 学习和研究这个存储库,可以帮助开发者深入了解如何在Java中设计和实现DSL,提升代码质量...

    Kotlin语言教程和案例以及相关项目资源

    9. **案例研究**:教程中的案例可能涵盖了各种实际应用场景,例如构建简单的Android应用、网络请求、数据库操作、用户界面设计等,帮助学习者将理论知识应用于实践。 10. **项目资源**:提供的项目资源可能包括示例...

    Programming F#

    这种混合范式使得F#能够适应各种编程风格和需求。 5. **并行和并发** F#提供了轻量级的异步工作流(Async workflows),使得编写并发和并行代码变得简单且直观,这对于处理大量数据和多核处理器环境下的程序设计尤...

    最新 groovy开发包

    Groovy的闭包(Closure)是其核心特性之一,类似于其他语言中的lambda表达式,可以用来处理函数式编程场景。 2. **Groovy与Java的互操作性**:Groovy可以无缝地与Java代码集成,因为它们都运行在JVM上。你可以直接...

    Kotlin教程与案例.zip

    Kotlin是一种现代、静态...通过这些学习资源,初学者可以逐步掌握Kotlin的基础知识,进而进行实际项目开发,体验其高效、简洁的编程风格。无论是Android应用开发还是后端服务构建,Kotlin都能提供强大的工具和支持。

    kotlin-examples,Kotlin代码示例.zip

    4. **函数式编程支持**:Kotlin提供了高阶函数、lambda表达式和协程等特性,支持函数式编程风格。 5. **类型安全的构建器**:Kotlin的DSL(领域特定语言)使得构建XML或数据库配置等结构化的代码更加安全且直观。 ...

    代码生成器

    - **数据库模型**:当数据库表结构变化时,可以自动创建或更新与之对应的实体类。 - **前后端分离**:生成RESTful API接口代码,简化服务端开发。 - **Web界面**:根据设计模式,自动生成HTML、CSS和JavaScript...

    Write Once, Deploy N A Performance Oriented MDA Case Study

    MDA的实现依赖于特定领域的建模语言(DSL),这些语言能够通过代码生成器直接转换为编程语言代码,如Java或C#,或者转换为平台特定的配置文件,如XML。 本案例研究的主题是“一次编写,多处部署:面向性能的MDA案例...

    AndroidProgramming-Kotlin:用Kotlin进行Android编程

    4. **Anko库**:简化Android开发,提供DSL(领域特定语言)来替代XML布局和常见任务。 三、Android编程基础 1. **Activity与Fragment**:作为用户界面的主要组件,理解它们的生命周期至关重要。 2. **Intent**:...

    Kotlin 进行 Android 开发的开源库,扩展,工具,开源项目

    2. Anko库:Google推荐的Kotlin库,提供DSL(领域特定语言)简化Android开发,如意图创建、布局定义等。 3. Coroutines:Kotlin的协程解决Android中的异步问题,避免回调地狱,提高性能。 三、Kotlin扩展 1. ...

    编程网

    综上所述,"ProgramacaoWeb-master" 可能是一个涵盖了以上某些概念的开源 Web 项目,学习这个项目将有助于理解 Java 在实际 Web 开发中的应用,包括但不限于架构设计、服务端开发、数据库操作、安全实践以及自动化...

    JAVA Web文件

    Maven使用POM(Project Object Model)文件来定义项目的依赖关系和构建过程,而Gradle则更灵活,支持Groovy和Kotlin DSL进行构建配置。 8. Tomcat和Jetty:这些都是流行的Java Web服务器和应用服务器,它们运行...

    Android-《Kotlin实战》读书笔记

    Kotlin提供了丰富的集合操作,如map、filter、reduce、forEach等,它们使得函数式编程风格在Android开发中变得可行。 15. **多平台编程**: Kotlin支持多平台项目,同一个代码库可以在JVM、JavaScript和原生平台...

Global site tag (gtag.js) - Google Analytics