当前位置: 首页 > 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;}
}
http://www.lryc.cn/news/406650.html

相关文章:

  • 锁相环 vivado FPGA
  • 英语科技写作 希拉里·格拉斯曼-蒂(英文版)pdf下载
  • 《Dynamic Statistical Learning in Massive Datastreams》论文阅读笔记
  • 【数据分享】2008-2022年我国省市县三级的逐日NO2数据(excel\shp格式)
  • JavaEE (1)
  • 事务、函数和索引
  • Android APP 基于RecyclerView框架工程(知识体系积累)
  • 【iOS】GCD
  • C语言 | Leetcode C语言题解之第282题给表达式添加运算符
  • 如何使用 API list 极狐GitLab 容器镜像仓库中的 tag?
  • 粒子群算法PSO优化BP神经网络(PSO-BP)回归预测——Python和MATLAB实现
  • React-router路由配置及跳转
  • vue3【实战】可编辑的脱敏信息
  • S71200 - 笔记
  • linux系统查历史cpu使用数据(使用sar 查询cpu和网络占用最近1个月历史数据)。
  • Edge浏览器加载ActiveX控件
  • BUG与测试用例设计
  • 怎么在使用select2时,覆盖layui的下拉框样式
  • MacOSM1 配置Miniconda环境,并设置自启动
  • poi库简单使用(java如何实现动态替换模板Word内容)
  • 机器人开源调度系统OpenTcs6二开-车辆表定义
  • 麦歌恩MT6521-第三代汽车磁性角度传感器芯片
  • 【数据结构】堆,优先级队列
  • 2024 暑假友谊赛 2
  • c++ 线程
  • 【SpringBoot】URL映射之consumes和produces匹配、params和header匹配
  • vscode配置django环境并创建django项目(全图文操作)
  • (一)延时任务篇——延时任务的几种实现方式概述
  • 每天五分钟计算机视觉:目标检测模型从RCNN到Fast R-CNN的进化
  • 环境变量配置文件中两种路径添加方式