另类SQL拼接方法

在编写SQL的时候经常需要对SQL进行拼接,拼接的方式就是直接String+处理,但这种情况有个不好的地方就是不能对SQL进行参数化处理。下面介绍一种就算基于String +的方式也可以进行SQL参数处理。

常见的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;
   }

这样一个基于拼接的SQL参数化处理就完成了,以上紧紧是想表达一下运算符重载所带来的效果,对于这种方式编写参数化SQL是好是坏就没有一个标准,相对一些人来说也许方便,但也有可能觉得这简值一塌糊涂:)看自己喜好。

SQL拼接方法的更多相关文章

  1. 另类SQL拼接方法

    在编写SQL的时候经常需要对SQL进行拼接,拼接的方式就是直接String+处理,但这种情况有个不好的地方就是不能对SQL进行参数化处理.下面介绍一种就算基于String +的方式也可以进行SQL参数 ...

  2. 多条件分页查找(SQL拼接方法)

    def startTime=params.startTime+" 00:00:00"  def endTime=params.endTime + " 23:59:59&q ...

  3. 自己写的Python数据库连接类和sql语句拼接方法

    这个工具类十分简单和简洁. sql拼接方法 # encoding=utf-8 from django.http import HttpResponse from anyjson import seri ...

  4. Mybatis.net与MVC入门配置及联合查询动态SQL拼接和简单事务

    第一次学习Mybatis.net,在博客园也找到好多资料,但是在配置成功之后也遇到了一些问题,尤其是在动态SQl拼接时候,这里把遇到的问题还有自己写的一个Demo贴出来,希望能帮到新手,有不适合的地方 ...

  5. Mybatis笔记 - SQL标签方法

    Mpper.xml映射文件中定义了操作数据库的sql,并且提供了各种标签方法实现动态拼接sql.每个sql是一个statement,映射文件是mybatis的核心. 一.内容标签 1.NamePlac ...

  6. Mybatis总结一之SQL标签方法

    ---恢复内容开始--- 定义:mapper.xml映射文件中定义了操作数据库的sql,并且提供了各种标签方法实现动态拼接sql.每个sql是一个statement,映射文件是mybatis的核心. ...

  7. 巧用SQL拼接语句

    前言: 在日常数据库运维过程中,可能经常会用到各种拼接语句,巧用拼接SQL可以让我们的工作方便很多,达到事半功倍的效果.本篇文章将会分享几个日常会用到的SQL拼接案例,类似的SQL还可以举一反三,探索 ...

  8. PL/SQL异常处理方法

    PL/SQL异常处理方法   1:什么是异常处理: PL/SQL提供一个功能去处理异常,在PL/SQL块中叫做异常处理,使用异常处理我们能够测试代码和避免异常退出. PL/SQL异常信息包含三个部分: ...

  9. SQL 跟踪方法相关介绍

    oracle sql跟踪方法:1.sql_trace打开跟踪:alter session set sql_trace=true;为跟踪文件做标记:alter session set tracefile ...

随机推荐

  1. Java初认识--环境搭建及基本数据类型

    一.JAVA语言的环境搭建 1.JRE(Java Runtime Environment):Java运行环境. 它包括Java虚拟机和Java程序所需的核心类库等. 2.JDK(Java Develo ...

  2. Android Notification通知详细解释

    Android Notification通知具体解释  Notification: (一).简单介绍:         显示在手机状态栏的通知. Notification所代表的是一种具有全局效果的通 ...

  3. c#-Artificial Intelligence Class

    NET Artificial Intelligence Class http://www.codeproject.com/KB/recipes/aforge_neuro/neuro_src.zip

  4. three.js 源代码凝视(七)Math/Euler.js

    商域无疆 (http://blog.csdn.net/omni360/) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:商域无疆 -  本博客专注于 敏捷开发 ...

  5. C# 文件下载类

    using System; using System.Net; using System.IO; using System.Text; using System.Web; using System.W ...

  6. 图解IntelliJ IDEA 13版本对Android SQLite数据库的支持

    IntelliJ IDEA 13版本的重要构建之一是支持Android程序开发.当然对Android SQLite数据库的支持也就成为了Android开发者对IntelliJ IDEA 13版本的绝对 ...

  7. CentOS上安装WordPress搭建博客平台

    前两天在服务器上搭建了AMP,今天试着在上面安装了一个WordPress(中文:http://cn.wordpress.org/,英文:http://wordpress.org/),我安装的是英文最新 ...

  8. LeetCode之Max Points on a Line Total

    1.问题描述 Given n points on a 2D plane, find the maximum number of points that lie on the same straight ...

  9. bootstrap导航菜单,手机和PC端

    源代码 <!DOCTYPE html> <html> <head lang="en"> <meta name="viewport ...

  10. android application简要类(一)

    每次应用程序执行.应用application保持实例化的阶级地位.推而广之applicaiton类别,能够完成以下3长期工作: 1.至android应用级事件,如广播的实现中低声回应. 2.传递应用程 ...