• SQL拼接方法


    另类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是好是坏就没有一个标准,相对一些人来说也许方便,但也有可能觉得这简值一塌糊涂:)看自己喜好。

  • 相关阅读:
    Java 8 新特性之 Stream&forEach&map&filter&limit&sorted&统计函数&Collectors&并行(parallel)程序(转)
    kafka入门:简介、使用场景、设计原理、主要配置及集群搭建(转)
    java8 stream API
    Docker容器CPU、memory资源限制
    JVM调优总结 -Xms -Xmx -Xmn -Xss
    JAVA8之妙用Optional解决判断Null为空的问题
    【王凤鸣 太极缠丝功笔记】第二章
    【精美凉菜】黄瓜腐竹花生豆
    【瓜果篇】黄瓜
    【Teradata UDF】中文按字符查找chs_instr
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3259924.html
Copyright © 2020-2023  润新知