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

2023-11-02

       把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 支持。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

随机推荐

  • 网络基础:网络协议及数据报格式

    网络应用程序设计模式 网络分层模型 两台计算机通过TCP IP协议通讯过程 协议格式 以太网帧格式 ARP探测的概念及数据报格式 ip段格式 UDP数据报格式 TCP数据报格式 TCP IP数据包封装 NAT映射与打洞机制 概念说明
  • 6950有史以来最经典玩机宝典/软件包/导航

    http www diypda com forum php mod viewthread tid 116274 教程 6950有史以来最经典玩机宝典 软件包 导航 复制链接 新支点6950玩机宝典 作为论坛资深认证商家和6950的改卡开发商
  • Linux进程

    目录 进程基本概念 描述进程PCB task struct内容分类 通过系统调用创建进程 fork 进程状态 Z zombie 僵尸进程 孤儿进程 进程优先级 进程基本概念 书上的概念是 进程是程序的一个执行实例 正在执行的程序等 在内核的
  • Python 回调函数实现异步处理

    说到异步处理大家应该会联想到Ajax 处理 那我们先来说说什么是Ajax 请求 Ajax 就相当于是模拟了一个信息发送请求 你可以在很多网站上注册的时候会发现 比如用户名输入 123 那么它可能会提示你该用户已经存在 而给你的感觉是页面并没
  • windows、Ubuntu安装QT时经常出现“无法下载存档……”解决办法

    说明 以windows为例 ubuntu操作一样 下载好exe执行文件 双击执行时 经常出现下图提示 无法下载存档 是由于默认使用的是境外源 有两种解决方式 方式一 挂魔法在线安装 方式二 使用国内源 清华大学 https mirrors
  • 读阮一峰ES6对象解构赋值小细节

    最近看阮一峰的ES6发现了个地方有点不懂 理解之后 特意记录下来 let obj let arr foo obj prop bar arr 0 foo 123 bar true obj prop 123 arr true 就是上面这块 首先
  • NavicatPremium连接MySQL出现异常Authentication plugin ‘caching_sha2_password‘ cannot be loaded的解决方案

    一 出现异常原因 由于个人本机安装的mysql是8 0 在使用Navicat连接数据库时 出现Authentication plugin caching sha2 password cannot be loaded异常 通过搜集资料得知my
  • 几种常用的无源滤波器的特征

    无源滤波器的缺点 带负载能力差 无放大作用 特性不理想 边沿不陡峭 各级相互影响 滤波器是一种通过一定频率的信号而阻止或衰减其他频率信号的部件 分类 按照处理信号形式 模拟滤波器和数字滤波器 按功能分 低通 高通 带通 带阻 按电路组成分
  • Visio中实现任意两点之间的连线

    参考博客01 https blog csdn net wanzhen4330 article details 84837279 想实现的效果 如下图所示 想要实现的是像下面图中 让箭头线段多次弯折 最终连接两个矩形方框 二 做法 在Visi
  • SQLServer数据库密码已过期问题 处理

    Sqlserver在设置登录账户信息的时候 有个复选框信息会被默认勾上 即强制实施密码策略 默认勾选上的还有强制密码过期 如果勾上了这个强制密码过期后 则你的账户密码在一定时间登录后会提示Sqlserver登录密码已过期请重新设置密码 如果
  • docker-management遇到的一些问题

    一个mysql节点 两个cloudstack management节点 先启动mysql节点 如果cloudstack management容器节点无法访问mysql节点 注意docker宿主机的iptables规则 启动cloudstac
  • 总结一波安卓组件化开源方案

    摘要 为了让大家能快速对android组件化有个整体的认识 本文将从多个维度对目前网上一些有代表性的开源组件化开发方案进行对比 从而更好的区分各组件化方案的特点 快速选择适合自己使用的方案深入学习并使用 在面试中被问到时也能做到心中有数 前
  • PCL 从深度图像中提取边界

    一 图像边界 深度图像边界 计从前景跨越到背景的位置定义为边界 具体有 物体边界 这是物体的最外层和阴影边界的可见点集 阴影边界 毗邻与遮挡的背景上的点集 Veil点集 在被遮挡物边界和阴影边界之间的内插点 它们是有激光雷达获取的3D距离数
  • docker基础6——制作镜像(dockerfile)

    文章目录 一 基本了解 1 1 基于centos构建镜像 1 2 基于alpine制作镜像 二 常用指令 三 制作httpd镜像 一 基本了解 Dockerfile 是一个文本格式的配置文件 可以使用Dockerfile 快速创建自定义镜像
  • 飞机降落(dfs 全排列)

    题目描述 N 架飞机准备降落到某个只有一条跑道的机场 其中第 i 架飞机在 Ti 时刻到达机场上空 到达时它的剩余油料还可以继续盘旋 Di 个单位时间 即它最早 可以于 Ti 时刻开始降落 最晚可以于 Ti Di 时刻开始降落 降落过程需要
  • C# 枚举 enum(学习心得 17)

    枚举是一组命名整型常量 枚举类型是使用 enum 关键字声明的 C 枚举是值类型 枚举包含自己的值 且不能继承或传递继承 超级小白友好 讲解C 基础 每集5分钟轻松学习 拒绝从入门到放弃 声明 enum
  • linux服务器无法ssh怎么解决,linux服务器有可能无法连接ssh

    新安装的linux服务器有可能无法连接ssh 这可是怎么办 我的服务器是centOS6 9的版本 1 首先关闭 SELINUX vi etc selinux config SELINUX enforcing 注释掉 SELINUXTYPE
  • SpringBoot三种注解启动方式

    1 SpringBoot内置了Tomcat Jetty等容器 所以可以通过注解方式进行启动 2 SpringBoot注解启动的原理 SpringBoot main方法 是程序入口 启动SpringBoot项目 创建内置tomcat服务器 使
  • windows 10 webrtc 下载与编译以及遇到的问题

    下载 1 由于webrtc 源码在 墙外 所以需要科学上网 自行解决 当然现在webrtc 有国内的镜像地址 https webrtc org cn mirror 内附编译下载教程自行查阅 下载后只包含M79 和最新的master 分支 由
  • dao层动态sql利器!数据持久化jpa插件spring-data-jpa-extra?Fenix!

    把hibernate mybatis都整合到一个项目中 有没有觉得臃肿繁琐 我们知道 dao层 会用数据持久化框架 如hibernate mybatis等 他们都实现了jpa规范 几年来 spring想统领这个层 有spring jpa d