在工作業務中,總是需要建實體類,建資料庫,但是通過官方的映射,也是必須要建立其中一個,才能實作資料庫和實體類的建立。
為了偷懶,我研究了下面這個一鍵生成實體類和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; }
}
}
第二步: 簡單的畫了一下調用接口的頁面
調用接口如下:
最後實作的效果就是
自我感覺這個對我在工作中建立十幾個二十幾個字段不想麻煩時,應用一下還是很好用的!
大家如果有更好的想法,歡迎來到評論區讨論!!!
來源:https://juejin.cn/post/7226267942149160997