天天看點

一鍵生成實體類和SQL語句小工具

作者:碼農看看
一鍵生成實體類和SQL語句小工具

在工作業務中,總是需要建實體類,建資料庫,但是通過官方的映射,也是必須要建立其中一個,才能實作資料庫和實體類的建立。

為了偷懶,我研究了下面這個一鍵生成實體類和SQL語句的小工具,隻需要輸入字段等等資訊,就會自動生成實體類和SQL語句,個人感覺非常好用!!!

建立這個小工具,我的想法邏輯是:按照我工作需要的需求,輸入字段名稱,類型,實體類名稱,以及sql語句對應的資料庫類型, 生成對應的實體類和SQL語句

第一步:建立生成實體類和SQL語句的方法:CreateClassFieAndSql

csharp複制代碼using ClassTableClient.DTO;
using ClassTableClient.Enum;
using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Text;

namespace ClassTableClient.Utils
{
    public class ClassServiceHelper
    {
        //項目路徑
        static string[] path = Directory.GetCurrentDirectory().Split('\\');
        //項目名稱
        static string nameSpace = path[path.Length - 1];


        /// <summary>
        /// 生成實體類cs檔案 和 建立資料表的sql語句
        /// 可以生成多個實體類
        /// </summary>
        /// <param name="tableName">表名</param>
        /// <param name="properts">屬性清單</param>
        /// <param name="serverType">資料庫類型</param>
        /// <param name="sql">傳回參數:生成的sql語句</param>
        /// <returns></returns>
        public static int CreateClassFieAndSql(string tableName, List<GenericClassDTO> properts, ServerTypeEnum serverType, out string sql)
        {
            sql = null;
            try
            {
                if (string.IsNullOrEmpty(tableName) && properts == null || properts.Count <= 0)
                {
                    return -1;
                }

                //屬性資訊
                Dictionary<string, string> propertKeyValue = new Dictionary<string, string>();
                //建立表sql語句

                //執行個體化一個可變字元串用于拼接生成的實體類資訊
                StringBuilder stringBuilder = new StringBuilder();

                //預設命名空間為項目名稱,把實體類生成到項目目錄中
                stringBuilder.AppendLine(#34;namespace {nameSpace}");
                stringBuilder.AppendLine("{");
                stringBuilder.AppendLine(#34;    public class {tableName}");
                stringBuilder.AppendLine("    {");
                foreach (var propert in properts)
                {
                    stringBuilder.AppendLine("        /// <summary>");
                    stringBuilder.AppendLine(#34;        /// {propert.PropertRemark}");
                    stringBuilder.AppendLine("        /// <summary>");
                    stringBuilder.AppendLine(#34;        public {propert.PropertType} {propert.PropertName} {{ get;set; }}");
                    stringBuilder.AppendLine();

                    //屬性值資訊
                    propertKeyValue.Add(propert.PropertName, propert.PropertType);
                }
                stringBuilder.AppendLine("    }");
                stringBuilder.AppendLine("}");

                //該檔案的輸出路徑
                string outputPath = Directory.GetCurrentDirectory() + "\\Model\\" + tableName + ".cs";
                System.IO.File.AppendAllText(outputPath, stringBuilder.ToString());

                //sql語句拼接
                sql = SqlJoin(propertKeyValue, tableName, serverType);
            }
            catch (Exception ex)
            {
                Console.WriteLine("生成實體類cs檔案異常:" + ex.Message);
                return -2;
            }
            return 200;
        }


        /// <summary>
        /// Sql語句拼接
        /// </summary>
        /// <param name="data">屬性-類型 字典</param>
        /// <param name="tableName">實體類名-表名</param>
        /// <param name="serverType">資料庫類型</param>
        /// <returns>建立資料庫:表、字段的SQL語句</returns>
        public static string SqlJoin(Dictionary<string, string> data, string tableName, ServerTypeEnum serverType)
        {
            //sql語句
            string sql = string.Empty;
            //主鍵屬性
            string PrimaryKey = string.Empty;
            //是否是第一個字段
            bool isFirst = true;

            switch (serverType)
            {
                case ServerTypeEnum.MySql:  //MySql資料庫
                    //拼接表名
                    sql += #34;DROP TABLE IF EXISTS `{tableName}`; " +
                        #34;CREATE TABLE `{tableName}`(";

                    //拼接字段
                    foreach (var item in data)
                    {
                        //是否是第一個字段,第一個字段預設主鍵
                        if (isFirst)
                        {
                            PrimaryKey = item.Key;
                            isFirst = false;
                        }

                        //資料庫字段類型
                        string servicePropertType = VerifyPropertType(item.Value, ServerTypeEnum.MySql);

                        //判斷屬性類型是否識别
                        if (!string.IsNullOrEmpty(servicePropertType))
                        {
                            //識别,拼接sql
                            sql += $@"`{item.Key}` {servicePropertType},";
                        }
                        else
                        {
                            return "擁有未知類型!";
                        }
                    }

                    sql += #34; PRIMARY KEY (`{PrimaryKey}`) USING BTREE);";

                    break;
                case ServerTypeEnum.SqlServer:  //SqlServer資料庫
                    //拼接表名
                    sql += #34;IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[{tableName}]') AND type IN ('U')) " +
                        #34;DROP TABLE [dbo].[{tableName}] " +
                        #34;CREATE TABLE [dbo].[{tableName}] (";

                    //拼接字段
                    foreach (var item in data)
                    {
                        //是否是第一個字段,第一個字段預設主鍵
                        if (isFirst)
                        {
                            PrimaryKey = item.Key;
                            isFirst = false;
                        }

                        //資料庫字段類型
                        string servicePropertType = VerifyPropertType(item.Value, ServerTypeEnum.SqlServer);

                        //判斷屬性類型是否識别
                        if (!string.IsNullOrEmpty(servicePropertType))
                        {
                            //識别,拼接sql
                            sql += $@"[{item.Key}] {servicePropertType},";
                        }
                        else
                        {
                            return "擁有未知類型!";
                        }
                    }

                    sql += #34; PRIMARY KEY ([{PrimaryKey}]));";

                    break;
                case ServerTypeEnum.Sqlite: //Sqlite
                    //拼接表名
                    sql += #34;DROP TABLE IF EXISTS `{tableName}`; " +
                        #34;CREATE TABLE `{tableName}` (";

                    //拼接字段
                    foreach (var item in data)
                    {
                        //資料庫字段類型
                        string servicePropertType = VerifyPropertType(item.Value, ServerTypeEnum.Sqlite);

                        //是否是第一個字段,第一個字段預設主鍵
                        if (isFirst)
                        {
                            PrimaryKey = item.Key;
                            isFirst = false;
                            if (!string.IsNullOrEmpty(servicePropertType))
                            {
                                servicePropertType += " NOT NULL";
                            }
                        }

                        //判斷屬性類型是否識别
                        if (!string.IsNullOrEmpty(servicePropertType))
                        {
                            //識别,拼接sql
                            sql += #34;`{item.Key}` {servicePropertType},";
                        }
                        else
                        {
                            return "擁有未知類型!";
                        }
                    }

                    sql += #34; PRIMARY KEY (`{PrimaryKey}`));";

                    break;
                default:
                    return null;
            }
            return sql;
        }


        /// <summary>
        /// 校驗字段類型
        /// </summary>
        /// <param name="type">資料類型</param>
        /// <param name="serverType">資料庫類型</param>
        /// <returns>對應的資料庫字段類型</returns>
        public static string VerifyPropertType(string type, ServerTypeEnum serverType)
        {
            string result = string.Empty;
            switch (serverType)
            {
                case ServerTypeEnum.MySql:
                    switch (type)
                    {
                        case "Int32":
                        case "int":
                        case "Boolean":
                        case "bool":
                            result = "int(0)";
                            break;
                        case "String":
                        case "string":
                            result = "varchar(255)";
                            break;
                        case "DateTime":
                        case "dateTime":
                            result = "datetime(0)";
                            break;
                        case "Double":
                        case "double":
                            result = "double";
                            break;
                    }
                    break;
                case ServerTypeEnum.SqlServer:
                    switch (type)
                    {
                        case "Int32":
                        case "int":
                        case "Boolean":
                        case "bool":
                            result = "int";
                            break;
                        case "String":
                        case "string":
                            result = "nvarchar(255)";
                            break;
                        case "DateTime":
                        case "dateTime":
                            result = "datetime";
                            break;
                        case "Double":
                        case "double":
                            result = "decimal(18)";
                            break;
                    }
                    break;
                case ServerTypeEnum.Sqlite:
                    switch (type)
                    {
                        case "Int32":
                        case "int":
                            result = "integer(2)";
                            break;
                        case "Boolean":
                        case "bool":
                            result = "integer(32)";
                            break;
                        case "String":
                        case "string":
                        case "DateTime":
                        case "dateTime":
                            result = "TEXT(40)";
                            break;
                        case "Double":
                        case "double":
                            result = "real(40)";
                            break;
                    }
                    break;
                default:
                    break;
            }
            return result;
        }

    }
    
    
    public class GenericClassDTO
    {
        /// <summary>
        /// 屬性名稱
        /// </summary>
        public string PropertName { get; set; }
        /// <summary>
        /// 屬性類型
        /// </summary>
        public string PropertType { get; set; }
        /// <summary>
        /// 屬性備注
        /// </summary>
        public string PropertRemark { get; set; }
    }
}

      
      
           

第二步: 簡單的畫了一下調用接口的頁面

一鍵生成實體類和SQL語句小工具

調用接口如下:

一鍵生成實體類和SQL語句小工具

最後實作的效果就是

一鍵生成實體類和SQL語句小工具

自我感覺這個對我在工作中建立十幾個二十幾個字段不想麻煩時,應用一下還是很好用的!

大家如果有更好的想法,歡迎來到評論區讨論!!!

來源:https://juejin.cn/post/7226267942149160997

繼續閱讀