当前位置: 首页 > news >正文

将SQL中的占位符替换成参数

将SQL中的占位符替换成参数

  • 描述

描述

此方法是将SQL中的${}或#{}替换为直接拼接到SQL中或直接替换为?的形式。具体详情看下面代码。

import java.util.*;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @author HuYu* @date 2023-09-21* @since 1.0**/
public class Test {public static void main(String[] args) throws Exception {String sql = "SELECT * FROM t_user WHERE id = #{id} AND username =#{username} GROUP BY username ORDER BY id ;";Map<String, Object> params = new HashMap<>();params.put("id", 1);params.put("username", "admin");Map<String, Object> map = replaceSqlPlaceholder(sql, "#{", "}", params);System.out.println(map);}/*** 功能描述:将带有占位符的SQL解析成可执行SQL,openToken传 #{ 则以?占位符方式,openToken传${则采用字符串拼接的方式,* 如果 params 中的参数是数值类型会直接拼接,如果是字符串类型,会填充为 'params.get(key)' 的模式。* @param sql        sql字符串* @param openToken  开始标记token 只能是#{或${* @param closeToken 结束标记 }* @param params     参数map,比如 sql中包含 #{id} ,那么会从该map中查找 key为id的值填充到SQL中作为参数* @return java.util.Map<java.lang.String, java.lang.Object>* @author compass* @date 2024/7/21 12:16* @since 1.0**/public static Map<String, Object> replaceSqlPlaceholder(String sql, String openToken, String closeToken, Map<String, Object> params) {Map<String, Object> resultMap = new HashMap<>();String fill = "#";String placeholder = "$";String type = openToken.contains(fill) ? fill : placeholder;if (sql==null || sql.trim().length()<=0){throw  new IllegalArgumentException("sql 不能为空!");}if (!sql.contains("$") || !sql.contains("#")){resultMap.put("sql",sql);return resultMap;}if ( (sql.contains("$") || sql.contains("#") )&& (params == null || params.size() <= 0)){throw  new IllegalArgumentException("发现SQL中存在占位符 但是 params 中未发现填充参数!");}if (!Arrays.asList("#{","${").contains(openToken)){throw  new IllegalArgumentException("openToken 只能是 #{或 ${!");}if (!"}".equals(closeToken)){throw  new IllegalArgumentException("closeToken 只能是}!");}char[] openTokeChars = openToken.toCharArray();List<Object> dataList = new ArrayList<>();String regx = openTokeChars[0] + "\\\\" + openTokeChars[1] + "([^" + closeToken + "]*)}";regx = regx.replace("\\\\", "\\");Pattern pattern = Pattern.compile(regx);Matcher matcher = pattern.matcher(sql);StringBuffer result = new StringBuffer();while (matcher.find()) {String matcherContent = matcher.group(1);if (placeholder.equals(type)) {Object arg = params.get(matcherContent);String paramValue = "";if (arg instanceof String) {paramValue = "'" + arg + "'";} else {paramValue = arg.toString();}matcher.appendReplacement(result, paramValue);} else {matcher.appendReplacement(result, "?");dataList.add(params.get(matcherContent));}}matcher.appendTail(result);resultMap.put("sql", result.toString());resultMap.put("args", dataList);return resultMap;}
}

相关文章:

将SQL中的占位符替换成参数

将SQL中的占位符替换成参数 描述 描述 此方法是将SQL中的${}或#{}替换为直接拼接到SQL中或直接替换为?的形式。具体详情看下面代码。 import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** author HuYu* date 2023-09-21* since 1.0**…...

锁相环 vivado FPGA

原理 同步状态/跟踪状态&#xff1a;相位差在2kπ附近&#xff0c;频率差为0到达上述状态的过程称为捕获过程锁相环的捕获带&#xff1a;delta w的最大值&#xff0c;大于这个值的话就不能捕获鉴相器&#xff08;PD-phase discriminator&#xff09;&#xff1a;相乘加LPF&…...

英语科技写作 希拉里·格拉斯曼-蒂(英文版)pdf下载

下载链接&#xff1a; 链接1&#xff1a;https://pan.baidu.com 链接2&#xff1a;/s/1fxRUGnlJrKEzQVF6k1GmBA 提取码&#xff1a;b69t 由于是英文版&#xff0c;可能有些看着不太方便&#xff0c;可以在网页版使用以下软件中英文对照着看&#xff0c;看着更舒服&#xff0c;…...

《Dynamic Statistical Learning in Massive Datastreams》论文阅读笔记

论文地址: https://www3.stat.sinica.edu.tw/ss_newpaper/SS-2023-0195_na.pdf 论文题目翻译&#xff1a;《在大规模数据流中的动态统计学习》 核心观点&#xff1a; 动态跟踪和筛选框架&#xff08;DTS&#xff09;&#xff1a;论文提出了一个在线学习和模型更新的新框架&…...

【数据分享】2008-2022年我国省市县三级的逐日NO2数据(excel\shp格式)

空气质量数据是在我们日常研究中经常使用的数据&#xff01;之前我们给大家分享了2000-2022年的省市县三级的逐日PM2.5数据、2013-2022年的省市县三级的逐日CO数据和2013-2022年的省市县三级的逐日SO2数据&#xff08;均可查看之前的文章获悉详情&#xff09;&#xff01; 本次…...

JavaEE (1)

web开发概述 所谓web开发,指的是从网页中向后端程序发送请求,与后端程序进行 交互. 流程图如下 Web服务器是指驻留于因特网上某种类型计算机的程序. 可以向浏览器等Web客户端提供文档&#xff0c;也可以放置网站文件&#xff0c;让全世界浏览&#xff1b; 它是一个容器&…...

事务、函数和索引

什么是事务&#xff1f; 事务&#xff08;Transaction&#xff09;&#xff0c;就是将一组SQL语句放在同一批次内去执行&#xff0c;如果一个SQL语句出错&#xff0c;则该批次内 的所有SQL都将被取消执行。 特点 一个事务中如果有一个数据库操作失败&#xff0c;那么整个事务…...

Android APP 基于RecyclerView框架工程(知识体系积累)

说明&#xff1a;这个简单的基于RecyclerView的框架作用在于自己可以将平时积累的一些有效demo整合起来&#xff08;比如音视频编解码的、opengles的以及其他也去方向的、随着项目增多&#xff0c;工程量的增加&#xff0c;后期想高效的分析和查找并不容易&#xff09;&#xf…...

【iOS】GCD

参考文章&#xff1a;GCD函数和队列原理探索 之前写项目的时候&#xff0c;进行耗时的网络请求使用GCD处理过异步请求&#xff0c;但对一些概念都很模糊&#xff0c;这次就来系统学习一下GCD相关 相关概念 什么是GCD&#xff1f; Grand Center Dispatch简称GCD&#xff0c;是…...

C语言 | Leetcode C语言题解之第282题给表达式添加运算符

题目&#xff1a; 题解&#xff1a; #define MAX_COUNT 10000 // 解的个数足够大 #define NUM_COUNT 100 // 操作数的个数足够大 long long num[NUM_COUNT] {0};long long calc(char *a) { // 计算表达式a的值// 将数字和符号&#xff0c;入栈memset(num, 0, sizeof(num));in…...

如何使用 API list 极狐GitLab 容器镜像仓库中的 tag?

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab &#xff1a;https://gitlab.cn/install?channelcontent&utm_sourcecsdn 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署…...

粒子群算法PSO优化BP神经网络(PSO-BP)回归预测——Python和MATLAB实现

下面是一个使用Python实现的粒子群算法&#xff08;PSO&#xff09;优化反向传播神经网络&#xff08;BP&#xff09;的示例代码。 以下是具体的代码实现&#xff1a; python import numpy as np from sklearn.datasets import make_regression from sklearn.model_selection…...

React-router路由配置及跳转

1、V6对比V5的修改内容 1、API: useNavigate 代替了useHistory 。 2、废弃了Route组件的exact属性。 3、组件 <Routes>代替了<Switch> 4、组件NavLink中移除了 activeStyle activeClassName 属性。 2、安装依赖react-router-dom npm install react-router-dom…...

vue3【实战】可编辑的脱敏信息

<script lang"ts" setup> import { ref, onMounted } from "vue"; let real_name ref("朝阳");let name ref("");onMounted(() > {name.value des_name(real_name.value); });function focusing() {name.value real_name…...

S71200 - 笔记

1 S71200 0 ProfiNet - 2 PLC编程 01.如何零基础快速上手S7-1200_哔哩哔哩_bilibili 西门子S7-1200PLC编程设计学习视频&#xff0c;从入门开始讲解_哔哩哔哩_bilibili...

linux系统查历史cpu使用数据(使用sar 查询cpu和网络占用最近1个月历史数据)。

一 sar 指令介绍 在 Linux 系统中&#xff0c;sar 是 System Activity Reporter 的缩写&#xff0c;是一个用于收集、报告和保存系统活动信息的工具。它是 sysstat 软件包的一部分&#xff0c;提供了丰富的系统性能数据&#xff0c;包括 CPU、内存、网络、磁盘等使用情况&am…...

Edge浏览器加载ActiveX控件

背景介绍 新版Edge浏览器也是采用Chromium内核&#xff0c;虽然没有谷歌浏览器市场占有率高&#xff0c;但是依托微软操作系统的优势&#xff0c;Edge浏览器还是发展很强劲&#xff0c;占据着市场第二的位置。随着微软停止服务IE浏览器&#xff0c;曾经风光无限的IE浏览器页退出…...

BUG与测试用例设计

一.软件测试的生命周期 需求分析→测试计划→测试设计,测试开发→测试执行→测试评估→上线→运行维护 二.BUG 1.bug的概念 (1)当且仅当规格说明(需求文档)是存在的并且正确,程序与规格说明之间的不匹配才是错误. (2)当需求规格说明书没有提到的功能,判断标准以最终用户为准…...

怎么在使用select2时,覆盖layui的下拉框样式

目录 1.覆盖下拉框样式代码 2.自定义样式 3.样式使用 1.覆盖下拉框样式代码 .layui-form-select .layui-select-title {border: none !important; /* 去除边框 */background-color: transparent !important; /* 去除背景色 */display: none;/* 其他你想要覆盖的样式 */} 2.自…...

MacOSM1 配置Miniconda环境,并设置自启动

文章目录 设置环境变量设置自启动参考 设置环境变量 cd vim .zshrc输入一下内容 # 配置Conda CONDA_HOME/Users/hanliqiang/miniconda3 PATH$CONDA_HOME/bin:$PATH生效配置 source .zshrc设置自启动 conda init zsh.zshrc 文件中将会出现以下内容 # >>> conda i…...

生物信息学避坑指南:你的热图聚类总乱?可能是数据标准化和样品注释没做对

生物信息学避坑指南&#xff1a;热图聚类混乱的根源与系统性解决方案 热图&#xff08;Heatmap&#xff09;作为生物信息学中最常用的数据可视化工具之一&#xff0c;广泛应用于基因表达分析、代谢组学、微生物组学等领域。然而&#xff0c;许多初学者在使用热图进行样品聚类时…...

BoneAnimCopy: 跨模型骨骼动画复用解决方案,提升10倍效率的动画师实践指南

BoneAnimCopy: 跨模型骨骼动画复用解决方案&#xff0c;提升10倍效率的动画师实践指南 【免费下载链接】blender_BoneAnimCopy 用于在blender中桥接骨骼动画的插件 项目地址: https://gitcode.com/gh_mirrors/bl/blender_BoneAnimCopy 在3D动画制作领域&#xff0c;动画…...

nli-distilroberta-base效果展示:Contradiction类样本的Attention权重可视化分析

nli-distilroberta-base效果展示&#xff1a;Contradiction类样本的Attention权重可视化分析 1. 项目概述 nli-distilroberta-base是基于DistilRoBERTa模型的自然语言推理(NLI)服务&#xff0c;专门用于分析句子对之间的逻辑关系。这个轻量级模型能够高效判断两个句子之间的三…...

AI 内容导出乱、格式崩、公式变?我开发了这只鸭子帮我全解决了(四)** AI导出鸭 专写职场篇:从日常汇报到年终述职,AI 导出的那些隐形损耗

不聊"AI 怎么提升效率"这种宏观话题—— 就聊一件很具体的小事&#xff1a; 你用 AI 搞定的内容&#xff0c;最后能不能专业地呈现出去&#xff1f;━━ 先说一个很多人经历过的时刻 ━━ 周五下午四点&#xff0c;领导突然要一份市场分析报告&#xff0c;六点前发过…...

保姆级教程:在Windows上用CMake+QT给CloudCompare 2.13.x添加一个Standard插件(附OpenCV配置)

从零构建CloudCompare插件&#xff1a;Windows平台CMakeQT全流程实战指南 在三维点云处理领域&#xff0c;CloudCompare凭借其开源特性和丰富的插件生态&#xff0c;已成为研究人员和工程师的首选工具之一。但对于刚接触插件开发的初学者而言&#xff0c;从环境配置到成功编译第…...

Centos stream 9 安装后root不能远程登录问题

如果在安装Centos stream 9的时候没有"勾选允许root用户使用密码进行ssh登录",安装后使用xshell等远程工具是不能登录虚拟机或者服务器的。解决&#xff1a;vim /etc/ssh/sshd_config1.新增一行配置&#xff1a; PermitRootLogin yes2.重启ssh systemctl restart ssh…...

5分钟搞定多聚焦图像融合:从数据集到评价指标全流程指南

5分钟搞定多聚焦图像融合&#xff1a;从数据集到评价指标全流程指南 多聚焦图像融合技术正逐渐成为计算机视觉领域的热门研究方向。这项技术通过将多张聚焦区域不同的图像合成为一张全清晰的图像&#xff0c;解决了单次拍摄无法同时捕捉场景中所有物体清晰细节的难题。对于刚接…...

一篇关于论文复现的思考:基于领域相似度的复杂网络节点重要度评估算法

论文复现—基于领域相似度的复杂网络节点重要度评估算法 编写程序代码matlab 复现算法仿真最近在学习复杂网络的相关算法&#xff0c;看到一篇挺有意思的论文&#xff0c;讲的是基于领域相似度的节点重要度评估方法。说实话&#xff0c;这类算法听起来有点抽象&#xff0c;但…...

实战案例:用Fish Speech 1.5为视频添加多语言配音

实战案例&#xff1a;用Fish Speech 1.5为视频添加多语言配音 1. 引言&#xff1a;视频配音的新选择 在视频制作过程中&#xff0c;配音往往是耗时耗力的环节。传统配音需要专业录音棚、配音演员和后期处理&#xff0c;成本高且周期长。Fish Speech 1.5的出现为视频创作者提供…...

【ArUco GridBoard实战】从精度瓶颈到优化检测的完整指南

1. ArUco GridBoard的精度瓶颈与优化思路 在实际的计算机视觉项目中&#xff0c;我们经常会遇到标定板尺寸受限的情况。比如我之前做的一个工业检测项目&#xff0c;标定板尺寸被限制在3cm2cm以内。最初使用的是Charuco标定板&#xff0c;但很快就发现了一个严重问题&#xff1…...