借老系统重构我给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。执行结果正如我们所期望的那样:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTB:Bashed[WriteUP]

目录 连接至HTB服务器并启动靶机 1.How many open TCP ports are listening on Bashed? 2.What is the relative path on the webserver to a folder that contains phpbash.php? 3.What user is the webserver running as on Bashed? 执行命令&#xff1a;whoami 4.S…

【前端】如何制作一个自己的网页(8)

以下内容接上文。 CSS的出现&#xff0c;使得网页的样式与内容分离开来。 HTML负责网页中有哪些内容&#xff0c;CSS负责以哪种样式来展现这些内容。因此&#xff0c;CSS必须和HTML协同工作&#xff0c;那么如何在HTML中引用CSS呢&#xff1f; CSS的引用方式有三种&#xff1…

构建后端为etcd的CoreDNS的容器集群(六)、编写自动维护域名记录的代码脚本

本文为系列测试文章&#xff0c;拟基于自签名证书认证的etcd容器来构建coredns域名解析系统。 一、前置文章 构建后端为etcd的CoreDNS的容器集群&#xff08;一&#xff09;、生成自签名证书 构建后端为etcd的CoreDNS的容器集群&#xff08;二&#xff09;、下载最新的etcd容…

Linux C接口编程入门之ioctl操作

ioctl函数用于系统调用操作特殊文件的底层设备参数。例如终端的许多操作特性可以用ioctl()请求来控制。不能用于read()、write()、open()、close()函数表示的I/O操作通常都能用ioctl表示。 fd参数为某个设备或文件已打开的文件描述符&#xff1b; request参数指定了将在fd上执…

大数据测试:Charles修改响应数据

上一篇大数据测试&#xff1a;Fiddler修改响应数据-CSDN博客 &#xff0c;有同学反馈有没有Charles的方式修改响应数据&#xff0c;本篇就是Charles修改数据操作步骤&#xff0c;相比较fiddler&#xff0c;Charles相对简单&#xff0c;便捷&#xff0c;我很喜欢 1、背景&…

web网页---新浪网页面

代码&#xff1a; <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>新浪网</title> </head> <style>ul.menu > li{list-style: none; } …

DC系列靶机-DC6

一&#xff0c;环境的搭建 VM17 官网下载 kali 2023.4版 https://mirrors.tuna.tsinghua.edu.cn/kali-images/kali-2023.4/ 靶场文件 https://download.vulnhub.com/dc/DC-5.zip 二&#xff0c;攻略 首先进行主机发现&#xff1b; 接下来进行端口扫描&#xff1b; 开放了2…

手撕数据结构 —— 栈(C语言讲解)

目录 1.认识栈 什么是栈 栈的示意图 2.如何实现栈 3.栈的实现 Stack.h中接口总览 具体实现 结构的定义 初始化栈 销毁栈 入栈 出栈 取栈顶元素 获取有效元素的个数 判断栈是否为空 4.完整代码附录 Stack.h Stack.c 1.认识栈 什么是栈 栈是一种特殊的线性表…

CSS面试真题 part2

CSS面试真题 part2 11、css3新增了哪些新特性&#xff1f;12、css3动画有哪些&#xff1f;13、介绍一下grid网格布局14、说说flexbox&#xff08;弹性盒布局模型&#xff09;&#xff0c;以及使用场景&#xff1f;15、说说设备像素、css像素、设备独立像素、dpr、ppi之间的区别…

详解mac系统通过brew安装mongodb与使用

本文目录 一、通过brew安装MongoDB二、mongodb使用示例1、启动数据库2、创建/删除数据库3、创建/删除集合 三、MongoDB基本概念1&#xff09;数据库 (database)2&#xff09;集合 &#xff08;collection&#xff09;3) 文档&#xff08;document&#xff09;4&#xff09;mong…

WPFDeveloper正式版发布

WPFDeveloper WPFDeveloper一个基于WPF自定义高级控件的WPF开发人员UI库&#xff0c;它提供了众多的自定义控件。 该项目的创建者和主要维护者是现役微软MVP 闫驚鏵: https://github.com/yanjinhuagood 该项目还有众多的维护者&#xff0c;详情可以访问github上的README&…

快速创建一个vue项目并运行

前期准备工作: 1.安装node 2.安装npm 3.设置淘宝镜像 4.全局安装webpack 5.webpack 4.X 开始&#xff0c;需要安装 webpack-cli 依赖 6.全局安装vue-cli 正文开始: 1.创建项目 ,回车 vue init webpack vue-svg > Project name vue-demo 项目名称 回车 > Pro…

MySQL-事务Transaction详解

文章目录 事务概述事务基本概念事务四大特性(ACID)演示MySQL事务手动开启事务MySQL默认事务机制 事务的隔离级别隔离级别基本概述三种现象脏读不可重复读幻读 查看和设置隔离级别四种隔离级别及演示读未提交(read uncommitted)读提交(read committed)可重复读(repeatable read)…

【K8s】Kubernetes 词汇表

微思网络 厦门微思网络 K8S认证工程师&#xff08;CKA&#xff09;备考与学习指南https://mp.weixin.qq.com/s/XsEVpU7dKnJDBopynWW3GQ K8S-CKA课程试听:Container 概述 词汇表 此术语表旨在提供 Kubernetes 术语的完整、标准列表。其中包含特定于 Kubernetes 的技术术语以及…

为了避免下一次重大中断,我们需要持续测试

自去年 7 月CrowdStrike/Microsoft大规模中断以来的几个月里&#xff0c;我们了解到了很多问题所在。一家大型网络安全提供商为其广泛部署的企业端点保护产品推出了一个有缺陷的更新。尽管&#xff08;错误地&#xff09;批准发布&#xff0c;但该更新导致全球的 Windows 系统崩…

力扣 143.重排链表【详细手写】

一、题目 前置题目 力扣 206.反转链表 力扣 876. 链表的中间结点 二、思路 观察链表发现链表是部分有序&#xff0c;奇数位置的节点组成前半段的原链表&#xff0c;偶数位置的节点组成后半段的反转链表。因此&#xff0c;首先需要找到中间节点&#xff08;力扣 876. 链表的…

harmonyOS next之实现时间打卡定时器

需求&#xff1a;实现一个时间打卡签到按钮。 实现方法&#xff1a;每隔一秒钟获取一下当前时间。 实现代码如下&#xff1a; Column(){Text(this.curTime).fontColor(#FFFFFF).fontWeight(600).fontSize(32vp)Text(上班打卡).fontColor(#FFFFFF) } .width(170vp) .height(170…

使用ROS资源编排一键部署LNMP建站环境,手动整理教程

LNMP是目前主流的网站服务器架构之一&#xff0c;适合运行大型和高并发的网站应用&#xff0c;例如电子商务网站、社交网络、内容管理系统等。LNMP分别代表Linux、Nginx、MySQL和PHP。本文阿里云服务器网aliyunfuwuqi.com介绍如何使用阿里云资源编排服务&#xff08;ROS&#x…

桂林旅游一点通:SpringBoot平台应用

3系统分析 3.1可行性分析 通过对本桂林旅游景点导游平台实行的目的初步调查和分析&#xff0c;提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本桂林旅游景点导游平台采用SSM框架&#xff0c;JAVA作…

smbms(2)

目录 一、修改密码功能实现 二、优化密码修改&#xff0c;加入旧密码确认环节【使用Ajax】 三、用户管理实现 获取用户数量 获取用户列表 获取角色列表 Servlet 一、修改密码功能实现 1、导入前端素材 2、UserDao接口 3、UserDaoImpl实现类 4、UserService接口 5、Us…