正则表达式替换SQL语句中的字段

问题描述

我想用正则表达式匹配一个insert的SQL语句,能够自动地将变量赋给对应的字段,比如SQL=“insert into table(item1,item2,item3) values(:item1,:item2,:item3)”map.put(item1,"111")map.put(item2,"222")map.put(item3,"333")我想用正则表达式自动的将SQL语句中的:item1,:item2,:item3替换成map中对应的“111”,"222","333"请问我该怎么写正则表达式的匹配语句和 对应的方法。

解决方案

搞错了。忘了加上非捕获组。刚才代码未验证。呵呵,偷懒了。String SQL="insert into table(item1,item2,item3) values(:item1,:item2,:item3)"; Map map = new HashMap();map.put("item1","111"); map.put("item2","222"); map.put("item3","333"); Pattern p=Pattern.compile("(?::)(\w+)(?:\b)"); Matcher m=p.matcher(SQL); StringBuffer result=new StringBuffer(); while (m.find()) { String key=m.group(1); m.appendReplacement(result,(String)map.get(key)); } m.appendTail(result); String resultSql=result.toString();System.out.println(resultSql);
解决方案二:
用PreparedStatement多好啊同样可以满足你的需求而且无需考虑单引号的转义,sql注入攻击这些问题
解决方案三:
引用不建议这么做,可能导致未验证BUG。至少 同上,这种做法无法防范SQL注入攻击
解决方案四:
Pattern p=Pattern.compile(":(\w+)\b");Match m=p.matcher(SQL);StringBuffer result=new StringBuffer();while (m.find()) { String key=m.group(1); m.appendReplacement(result,map.get(key));}m.appendTail(result);String resultSql=result.toString();不建议这么做,可能导致未验证BUG。至少对于这样的SQL是不适用的:SQL=“insert into table(item1,item2,item3) values('AAA:item1',:item2,:item3)”.会把字符串中的值替换掉。SQL还是用preparedStatement方式注入参数比较好。

时间: 2024-09-30 18:00:31

正则表达式替换SQL语句中的字段的相关文章

怎么在SQL语句中再加一个字段呀!

问题描述 怎么在SQL语句中再加一个字段呀! String sql = "select tab.nid,tab.tid,tab.pdate,tab.psysdate,tab.pprice,tab.prodname," + "tab.auditstatus,tab.pnumber,tab.zprice,tab.companyId,tab.sno,tab.soeno,tab.provname from " + "(select n.id nid,t.id ti

package-怎么在SQL语句中对抽出的字段的值进行判断?

问题描述 怎么在SQL语句中对抽出的字段的值进行判断? 要求是这样的,举个例子** SELECT A,B,C FROM TAB1 , 要求如果A的值为0的话就显示为空,请问怎么加判断啊?在哪里加呢? 解决方案 我已经写出来了,谢谢各位,还是跟大家分享一下 SELECT DECODE(A,'0','') AS A ,B AS B,C AS C FROM(SELECT A,B,C,D FROM TAB1) 解决方案二: SELECT case A when 0 then "" else c

在SQL Server中修改字段类型和字段名称

  在SQL Server中修改字段类型和字段名称 --以下是完整的SQL执行语句 if exists(select * from syscolumns where id=object_id('数据表名称') and name='字段名') --判断该字段是否存在 begin ALTER TABLE 表明 ALTER COLUMN 字段名 VARCHAR(64);--更改类型 end GO if exists(select * from syscolumns where id=object_id

解析SQL语句中Replace INTO与INSERT INTO的不同之处

本篇文章是对SQL语句中Replace INTO与INSERT INTO的不同之处进行了详细的分析介绍,需要的朋友参考下   REPLACE的运行与INSERT很相似.只有一点例外,假如表中的一个旧记录与一个用于PRIMARY KEY或一个UNIQUE索引的新记录具有相同的值,则在新记录被插入之前,旧记录被删除. 注意,除非表有一个PRIMARY KEY或UNIQUE索引,否则,使用一个REPLACE语句没有意义.该语句会与INSERT相同,因为没有索引被用于确定是否新行复制了其它的行. 所有列

sql 语句中in的用法总结

问题描述 sql 语句中in的用法总结 sql 语句中 in的用法都有什么?在网上说有两种但是只见有一种用法,另一种用法是什么? 解决方案 sql语句Group By用法一则SQL语句中的NOT IN 的优化sql语句判断 case when用法(二) 解决方案二: http://blog.csdn.net/naruto517308294/article/details/8650507 解决方案三: 就一种吧http://www.w3schools.com/sql/sql_in.asp 解决方案

求sql语句中带有条件的查询

问题描述 求sql语句中带有条件的查询 我现在有一张users表,有字段uid,uname,address,phone1,phone2,phone3: 我想在这张表中这样查: 主要查phone1,但是如果有一条数据的phone1位空的话,就查phone2,如果phone1,phone2都为空就查phone3,这样的SQL语句要怎么写呢,求大神帮忙解答???? 解决方案 select case when phone1 is null then ( case when phone2 is null

sql语句中出现了这样的错误怎么解决呀!

问题描述 sql语句中出现了这样的错误怎么解决呀! String sql = "select tab.nid,tab.tid,tab.pdate,tab.ptype,tab.psysdate,tab.pprice,tab.prodname," + "tab.auditstatus,tab.pnumber,tab.zprice,tab.companyId,tab.sno,tab.soeno,tab.provname from " + "(select n.i

JS、replace利用正则表达式替换SQL所有参数为指定格式的数据_正则表达式

SQL参数格式 例如:select * from tb where nd=:nd and yd=:yd 想一次性把所有SQL语句中参数(带冒号)全部换成数据, 开始 选定用正则表达式. 原先写这样 复制代码 代码如下: strsql.replace(/(:\w+)/g,("$1").substring(1)); "$1" 总是本解析成字符串,而不是匹配的值 换成 复制代码 代码如下: strsql.replace(/(:\w+)/g,$1); 又不能给出匹配值,$1

解析sql语句中left

以下是对在sql语句中left_join.inner_join中的on与where的区别进行了详细的分析介绍,需要的朋友可以参考下   table a(id, type): id     type ---------------------------------- 1      1         2      1          3      2          table b(id, class): id    class -------------------------------