借老系统重构我给jpa写了个mybatis风格的查询模块

因为公司老系统是用hibernate3开发的,重构自然过渡到使用Spring Data JPA。由于系统中对sql的使用方式还是手动为主,这就造成在service层存在大量的sql拼接方式,后续维护比较困难。
因为怀念以往项目对sql驱动的持久层开发用的mybatis的时光,笔者参考b站up主Java灭霸詹的手写mybatis系列,为JPA扩展了一个mybatis风格的查询模块。
在这里插入图片描述
在大佬讲解实现的基础上完成了plugin模块的编写以支持分页特性,同时扩展了mybatis的xml文件中的sql节点标签,让功能按照个人需求实现进一步的定制。
在整个代码实践过程中,笔者对mybatis的实现原理也有了进一步的认识,同时通过编写这个JPAmybatis风格查询的扩展模块,为后面做sql的重构也铺平了道路。

文章目录

    • 封装JDBC
    • xml中编写sql的示例
    • in查询标签
    • 分页查询
    • 分页功能的优化

封装JDBC

对于JPA它的优势自然是ORM框架所具有的对象关系映射,而实际业务中存在大量手写sql的情况下,用JPA自然不是最好的选择,如果是公司架构的要求,那对JPA操作JDBC的那部分代码做一层封装,让其具有了mybatissql处理能力,自然会是一件两全其美的事情。
这里封装JPAJDBC操作,只是做了一层sql映射的逻辑层的节点树结构,在实际执行查询时会执行节点树,通过上下文的串联,将每个sql节点对应解析出来的sql进行拼接,得到要执行的目标sql。并在这个过程中完成sql中参数占位符的处理,映射参数列表。
sql执行所处的环境、数据源连接、事务环境这些都托管给了Spring管理。最底层只需要调用org.hibernate.Sessionsession.doReturningWork()方法操作jdbc即可。

xml中编写sql的示例

这里给出笔者实现该模块的示例查询:
在这里插入图片描述
这里在实现mybatis动态查询功能的基础上,做了一些扩展。比如这里的<in>标签、用于分页查询优化的<sql>标签。

in查询标签

mybatis在处理列表形式的参数时使用的<foreach>标签用起来比较麻烦,笔者在手写mybatis实现基础功能的基础上扩展了原有标签的功能,实现了简单易用的<in>标签。执行的效果和mybatis<foreach>标签一样:
在这里插入图片描述

分页查询

对于mybatis提供的plugin功能,市面上有类似于PageHelper这样的第三方插件来整合分页功能。笔者翻看其源码,体会到由于mybatis在封装上的一些安全性考虑,并没有为Plugin的拦截扩展功能开太多的口子,这就造成插件的第三方开发者需要做很多的设计和实现来适配。
而对于笔者手写mybatis来说,要扩展插件就变得简单了。框子是笔者定的,为了更好的扩展,可以适当的把口子开大点,让扩展更好的适配。在实现分页拦截器时,笔者为框子底层的类开了类似切面的口子,方便扩展:
在这里插入图片描述
这样基于笔者手写的mybatis,用短短20几行代码就实现了一个功能完备的分页插件:
在这里插入图片描述

分页功能的优化

目前市面上的分页插件对于分页的select count查询,并没有实现对内部sql的干预机制,更多的是在外面包一层select count(1) from (...) t,而内层的sql诸如select *的处理方式并没有屏蔽掉。所以count查询的效率自然不敢恭维。而笔者在扩展mybatis手写功能时,对这一块做了用户定制优化:
在这里插入图片描述
这里<sql>标签包裹的内容是在分页列表查询时必要的,而count查询将会被替换掉,如果指定了countSql属性,就用属性值代替,否则替换为空。这样无论一个结构多复杂的sql,用这种包裹和替换方式,都无需为了提高count查询效率,而单独写一个查询sql。执行结果正如我们所期望的那样:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/451749.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

docker数据管理和网络通信+docker实例+dockerfile镜像实战

一、Docker 的数据管理 管理 Docker 容器中数据主要有两种方式&#xff1a;数据卷&#xff08;Data Volumes&#xff09;和数据卷容器&#xff08;DataVolumes Containers&#xff09;。 1&#xff0e;数据卷&#xff08;主机和容器间的挂载&#xff09; 数据卷是一个供容器…

【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练

一、介绍 玉米病害识别系统&#xff0c;本系统使用Python作为主要开发语言&#xff0c;通过收集了8种常见的玉米叶部病害图片数据集&#xff08;‘矮花叶病’, ‘健康’, ‘灰斑病一般’, ‘灰斑病严重’, ‘锈病一般’, ‘锈病严重’, ‘叶斑病一般’, ‘叶斑病严重’&#x…

C++之“构造函数”

文章目录 类的默认成员函数构造函数 类的默认成员函数 默认成员函数就是我们没有在main函数里调用&#xff0c;但是编译器会自动生成的成员函数称为默认成员函数。 C由8个默认成员函数&#xff0c;我们暂时了解6个。 默认成员函数&#xff1a;构造函数&#xff0c;析构函数&a…

Vue3:同一项目同一浏览器只允许打开一个标签页

说明&#xff1a; 阻止同一浏览器打开多个项目标签页&#xff0c;防止多标签页重复时间统计累加&#xff0c;适用于基于微信公众号页面或指定浏览器的计时统计等项目活动&#xff0c;计时在线学习时间统计等。 效果&#xff1a; main.js import {createApp} from vue import…

Cloudlog delete_oqrs_line 未授权SQL注入漏洞复现

0x01 产品简介 Cloudlog 是一个自托管的 PHP 应用程序,可让您在任何地方记录您的业余无线电联系人。使用PHP和MySQL构建的基于Web的业余无线电记录应用程序支持从HF到微波的一般站记录任务 0x02 漏洞概述 Cloudlog delete_oqrs_line 接口存在未授权SQL注入漏洞,未经身份验…

【Python技术】利用akshare定时获取股票实时价,低于5日线钉钉通知报警

今天看了下大盘&#xff0c;临时有个想法&#xff0c;我想知道某个股票回踩5日线的价格&#xff0c;如果实时价格低于5日线通过钉钉报警通知我。 说干就干&#xff0c;临时撸了下简单的代码&#xff0c;仅做演示。 1、计算5日线思路 很多券商软件的MA5价格是近5个交易日收盘…

【Hive】6-Hive函数、运算符使用

Hive函数、运算符使用 Hive内置运算符 概述 整体上&#xff0c;Hive支持的运算符可以分为三大类&#xff1a;关系运算、算术运算、逻辑运算。 官方参考文档&#xff1a;https://cwiki.apache.org/confluence/display/Hive/LanguageManualUDF 也可以使用下述方式查看运算符的…

vue使用jquery的ajax,页面跳转

一、引入jquery依赖 打开终端更新npm npm install -g npm 更新完后引入输入npm install jquery 加载完后 在最外层的package.json文件中加入以下代码 配置好后导入jquery 设置变量用于接收服务器传输的数据 定义ajax申请数据 服务器的Controller层传输数据 &#xff08;…

【Java 并发编程】单例模式

前言 单例模式是一种十分常用但却相对而言比较简单的单例模式。虽然它简单但是包含了关于线程安全、内存模型、类加载机制等一些比较核心的知识点。本章会介绍单例模式的设计思想&#xff0c;会去讲解了几种常见的单例实现方式&#xff0c;如饿汉式、懒汉式、双重检锁、静态内部…

【大模型】AI视频课程制作工具开发

1. 需求信息 1.1 需求背景 讲师们在制作视频的过程中&#xff0c;发现录制课程比较麻烦&#xff0c;要保证环境安静&#xff0c;保证录制过程不出错&#xff0c;很容易反复重复录制&#xff0c;为了解决重复录制的工作量&#xff0c;想通过 ai 课程制作工具&#xff0c;来解决…

数据轻松上云——Mbox边缘计算网关

随着工业4.0时代的到来&#xff0c;工厂数字化转型已成为提升生产效率、优化资源配置、增强企业竞争力的关键。我们凭借其先进的边缘计算网关与云平台技术&#xff0c;为工厂提供了高效、稳定的数据采集与上云解决方案。本文将为您介绍Mbox边缘计算网关如何配合明达云平台&…

【CS常见问题】你用的是VS2019,最高支持.NET5.0,但是项目将.NET6.0设为目标无法运行,怎么办?

.NET版本问题 报错示例报错分析最简单的方法步骤 报错示例 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 NETSDK1045 当前 .NET SDK 不支持将 .NET 6.0 设置为目标。请将 .NET 5.0 或更低版本设置为目标&#xff0c;或使用支持 .NET 6.0 的 .NET SDK 版本。 ABFview C:\x…

◇【论文_20150225】 DQN_2015(nature) 〔Google DeepMind〕

整理代码 1&#xff1a;DQN CartPole_v1.ipynb https://www.nature.com/articles/nature14236 Human-level control through deep reinforcement learning 文章目录 摘要主体&#xff1a;要做什么 如何做的 要点keypoints实验 与 评估2 个指标和 各游戏的最好方法比较t-S…

【Linux网络编程】Socket编程--UDP(第一弹):实现客户端和服务器互相发送消息

&#x1f308;个人主页&#xff1a; 南桥几晴秋 &#x1f308;C专栏&#xff1a; 南桥谈C &#x1f308;C语言专栏&#xff1a; C语言学习系列 &#x1f308;Linux学习专栏&#xff1a; 南桥谈Linux &#x1f308;数据结构学习专栏&#xff1a; 数据结构杂谈 &#x1f308;数据…

.Net自动更新程序GeneralUpdate,适用于wpf,winfrom,控制台应用

GeneralUpdate是基于.net framwork4.5.2开发的一款&#xff08;c/s应用&#xff09;自动升级程序。 第一个版本叫Autoupdate 有人会奇怪为什么会改名称&#xff0c;稍微解释一下是因为在nuget上有重名的项目再者就是新版本更新功能不仅限于wpf程序的更新。 将更新的核心部分抽…

《Knowledge Perceived Multi-modal Pretraining in E-commerce》中文校对版

文章中文化系列目录 文章目录 文章中文化系列目录摘要CCS概念&#xff1a;关键词&#xff1a;1 引言2 相关工作2.1 多模态预训练2.2 知识图谱增强的预训练模型 3 方法3.1 模态编码层3.1.1 图像初始特征3.1.2 文本初始特征3.1.3 知识的表面形式特征 3.2 模态交互层3.2.1 图像模态…

day02 -- docker

1.docker的介绍 Docker 是一个开源的应用容器引擎&#xff0c;基于 Go语言 并遵从 Apache2.0 协议开源。Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中&#xff0c;然后发布到任何流行的 Linux 机器上&#xff0c;也可以实现虚拟化。容器是完全使…

填充与步幅

一个3x3的卷积核对6X6的图像进行卷积&#xff0c;得到一个4x4的图像 此时&#xff0c;生成图像长或宽 ln-f1 使用过滤器对图像进行卷积出现的问题有&#xff1a; 每次卷积后图像都会变小&#xff0c;当网络过深的时候&#xff0c;就会遗失许多像素 过滤器对边缘像素访问仅一…

基于C#开发游戏辅助工具的Windows底层相关方法详解

开发游戏辅助工具通常需要深入了解Windows操作系统的底层机制&#xff0c;以及如何与游戏进程进行有效交互。本文将基于C#语言&#xff0c;从Windows底层方法的角度来详细讲解开发游戏辅助工具的相关技术和概念。 一、游戏辅助工具的基本概述 游戏辅助工具&#xff0c;通常被称…

网络学习笔记

一、网络的结构与功能 网络的鲁棒性与抗毁性 如果在移走少量节点后网络中的绝大部分节点仍然是连通的&#xff0c;那么就该网络的连通性对节点故障具有鲁棒性 网络上的动力学 动力系统&#xff1a;自旋、振子或混沌的同步、可激发系统 传播过程&#xff1a;信息传播与拥堵…