在 2019-10-21 2019-10-21 发表的泛型当中我们说过一个很重要的点就是不同的泛型类,进入的时候其实在后台的时候创建了不同的类,所以进入的类其实是不同的由此我们可以想想出一种方法 来做缓存
namespace YZMDAL
{
public class SQLBuilder<T> where T: BaseModel
{
private static string FindOne = null;
private static string insertSql = null;
private static string updatedb = null;
private static string Deletesql = null;
/// <summary>
/// 无参构造器
/// </summary>
static SQLBuilder()
{
{
Type type = typeof(T);//获取类型
string columnString = string.Join(",", type.GetProperties().Select(x => $"`{x.GetColumnMappingName()}`"));
FindOne = $@"select {columnString} from `{type.GetMappingName()}` where Id=@id";//type.GetMappingName()特性的语法糖
}
{
Type type = typeof(T);//获取类型
string columnString = string.Join(",", type.GetProperties().FilterKey().Select(x => $"`{x.GetColumnMappingName()}`"));//出去主键Id
//遍历属性值
string ValuesString = string.Join(",", type.GetProperties().FilterKey().Select(x => $"@{x.GetColumnMappingName()}"));
insertSql = $@"Insert into `{type.Name}`({columnString}) values({ValuesString})";
}
{
Type type = typeof(T);
//string Columnsql = string.Join(",", type.GetProperties().FilterKey().Select(x => $"{x.Name}=$'{x.GetValue(t)??DBNull.Value }'"));//为防止sql注入
string Columnsql = string.Join(",", type.GetProperties().FilterKey().Select(x => $"`{x.Name}`=@{x.Name}"));//防止sql注入并使用sqlparament
updatedb = $"UPDATE `{type.Name}` SET {Columnsql} where Id=@Id ";
}
{
//delete 方法
Type type = typeof(T);
//string Columnsql = string.Join(",", type.GetProperties().FilterKey().Select(x => $"{x.Name}=$'{x.GetValue(t)??DBNull.Value }'"));//为防止sql注入
string Columnsql = string.Join(",", type.GetProperties().FilterKey().Select(x => $"{x.Name}=@{x.Name}"));//防止sql注入并使用sqlparament
Deletesql = $" delete from `{type.Name}` where Id = @Id ";
}
}
/// <summary>
/// 对外提供的接口
/// </summary>
/// <param name="sqlType"></param>
/// <returns></returns>
public static string GetSql (sqlType sqlType)
{
switch (sqlType)
{
case sqlType.FindOne:
return FindOne;
case sqlType.insertSql:
return insertSql;
case sqlType.updatedb:
return updatedb;
case sqlType.Delete:
return Deletesql;
default:
throw new Exception("我也不知道该写啥");
}
}
/// <summary>
/// 枚举传参
/// </summary>
public enum sqlType
{
FindOne ,
insertSql,
updatedb,
Delete
}
}
}