您现在的位置是:首页 > 正文

java自定义sql 格式化工具

2024-02-29 12:44:58阅读 5
/**
 * @author :Frans
 * @date :Created in 2021/11/3 20:06
 * @description: sql占位符替换工具类
 * @modified By:
 */
public class SqlPlaceholderReplaceUtil {

	/**
	 *  替换掉SQL注入的那些字符 ['|;|--| and | or ]
	 */
	private static String SQL_INJECT_CHARS = "([';]+|(--)+|(\\s+([aA][nN][dD])\\s+)+|(\\s+([oO][rR])\\s+)+)";

	/**
	 * 替换{}的sql 也可以支持#{xx}
	 */
	private static PropertyPlaceholderHelper helper = new PropertyPlaceholderHelper(
			"{", "}");

	/**
	 * 替换占位符
	 * @param value
	 * @param properties
	 * @return
	 */
	public static String replacePlaceholders(String value, final Properties properties) {
		return helper.replacePlaceholders(value, properties);
	}

	/**
	 * @author: Frans
	 * @description: 根据问号占位符替换sql
	 * @date 2021/12/3 14:49
	 * @param sql
	 * @return params
	 */
	public static String paddingParam(String sql , List<Object> params) {
		if(CollectionUtil.isEmpty(params)){
			return sql;
		}
		//参数个数至少是?个数
		int countQuestion = StrUtil.count(sql, "?");
		if(countQuestion > params.size()){
			throw new IllegalArgumentException("sql need " + countQuestion + " params, but has only " + params.size() + "\r\n" + sql + "\r\n" + params);
		}

		// 填充参数
		for(int i = 0 , size = params.size(); i < size; i++){
			// 1.巧妙利用替换一次之后,后面的?就自动往前移动一位,那么replaceFirst每次替换的就是下一个?
			// 2.去掉某些特殊符号,防注入
			String param = (params.get(i) instanceof Number) ? params.get(i) + "" :
					"'" + params.get(i).toString().replaceAll(SQL_INJECT_CHARS, "")
							+ "'";
			sql = sql.replaceFirst("\\?", param);
		}
		return sql;
	}

	public static void main(String[] args) {
		String sql ="select * from sys_user where name = ? and age = ?";
//		Properties properties = new Properties();
//		properties.setProperty("name","foss");
//		properties.setProperty("age","'12'");
		String name = "zhangsan";
		int age = 12;
		List<Object> params = new ArrayList<>();
		params.add(name);
		params.add(age);
		String s = paddingParam(sql, params);
		System.out.println(s);
	}

部分代码转自码云

在网上没有看到解决办法,特此发布,以便于解决诸位码友困扰.

网站文章

  • C/C++内存知识(一)

    C/C++内存知识(一)

      一个由C/C++编译的程序占用的内存分为以下几个部分   1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。   2、堆区(heap)— 由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。   3、全局区(静态区)(s...

    2024-02-29 12:44:53
  • tiny4412 基础(七)移植command

    tiny4412 基础(七)移植command

    先看效果图​这个图是在裸机下跑的,移植了u-boot的command, 新的u-boot改成cli(命令行接口)使用起来非常方便:static int do_version (struct cmd_tbl_s *cmd_tbl_t, int argc, int type, char * const argv[]){ puts("version : V1.0 \r\n")...

    2024-02-29 12:44:21
  • SpringMvc整合Druid.

    SpringMvc整合Druid.SpringMvc整合Druid数据库连接池1.pom.xml添加依赖2.配置web.xml3.配置Spring4.访问监控页面5.碰到的问题 SpringMvc整合Druid数据库连接池 1.pom.xml添加依赖 com.alibaba druid ${dr

    2024-02-29 12:44:14
  • 《实用python程序设计》练习题:成绩排序

    描述 给出班里某门课程的成绩单,请你按成绩从高到低对成绩单排序输出,如果有相同分数则名字字典序小的在前。 输入 第一行为n (0 &lt; n &lt; 20),表示班里的学生数目; 接下来的n行,每...

    2024-02-29 12:44:07
  • FCFS先来先服务算法C++

    FCFS简单的讲就是先到达的先服务,比如A进程3秒到达,B进程2秒到达的话,那么就让B一直执行到满足它所需的服务时间。它是非抢占式的。**

    2024-02-29 12:43:37
  • 从DDD角度来看MVC

    从DDD角度来看MVC

    DDD不是银弹,只是微服务架构下的最佳代码结构实践

    2024-02-29 12:43:26
  • ansible报错"RequestsDependencyWarning"

    报错提示ans -m ping devS/usr/lib/python2.7/site-packages/requests/__init__.py:91: RequestsDependencyWarning: urllib3 (1.23) or chardet (2.2.1) doesn't match a supported version! RequestsDependencyWarn...

    2024-02-29 12:43:19
  • LeetCode最长有效括号

    LeetCode: Longest Valid Parentheses问题描述Given a string containing just the characters ‘(’ and ‘)’, fi...

    2024-02-29 12:42:50
  • vue axios 兼容性处理

    项目中发现,在安卓4.3及以下的手机不支持axios的使用,主要就是无法使用promise。加上以下polyfill就可以了。 项目中安装es6-promise cnpm install es6-promise --save-dev main.js里面添加 require(&#39;es6-promise&#39;).polyfill()    转载于:https://www.c...

    2024-02-29 12:42:31
  • 交大计算机专硕 学费,从4万涨到12万?上海交通大学这个专业“太贵”,家长:供不起...

    交大计算机专硕 学费,从4万涨到12万?上海交通大学这个专业“太贵”,家长:供不起...

    从4万涨到12万?上海交通大学这个专业“太贵”,家长:供不起。目前,基本很多考生都收到了自己的大学录取通知书,那么大家在收到录取通知书后做的第一件事都是什么呢?谨慎的考生都会检查通知书上的内容,其实这...

    2024-02-29 12:42:03