dao层动态sql利器!数据持久化jpa插件spring-data-jpa-extra?Fenix!

曹兴贤
2023-12-01

       把hibernate、mybatis都整合到一个项目中,有没有觉得臃肿繁琐?!
       我们知道,dao层,会用数据持久化框架,如hibernate、mybatis等,他们都实现了jpa规范。几年来,spring想统领这个层,有spring jpa data,包装了hibernate、mybatis,我们直接使用spring jpa data,但底层可以选hibernate、mybatis。
       但是hibernate、mybatis各有优劣,每个人选择不同。hibernate可以很方便地进行实体关联取用,两级缓存也完善,但是动态sql和及查询结果集包装不是很多样化就不是很好地提供;而mybatis反之,动态sql和及查询结果集包装不是很多样化实现得不错,实体关联取用,两级缓存就没有或不完善(毕竟mybatis更像一个sql执行前后的解析工具)。
       有人就想各取所长,把hibernate、mybatis都整合到一个项目中,但这看起来就很臃肿,毕竟两者的使用入口不一样,而且开发者在service层会看到的是两个东西!!!
       那既想各取所长,又想看起来利索(就是开发者只看到jpa,就像只使用一个框架),那简单,那就选用jpa+hibernate为主体,辅以类似mybatis的sql处理工具就行了,这个插件只负责sql执行前后的sql组装和查询结果集后的组装,那相关工具我找到的有spring-data-jpa-extra(https://github.com/slyak/spring-data-jpa-extra)、Fenix。我了解觉得Fenix更好,所以下面专门推荐介绍Fenix。
------------------------------------------------------------------------------------------
Fenix
git:https://github.com/blinkfox/fenix
git中的作者文档:https://blinkfox.github.io/fenix/#/README?id=fenix

Fenix(菲尼克斯)是一个为了解决复杂动态 SQL (JPQL) 而生的 Spring Data JPA 扩展库,目的是辅助开发者更方便快捷的书写复杂、动态且易于维护的 SQL,支持 XML、Java 链式 API 和动态条件注解等四种方式来书写动态 SQL。

特性
简单、轻量级、无副作用的集成和使用,jar 包仅 176 KB;
作为 JPA 的扩展和增强,兼容 Spring Data JPA 原有功能和各种特性;
提供了 XML、Java 链式 API 和动态条件注解等四种方式来书写动态 SQL;
XML 的方式功能强大,让 SQL 和 Java 代码解耦,易于维护;
可以采用 Java 链式 API 来书写动态 SQL;
可以采用动态条件注解和Java 链式 API 来书写出动态的 Specification。
具有动态性、极致的可复用性的优点;
SQL 执行结果可返回任意自定义的实体对象,比使用 JPA 自身的投影方式更加简单和自然;
具有可扩展性,如:可自定义 XML 语义标签和对应的标签处理器来生成自定义逻辑的 SQL 片段和参数;
初衷
随着 Spring Data JPA 越来越流行,极大的方便了数据的“增删改”和简单查询的场景,但是在复杂、动态查询方面就显得有些“糟糕”了,相比 MyBatis 的 XML 动态 SQL 而言,缺少了一定优雅和可维护性,而使用原生的 Specification 又显得过于“臃肿”。

所有,为了能使开发人员能像在 MyBatis 中那样在 XML 中书写 JPQL 语句,Fenix 中引入了 MVEL 表达式和模板引擎的语法来书写和渲染 XML 中的动态 SQL。通俗的说,就是支持使用表达式、if/else、foreach 等来达到跟 MyBatis 类似的动态 SQL 能力。但是,仅靠这些“灵活”的动态能力,仍然会书写出大量相似或重复的 SQL。

因此,为了更加极致的解决 SQL 片段“相似或重复”的问题,Fenix 中引入了 SQL 片段的“语义化标签”,将大多数常见的 SQL 片段做成 XML 标签,通过传递的字段动态的参数值就可以生成对应的 SQL 片段和命名参数。语言化的 XML 标签可以在各个需要的地方复用,也可以自定义自己的 XML SQL 标签。

同时,Fenix 还提供了 Java 链式 API 书写动态 SQL 和动态 Specification 的方式,使 SQL 可读性和紧凑性更好。还可以使用动态条件注解将查询条件的实体 Bean 中标记对应的查询条件注解,而获得动态的查询能力。如果要书写静态或动态的中、长 SQL,则推荐使用 XML 方式,便于集中阅读、调试和维护 SQL。

注:本 Fenix 扩展库开发的核心思想来源于我几年前写的动态 SQL 拼接库 Zealot。如果你熟悉星际争霸的话,大概能理解其中的关系。

开源许可证
本 Fenix 的 Spring Data JPA 扩展库遵守 Apache License 2.0 许可证。

鸣谢
感谢 JetBrains 公司 为本开源项目提供的免费正版 Intellij IDEA 的 License 支持。

 类似资料: