文档章节

SQL拼接

远方__
 远方__
发布于 2016/12/23 12:34
字数 500
阅读 7
收藏 0

常见的SQL拼接

1
2
id =3;
"select * from orders where employeeid=" +id;

这样存在的问题是相当明显的就是SQL注入,如果需要参数化那在编写代码的时候就相对多了些工作。下面介绍通过以上的编写方式自动实现参数化功能。

自动参数化处理

1
2
3
id=3;
SQL sql= "select * from orders where empoyeeid=@id" ;
sql = sql +id;

更多实际应用效果

1
2
3
4
5
6
7
8
9
10
11
             string  city = "sdf" ;
             SQL sql = "select * from orders where employeeid=@i" ;
             sql = sql + 3;
             Output(sql);
             sql = "select * from order where employeeid in(@p1,@p2)" ;
             sql = sql + 3 + 4;
             Output(sql);
             sql = "select * from orders where 1=1" ;
             if  (city != null )
                 sql = sql+ " and city=@p1"  + city;
             Output(sql);

最终处理参数化的结果是:

1
2
3
4
5
6
7
8
9
10
SQL: select  * from  orders where  employeeid=@i
     Name:@i=3
-------------------------------------------
SQL: select  * from  order where  employeeid in (@p1,@p2)
     Name:@p1=3
     Name:@p2=4
-------------------------------------------
SQL: select  * from  orders where  1=1 and city=@p1
     Name:@p1=sdf
-------------------------------------------

实现

为了达到以上处理效果针对性实现了一个SQL对象,通过运算符的重载把+运算修改一下。在处理的过程需要对SQL语句和值的处理,首先当一个SQL String进桟的时候先分析一下这个String是否包括参数,如果包括就把参数压到队列中,大概代码如下:

1
2
3
4
5
6
7
8
9
10
11
private  void  MatchSql( string  sql)
         {
             MatchCollection matchs = Regex.Matches(sql, "@[a-zA-Z0-9]+" );
             if  (matchs.Count > 0)
             {
                 foreach  (Match item in  matchs)
                 {
                     mInputParameters.Enqueue(item.Value);
                 }
             }
         }

 简单地一个正则匹配就OK了,把找到的参数压队列中。有了这个依据那在向SQL对象再次压入值的时候就可以判断参数队列是否有参数,如果有就压到SQL参数集里面,没有就拼接到SQL语句中。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
public  static  SQL operator  +(SQL sql, ValueType value)
         {
 
             if  (sql.mInputParameters.Count > 0)
             {
                 sql.Parameter(sql.mInputParameters.Dequeue(), value);
             }
 
             return  sql;
         }
         public  static  SQL operator  +(SQL sql, string  subsql)
         {
 
             if  (sql.mInputParameters.Count > 0)
             {
                 sql.Parameter(sql.mInputParameters.Dequeue(), subsql);
             }
             else
                 sql.AddSql(subsql);
 
             return  sql;
    }

本文转载自:http://blog.csdn.net/sinat_27615265/article/details/48132783

远方__
粉丝 0
博文 82
码字总数 0
作品 0
丰台
程序员
私信 提问
芝麻HTTP: Scrapy小技巧

这两天上班接手,别人留下来的爬虫发现一个很好玩的 SQL脚本拼接。 只要你的Scrapy Field字段名字和 数据库字段的名字 一样。那么恭喜你你就可以拷贝这段SQL拼接脚本。进行MySQL入库处理。 ...

芝麻软件
2018/01/29
20
0
芝麻HTTP:MySQL存储

只要你的Scrapy Field字段名字和 数据库字段的名字 一样。那么恭喜你你就可以拷贝这段SQL拼接脚本。进行MySQL入库处理。 具体拼接代码如下:

芝麻软件
2018/03/01
32
0
源码分析 Mybatis 的 foreach 为什么会出现性能问题

背景 最近在做一个类似于综合报表之类的东西,需要查询所有的记录(数据库记录有限制),大概有1W条记录,该报表需要三个表的数据,也就是根据这 1W 个 ID 去执行查询三次数据库,其中,有一...

TSMYK
2018/12/16
2.2K
13
mysql 更改查询结果追加值,sql多个字段拼接

sql多个字段拼接 2012-01-05 14:05:47| 分类: 数据库 | 标签: |字号大中小 订阅 MySQL 在Java等编程语言汇总字符串的拼接可以通过加号“+”来实现,比如:"1"+"3"、"a"+"b"。在MySQL中也可......

NotFoundException
2013/04/08
10.4K
1
【MyBatis框架】mapper配置文件-关于动态sql

动态sql 1.什么是动态sql mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接、组装。 2.需求 用户信息综合查询列表和用户信息查询列表总数这两个statement的定义使...

Mysoft
2015/09/18
93
0

没有更多内容

加载失败,请刷新页面

加载更多

x002-语言元素

变量命令规则 硬性规则: 变量名由字母(广义的Unicode字符,不包括特殊字符)、数字和下划线构成,数字不能开头。 大小写敏感(大写的a和小写的A是两个不同的变量)。 不要跟关键字(有特殊...

伟大源于勇敢的开始
今天
4
0
nginx反向代理配置

nginx配置文件位置/usr/local/nginx/conf/nginx.conf 配置文件修改: # cd /usr/local/nginx/conf # vim nginx.conf server {listen 80;server_name localhost;#charset k......

行者终成事
今天
5
0
OSChina 周日乱弹 —— 这是假的,和我之前的不一样

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 小小编辑推荐:《男孩》-梁博 / 陶孟童 / 肖和东 / 高誉容 《男孩》-梁博 / 陶孟童 / 肖和东 / 高誉容 手机党少年们想听歌,请使劲儿戳(这里...

小小编辑
今天
8
0
Rust学习笔记一 数据类型

写在前面 我也不是什么特别厉害的大牛,学历也很低,只是对一些新语言比较感兴趣,接触过的语言不算多也不算少,大部分也都浅尝辄止,所以理解上可能会有一些偏差。 自学了Java、Kotlin、Python、...

MusiCodeXY
今天
5
0
Java 脚本引擎入门

Java Script Engine Java 脚本引擎可以将脚本嵌入Java代码中,可以自定义和扩展Java应用程序,自JDK1.6被引入,基于Rhino引擎,JDK1.8后使用Nashorn引擎,支持ECMAScript 5,但后期还可能会换...

阿提说说
今天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部