• SQL动态配置,动态解析SQL


    在项目中使用SQL动态配置的方式可以让后期的维护和发布后的修改变得更加方便,无论使用那种配置方式都离不开解析成最终真正能执行的SQL。
    下面代码就是一种比较简单的处理方法,SQL的参数以##括起来。

    1.在代码中先建立一个需要解析的SQL,后面需要变成配置方式

    /// <summary>
    /// 暂时用于测试
    /// </summary>
    static string _sql = "SELECT * FROM TB_USER WHERE ID = #ID# AND NAME LIKE '%#NAME#%'";

    2.建立一个根据参数KEY去解析的方法,一般情况下都是使用此方法

    /// <summary>
    /// 根据SQL和参数集合解析成需要执行的SQL
    /// </summary>
    /// <param name="str"></param>
    /// <param name="dic"></param>
    /// <returns></returns>
    public static string AnalyticalByDic(string str, Dictionary<string, string> dic)
    {
        str = str.ToUpper();
        foreach (var item in dic)
        {
            str = str.Replace(string.Format("#{0}#", item.Key.ToUpper()), item.Value);
        }
        return str;
    }

    3.建立一个根据顺序解析的方法,不推荐使用此方法

    /// <summary>
    /// 根据SQL和参数集合解析成需要执行的SQL
    /// </summary>
    /// <param name="str"></param>
    /// <param name="list"></param>
    /// <returns></returns>
    public static string AnalyticalByList(string str, List<string> list)
    {
        str = str.ToUpper();
        List<string> sqlList = new List<string>();
        var sqlstr = str;
        int i = 0;
        int j = 0;
        int sum = 0;
        while (true)
        {
            i = str.Substring(sum, str.Length - sum).IndexOf('#') + 1;
            sum += i;
            j = str.Substring(sum, str.Length - sum).IndexOf('#');
            if (i < 0 || j < 0)
            {
                break;
            }
            sqlList.Add(str.Substring(sum, j));
            sum += j + 1;
        }
        for (int index = 0; index < sqlList.Count && index < list.Count; index++)
        {
            str = str.Replace(string.Format("#{0}#", sqlList[index].ToUpper()), list[index]);
        }
        return str;
    }

    4.方法建好了,就试一下DEMO看看效果,直接在Main里面调用就好

    static void Main(string[] args)
    {
        Dictionary<string, string> dic = new Dictionary<string, string>();
        dic.Add("ID", "123");
        dic.Add("Name", "jimmy.pan");
        string sql = _sql;
        Console.WriteLine(AnalyticalByDic(sql, dic));
        List<string> list = new List<string>();
        list.Add("456");
        list.Add("jimmy");
        sql = _sql;
        Console.WriteLine(AnalyticalByList(sql, list));
        Console.Read();
    }

    5.运行结果如下图

    6.整体代码

    using System;
    using System.Collections.Generic;
    
    namespace SQLAnalytical
    {
        class Program
        {
            static void Main(string[] args)
            {
                Dictionary<string, string> dic = new Dictionary<string, string>();
                dic.Add("ID", "123");
                dic.Add("Name", "jimmy.pan");
                string sql = _sql;
                Console.WriteLine(AnalyticalByDic(sql, dic));
                List<string> list = new List<string>();
                list.Add("456");
                list.Add("jimmy");
                sql = _sql;
                Console.WriteLine(AnalyticalByList(sql, list));
                Console.Read();
            }
    
            /// <summary>
            /// 根据SQL和参数集合解析成需要执行的SQL
            /// </summary>
            /// <param name="str"></param>
            /// <param name="dic"></param>
            /// <returns></returns>
            public static string AnalyticalByDic(string str, Dictionary<string, string> dic)
            {
                str = str.ToUpper();
                foreach (var item in dic)
                {
                    str = str.Replace(string.Format("#{0}#", item.Key.ToUpper()), item.Value);
                }
                return str;
            }
    
            /// <summary>
            /// 根据SQL和参数集合解析成需要执行的SQL
            /// </summary>
            /// <param name="str"></param>
            /// <param name="list"></param>
            /// <returns></returns>
            public static string AnalyticalByList(string str, List<string> list)
            {
                str = str.ToUpper();
                List<string> sqlList = new List<string>();
                var sqlstr = str;
                int i = 0;
                int j = 0;
                int sum = 0;
                while (true)
                {
                    i = str.Substring(sum, str.Length - sum).IndexOf('#') + 1;
                    sum += i;
                    j = str.Substring(sum, str.Length - sum).IndexOf('#');
                    if (i < 0 || j < 0)
                    {
                        break;
                    }
                    sqlList.Add(str.Substring(sum, j));
                    sum += j + 1;
                }
                for (int index = 0; index < sqlList.Count && index < list.Count; index++)
                {
                    str = str.Replace(string.Format("#{0}#", sqlList[index].ToUpper()), list[index]);
                }
                return str;
            }
    
            /// <summary>
            /// 暂时用于测试
            /// </summary>
            static string _sql = "SELECT * FROM TB_USER WHERE ID = #ID# AND NAME LIKE '%#NAME#%'";
    
        }
    }
  • 相关阅读:
    java发送http的get、post请求
    spring boot注解 --@EnableAsync 异步调用
    java代码将e.printStackTrace()写入log4j文件异常信息
    Mybatis 传入List类型参数,报错:There is no getter for property named '__frch_item_0' in
    mongodb 只查询一个字段
    如何在java List中进行模糊查询
    java操作Mongodb
    java操作mongodb时,对象bean和DBObject相互转换的方法
    java 字符串,字符数组,list间的转化
    ldconfig 让安装的 php 的rdkafka生效
  • 原文地址:https://www.cnblogs.com/Jimmy-pan/p/4261815.html
Copyright © 2020-2023  润新知