不使用表达式树,使用强类型生成where子句,好处是性能高,相比表达式树生成的sql,10倍+

目前只支持生成where条件、查询语句,后期会增加生成Update SQL

where子句支持相等、比较大小、Between、Like、In操作

sql语句支持设置select字段、top、order by;不支持联表查询、group by

客户端调用:

 public static void Main(string[] args)
{
var sqlBuilder = new SqlBuilder(typeof(Person));
//生成查询SQL
#region 单个条件查询#SELECT * FROM `Person` WHERE `ID`=1 LIMIT 10
var filter = new EqualFieldFilter<int>("ID", );
var sql = sqlBuilder
.SetTop()
.SetWhere(filter)
.BuildSelectSql();
#endregion #region 复杂条件查询#SELECT `ID`,`Name` FROM `Person` WHERE ((`ID`=1 AND (`Age`=13 OR `Name`=1 OR `name` LIKE 'fan%'))) LIMIT 10
var filter2 = new AndFieldFilter(new EqualFieldFilter<int>("ID", ), new OrFieldFilter(new EqualFieldFilter<int>("Age", ), new EqualFieldFilter<int>("Name", ), new LikeFieldFilter("name", "fan", LikeMode.Start)));
var sql2 = sqlBuilder
.SetTableName(nameof(Person))
.SetAndWhere(filter2)
.BuildSelectSql();
#endregion #region 指定SELECT字段查询#SELECT `ID`,`Name` FROM `Person` WHERE LIMIT 10
var sql3 = sqlBuilder
.ResetBuilder()
.SetTableName(nameof(Person))
.SetSelect(nameof(Person.ID), nameof(Person.Name))
.BuildSelectSql(); sql3 = sqlBuilder
.ResetBuilder()
.SetTableName(nameof(Person))
.SetWhere(null)
.SetSelect(nameof(Person.ID), nameof(Person.Name))
.BuildSelectSql();
#endregion #region 带排序查询#SELECT `ID`,`Name` FROM `Person` WHERE (`ID`=1) ORDER BY ID ASC,Name DESC LIMIT 10
var sql4 = sqlBuilder
.SetTableName(nameof(Person))
.SetAndWhere(filter)
.SetOrderBy(new Dictionary<string, int> { { "ID", }, { "Name", - } })
.BuildSelectSql();
#endregion //生成WhereSQL
#region 生成AndWhere#(`ID`=1 AND `Age`>13 AND `Name` LIKE 'fan%')
var filter4 = new FieldFilter[] { new EqualFieldFilter<int>(nameof(Person.ID), ), new CompareFieldFilter<int>(nameof(Person.Age), , ">"), new LikeFieldFilter(nameof(Person.Name), "fan", LikeMode.Start) };
var whereSql1 = SqlBuilder.BuildAndWhere(filter4); //使用Dictionary类型参数
whereSql1 = SqlBuilder.BuildAndWhere(new Dictionary<string, object> { { "ID", }, { "Birthday", DateTime.Now }, { "Name", "fan" } });
#endregion #region 生成OrWhere#(`ID`=1 OR `Age`>13 OR `Name` LIKE 'fan%')
var whereSql2 = SqlBuilder.BuildOrWhere(filter4);
#endregion #region 生成复杂Where(`ID` = 1 AND (`Age` = 13 OR `name` LIKE 'fan%'))
var filter5 = new AndFieldFilter(new EqualFieldFilter<int>("ID", ), new OrFieldFilter(new EqualFieldFilter<int>("Age", ), new LikeFieldFilter("name", "fan", LikeMode.Start)));
var whereSql3 = SqlBuilder.BuildWhere(filter5);
#endregion Console.ReadKey();
}

实体类:

    public class Person
{
public int ID { get; set; }
public string StudentNumber { get; set; }
public int Age { get; set; }
public string Name { get; set; }
public string ClassName { get; set; }
}

SqlBuilder:

    public class SqlBuilder
{
public static readonly ESqlDataType SQL_DATA_TYPE = ESqlDataType.MySql;//如果要切换数据库,只需要改此处
public static readonly string START_OPE = "`";
public static readonly string END_OPE = "`";
private static readonly ConcurrentDictionary<Type, PropertyInfo[]> TYPE_CACHE = new ConcurrentDictionary<Type, PropertyInfo[]>();
private static readonly ConcurrentDictionary<Type, string> EXPRESSION_CACHE = new ConcurrentDictionary<Type, string>();
private const string SQLSERVER_FORMAT = "SELECT {top} {select} FROM {table} {where} {orderby}";
private const string MYSQL_FORMAT = "SELECT {select} FROM {table} {where} {orderby} {top}";
private string _selectSql = " * ";
private string _tableName = string.Empty;
private string _topSql = string.Empty;
private string _orderBySql = string.Empty;
private WherePart _wherePart = null; #region Constructor
static SqlBuilder()
{
if (SQL_DATA_TYPE == ESqlDataType.SqlServer)
{
START_OPE = "[";
END_OPE = "]";
}
}
public SqlBuilder()
{ }
public SqlBuilder(string tableName)
{
this.SetTableName(tableName);
}
public SqlBuilder(Type tableType)
{
this.SetTableName(tableType.Name);
}
#endregion #region BuildSql
public WherePart BuildSelectSql()
{
string sql = (SQL_DATA_TYPE == ESqlDataType.MySql ? MYSQL_FORMAT : SQLSERVER_FORMAT); if (string.IsNullOrWhiteSpace(this._tableName))
{
throw new ArgumentException("Invoke SetTableName Method");
}
sql = sql.Replace("{table}", this._tableName);
sql = sql.Replace("{select}", this._selectSql);
sql = sql.Replace("{where}", this._wherePart != null ? this._wherePart.Sql : string.Empty);
sql = sql.Replace("{top}", this._topSql);
sql = sql.Replace("{orderby}", this._orderBySql);
return new WherePart(sql, this._wherePart?.Parameters);
}
#endregion #region BuildWhereSql
/// <summary>
/// 创建where(AND)
/// </summary>
/// <param name="FieldFilters"></param>
/// <returns></returns>
public static WherePart BuildAndWhere(params FieldFilter[] FieldFilters)
{
string sql = string.Empty;
Dictionary<string, object> parameters = new Dictionary<string, object>();
if (FieldFilters?.Length > )
{
sql = new AndFieldFilter(FieldFilters).BuildCriteria(out string where, parameters) ? where : string.Empty;
} return new WherePart(sql, parameters);
}
/// <summary>
/// 创建where(AND)
/// </summary>
/// <param name="pairs"></param>
/// <returns></returns>
public static WherePart BuildAndWhere(ICollection<KeyValuePair<string, object>> pairs)
{
WherePart wherePart = null;
Dictionary<string, object> parameters = new Dictionary<string, object>();
if (pairs?.Count > )
{
wherePart = SqlBuilder.BuildAndWhere(BuildFildFilters(pairs));
}
return wherePart;
}
/// <summary>
/// 创建where(OR)
/// </summary>
/// <param name="FieldFilters"></param>
/// <returns></returns>
public static WherePart BuildOrWhere(params FieldFilter[] FieldFilters)
{
WherePart wherePart = null;
Dictionary<string, object> parameters = new Dictionary<string, object>();
if (FieldFilters?.Length > )
{
if (new OrFieldFilter(FieldFilters).BuildCriteria(out string where, parameters))
{
wherePart = new WherePart(where, parameters);
}
}
return wherePart;
}
/// <summary>
/// 创建where(OR)
/// </summary>
/// <param name="pairs"></param>
/// <returns></returns>
public static WherePart BuildOrWhere(ICollection<KeyValuePair<string, object>> pairs)
{
WherePart wherePart = null;
if (pairs?.Count > )
{
wherePart = SqlBuilder.BuildOrWhere(BuildFildFilters(pairs));
}
return wherePart;
}
/// <summary>
/// 创建复杂where sql
/// </summary>
/// <param name="complexFieldFilter"></param>
/// <returns></returns>
public static WherePart BuildWhere(FieldFilter complexFieldFilter)
{
WherePart wherePart = null;
if (complexFieldFilter != null)
{
ICollection<KeyValuePair<string, object>> parameters = new Dictionary<string, object>();
if (complexFieldFilter.BuildCriteria(out string where, parameters))
{
wherePart = new WherePart(where, parameters);
}
}
return wherePart;
}
#endregion #region TableName
public SqlBuilder SetTableName<T>()
{
this.SetTableName(typeof(T).Name);
return this;
}
public SqlBuilder SetTableName(Type tableType)
{
this.SetTableName(tableType.GetType().Name);
return this;
}
public SqlBuilder SetTableName(string tableName)
{
this._tableName = $"{START_OPE}{tableName}{END_OPE}";
return this;
}
#endregion #region Select
/// <summary>
/// 设置Select子句
/// </summary>
/// <param name="selectFields"></param>
/// <returns></returns>
public SqlBuilder SetSelect(params string[] selectFields)
{
if (selectFields != null && selectFields.Length > )
{
var list = new List<string>();
foreach (var field in selectFields)
{
list.Add($"{START_OPE}{field}{END_OPE}");
}
this._selectSql = string.Join(",", list);
}
return this;
}
/// <summary>
/// 设置Select子句(不推荐,性能低)
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="propertyExpression"></param>
/// <returns></returns>
public SqlBuilder SetSelect<T>(params Expression<Func<T, object>>[] propertyExpression)
{
string[] includePropertyNames = null;
if (propertyExpression?.Length > )
{
includePropertyNames = this.GetPropertyNames<T>(propertyExpression);
}
if (includePropertyNames?.Length > )
{
this.SetSelect(includePropertyNames);
}
return this;
}
#endregion #region Where
/// <summary>
/// 设置条件
/// </summary>
/// <param name="whereField"></param>
/// <returns></returns>
public SqlBuilder SetWhere(FieldFilter whereField)
{
if (whereField != null)
{
this.SetWherePart(SqlBuilder.BuildWhere(whereField));
}
return this;
}
/// <summary>
/// 设置条件(AND)
/// </summary>
/// <param name="fieldFilters"></param>
/// <returns></returns>
public SqlBuilder SetAndWhere(params FieldFilter[] fieldFilters)
{
if (fieldFilters?.Length > )
{
this.SetWherePart(SqlBuilder.BuildAndWhere(fieldFilters));
}
return this;
}
/// <summary>
/// 设置条件(AND)
/// </summary>
/// <param name="pairs"></param>
/// <returns></returns>
public SqlBuilder SetAndWhere(ICollection<KeyValuePair<string, object>> pairs)
{
if (pairs?.Count > )
{
this.SetWherePart(SqlBuilder.BuildAndWhere(pairs));
}
return this;
}
/// <summary>
/// 设置条件(OR)
/// </summary>
/// <param name="FieldFilters"></param>
/// <returns></returns>
public SqlBuilder SetOrWhere(params FieldFilter[] fieldFilters)
{
if (fieldFilters?.Length > )
{
this.SetWherePart(SqlBuilder.BuildOrWhere(fieldFilters));
}
return this;
}
/// <summary>
/// 设置条件(OR)
/// </summary>
/// <param name="pairs"></param>
/// <returns></returns>
public SqlBuilder SetOrWhere(ICollection<KeyValuePair<string, object>> pairs)
{
if (pairs?.Count > )
{
this.SetWherePart(SqlBuilder.BuildOrWhere(pairs));
}
return this;
}
public SqlBuilder SetWherePart(WherePart wherePart)
{
if (wherePart != null)
{
wherePart.Sql = !string.IsNullOrWhiteSpace(wherePart.Sql) ? " WHERE " + wherePart.Sql : string.Empty;
this._wherePart = wherePart;
} return this;
}
#endregion; #region Top
public SqlBuilder SetTop(int top)
{
if (top > )
{
string topSql = top.ToString();
this._topSql = SqlBuilder.SQL_DATA_TYPE == ESqlDataType.MySql ? $"LIMIT {topSql}" : $"TOP {topSql}";
}
return this;
}
#endregion #region OrderBy
/// <summary>
///
/// </summary>
/// <param name="orderBys"></param>
/// <returns></returns>
public SqlBuilder SetOrderBy(Dictionary<string, int> orderByDict)
{
StringBuilder orderSql = new StringBuilder();
if (orderByDict?.Count > )
{
orderSql.Append(" ORDER BY ");
string temp = "ASC";
foreach (var orderField in orderByDict.Keys)
{
temp = orderByDict[orderField] >= ? "ASC" : "DESC";
orderSql.Append($"{orderField} {temp},");
}
this._orderBySql = orderSql.ToString().Trim(',');
}
return this;
}
#endregion #region Private
private string[] GetPropertyNames<T>(params Expression<Func<T, object>>[] exps)
{
string[] props = new string[exps.Length];
for (int i = ; i < exps.Length; i++)
{
props[i] = this.GetPropertyName(exps[i]);
}
return props;
}
private string GetPropertyName<T>(Expression<Func<T, object>> expr)
{
return EXPRESSION_CACHE.GetOrAdd(expr.GetType(), t =>
{
string rtn = null;
if (expr.Body is UnaryExpression)
{
rtn = ((MemberExpression)((UnaryExpression)expr.Body).Operand).Member.Name;
}
else if (expr.Body is MemberExpression)
{
rtn = ((MemberExpression)expr.Body).Member.Name;
}
else if (expr.Body is ParameterExpression)
{
rtn = ((ParameterExpression)expr.Body).Type.Name;
}
return rtn;
}); }
private static FieldFilter[] BuildFildFilters(ICollection<KeyValuePair<string, object>> pairs)
{
FieldFilter[] fieldFilters = new FieldFilter[pairs.Count];
int index = ;
string key = string.Empty;
object value = null;
foreach (var pair in pairs)
{
key = pair.Key;
value = pair.Value;
if (value is System.Int32)
{
int intValue = (Int32)Convert.ChangeType(value, typeof(System.Int32));
fieldFilters[index++] = new EqualFieldFilter<int>(key, intValue);
}
else if (value is System.Int64)
{
long longValue = (Int64)Convert.ChangeType(value, typeof(System.Int64));
fieldFilters[index++] = new EqualFieldFilter<System.Int64>(key, longValue);
}
else// if (value is System.String|| value is System.DateTime)
{
string strValue = (string)Convert.ChangeType(value, typeof(System.String));
fieldFilters[index++] = new EqualFieldFilter<string>(key, strValue);
}
}
return fieldFilters;
}
#endregion
}
public class WherePart
{
/// <summary>
/// 含有参数变量的SQL语句
/// </summary>
public string Sql { get; set; }
/// <summary>
/// SQL语句中的参数变量
/// </summary>
public ICollection<KeyValuePair<string, object>> Parameters { get; set; } public WherePart(string sql, ICollection<KeyValuePair<string, object>> parameters)
{
this.Parameters = parameters;
this.Sql = sql;
} }
public enum ESqlDataType
{
MySql = ,
SqlServer =
}

筛选字段类(FieldFilter):

    /// <summary>
/// 筛选抽象基类
/// </summary>
[Serializable]
public abstract class FieldFilter
{
private string _fieldName = null;
/// <summary>
/// 字段名称
/// </summary>
public string FieldName
{
get
{
return this._fieldName;// $"{SqlBuilder.START_OPE}{this._fieldName}{SqlBuilder.END_OPE}";
}
set
{
this._fieldName = value;
}
}
/// <summary>
/// 字段排序先后顺序
/// </summary>
internal int FieldOrderByPriority { get; set; }
internal abstract bool isEmpty { get; }
public bool IsEmpty()
{
return this.isEmpty;
}
public abstract bool BuildCriteria(out string where,ICollection<KeyValuePair<string,object>> parameters);
} #region - 筛选器字段类 -
public class EqualFieldFilter<T> : FieldFilter //where T : struct
{
public EqualFieldFilter()
{
}
public EqualFieldFilter(string fieldName, T value)
{
base.FieldName = fieldName;
this.Value = value;
}
//public EqualFieldFilter(string fieldName, T? value)
//{
// base.FieldName = fieldName;
// this.Value = value;
//}
public T Value { get; set; }
internal override bool isEmpty
{
get { return false; }
}
public override bool BuildCriteria(out string where, ICollection<KeyValuePair<string, object>> parameters)
{
where = string.Empty;
if (this.isEmpty)
{
return false;
}
where = new SimpleExpression(base.FieldName, this.Value, " = ").ToString(parameters);
//parameters = new Dictionary<string, object> { { $"@{base.FieldName}",this.Value} };
return true;
}
}
/// <summary>
/// 比较筛选条件
/// </summary>
/// <typeparam name="T"></typeparam>
[Serializable]
public class CompareFieldFilter<T> : FieldFilter where T : struct
{
public CompareFieldFilter()
{
//this.Operator = CompareOperator.Equal;
}
public CompareFieldFilter(string fieldName, T value) : this(fieldName, value, "=")
{
}
public CompareFieldFilter(string fieldName, T value, string @operator)
{
base.FieldName = fieldName;
this.Value = value;
this.Operator = @operator;
}
public CompareFieldFilter(string fieldName, T? value) : this(fieldName, value, "=")
{
}
public CompareFieldFilter(string fieldName, T? value, string @operator)
{
base.FieldName = fieldName;
this.Value = value;
this.Operator = @operator;
} public T? Value { get; set; }
/// <summary>
/// 获取或者设置 比较类型<see cref="CompareOperator"/>
/// 默认值:Equal
/// </summary>
public string Operator { get; set; }
internal override bool isEmpty
{
get { return !this.Value.HasValue; }
}
public override bool BuildCriteria(out string where, ICollection<KeyValuePair<string, object>> parameters)
{
where = string.Empty;
if (this.isEmpty)
{
return false;
}
where = new SimpleExpression(base.FieldName, this.Value, this.Operator).ToString(parameters);
return true;
}
public static explicit operator T(CompareFieldFilter<T> value)
{
return value.Value.Value;
}
public static explicit operator T? (CompareFieldFilter<T> value)
{
return value.Value;
} } /// <summary>
/// 范围筛选条件
/// </summary>
/// <typeparam name="T"></typeparam>
[Serializable]
public class RangeFieldFilter<T> : FieldFilter where T : struct
{
public RangeFieldFilter()
{
}
public RangeFieldFilter(string fieldName, T startValue, T endValue)
{
base.FieldName = fieldName;
this.StartValue = startValue;
this.EndValue = endValue;
}
public RangeFieldFilter(string fieldName, T? startValue, T? endValue)
{
base.FieldName = fieldName;
this.StartValue = startValue;
this.EndValue = endValue;
}
public T? StartValue { get; set; }
public T? EndValue { get; set; }
internal override bool isEmpty
{
get { return this.StartValue == null && this.EndValue == null; }
}
public override bool BuildCriteria(out string where, ICollection<KeyValuePair<string, object>> parameters)
{
where = string.Empty;
if (this.isEmpty)
{
return false;
}
if (this.StartValue != null && this.EndValue != null)
{
where = new BetweenExpression(base.FieldName, this.StartValue, this.EndValue).ToString(parameters);
}
return true;
}
public static explicit operator T[] (RangeFieldFilter<T> value)
{
return new T[] { value.StartValue.Value, value.EndValue.Value };
}
public static explicit operator T?[] (RangeFieldFilter<T> value)
{
return new T?[] { value.StartValue, value.EndValue };
} }
/// <summary>
/// 多值模式
/// </summary>
[Serializable]
public enum AnyMode : int
{
/// <summary>
/// 包含这些值
/// </summary>
Contain = ,
/// <summary>
/// 排除这些值
/// </summary>
Exclude =
}
/// <summary>
/// 多值筛选条件
/// </summary>
/// <typeparam name="T"></typeparam>
[Serializable]
public class AnyFieldFilter<T> : FieldFilter
{
public AnyFieldFilter()
{
}
/// <summary>
/// 构造
/// </summary>
/// <param name="value">集合值</param>
public AnyFieldFilter(string fieldName, IEnumerable<T> value)
: this(fieldName, value, AnyMode.Contain)
{
}
/// <summary>
/// 构造
/// </summary>
/// <param name="value">集合值</param>
/// <param name="Mode">多值模式</param>
public AnyFieldFilter(string fieldName, IEnumerable<T> value, AnyMode Mode)
{
base.FieldName = fieldName;
this.Value = value;
this.Mode = Mode;
}
public IEnumerable<T> Value { get; set; }
public AnyMode Mode { get; set; }
internal override bool isEmpty
{
get { return this.Value == null || !this.Value.Any(); }
}
public override bool BuildCriteria(out string where, ICollection<KeyValuePair<string, object>> parameters)
{
where = string.Empty;
if (this.isEmpty)
{
return false;
}
if (this.Value.Count() == )
{
where = new SimpleExpression(base.FieldName, this.Value.First(), " = ").ToString(parameters);
}
else
{
switch (this.Mode)
{
case AnyMode.Contain:
where = string.Format("{0} IN ({1})", base.FieldName, string.Join(",", this.Value));
break;
case AnyMode.Exclude:
where = string.Format("{0} NOT IN ({1})", base.FieldName, string.Join(",", this.Value));
break;
}
}
return true;
}
}
/// <summary>
/// 模糊筛选模式
/// </summary>
[Serializable]
public enum LikeMode : int
{
/// <summary>
/// 任何位置,相当于 like '%value%'
/// </summary>
AnyWhere = ,
/// <summary>
/// 开始处,相当于 like 'value%'
/// </summary>
Start = ,
/// <summary>
/// 结尾处,相当于 like '%value'
/// </summary>
End =
}
/// <summary>
/// 模糊筛选条件
/// </summary>
[Serializable]
public class LikeFieldFilter : FieldFilter
{
public LikeFieldFilter(string fieldName, string value)
: this(fieldName, value, LikeMode.AnyWhere)
{
}
public LikeFieldFilter(string fieldName, string value, LikeMode likeMode)
{
base.FieldName = fieldName;
this.Value = value;
this.Mode = likeMode;
} public string Value { get; set; }
/// <summary>
/// 匹配模式,默认 AnyWhere
/// </summary>
public LikeMode Mode { get; set; }
internal override bool isEmpty
{
get { return string.IsNullOrWhiteSpace(this.Value); }
}
public override bool BuildCriteria(out string where, ICollection<KeyValuePair<string, object>> parameters)
{
where = string.Empty;
if (this.isEmpty)
{
return false;
}
switch (this.Mode)
{
case LikeMode.AnyWhere:
where = new SimpleExpression(base.FieldName, $"%{this.Value}%", " LIKE ").ToString(parameters);
break;
case LikeMode.End:
where = new SimpleExpression(base.FieldName, $"%{this.Value}", " LIKE ").ToString(parameters);
break;
case LikeMode.Start:
where = new SimpleExpression(base.FieldName, $"{this.Value}%", " LIKE ").ToString(parameters);
break;
}
return true;
}
}
/// <summary>
/// 表达式筛选方式
/// </summary>
/// <typeparam name="T"></typeparam>
public class WhereFieldFilter<T> : FieldFilter where T : class
{
internal string Value { get; set; } public WhereFieldFilter(string value)
{
this.Value = value;
} internal override bool isEmpty
{
get { return string.IsNullOrWhiteSpace(this.Value); }
} public override bool BuildCriteria(out string where, ICollection<KeyValuePair<string, object>> parameters)
{
where = string.Empty;
if (this.isEmpty)
{
return false;
}
where = this.Value;
return true;
} } #endregion #region- 组合筛选器字段类 -
public class CombineFieldFilterBase : FieldFilter
{
protected virtual string Operator { get; }
protected FieldFilter[] _fieldFilterList = null;
public CombineFieldFilterBase(params FieldFilter[] fieldFilterList)
{
this._fieldFilterList = fieldFilterList;
} internal override bool isEmpty => false;
public override bool BuildCriteria(out string where, ICollection<KeyValuePair<string, object>> parameters)//
{
where = string.Empty;
List<string> whereList = new List<string>();
foreach (var fieldFilter in this._fieldFilterList)
{
if (fieldFilter.BuildCriteria(out string fieldWhere, parameters))
{
whereList.Add(fieldWhere);
}
}
if (whereList.Count <= )
{
return false;
}
where = "(" + string.Join(Operator, whereList) + ")";
return true;
} }
public class AndFieldFilter : CombineFieldFilterBase
{
protected override string Operator { get { return " AND "; } }
public AndFieldFilter(params FieldFilter[] fieldFilterList) : base(fieldFilterList)
{
}
}
public class OrFieldFilter : CombineFieldFilterBase
{
protected override string Operator { get { return " OR "; } }
public OrFieldFilter(params FieldFilter[] fieldFilterList) : base(fieldFilterList)
{
} }
#endregion

强类型sql生成助手类的更多相关文章

  1. 【C#】SQL数据库助手类2.0(自用)

    using System; using System.Collections.Generic; using System.Configuration; using System.Data; using ...

  2. .net 根据匿名类生成实体类,根据datatable生成实体类,根据sql生成实体类

    在开发中可能会遇到这几种情况 1.EF或LINQ查询出来的匿名对象在其它地方调用不方便,又懒的手动建实体类 2.通过datatable反射实体需要先建一个类 ,头痛 3.通过SQL语句返回的实体也需要 ...

  3. 【C#】SQL数据库助手类1.0(自用)

    using System; using System.Collections.Generic; using System.Text; using System.Configuration; using ...

  4. ADO.NET数据库操作助手类

    SQL语句操作增删查改助手类 using System; using System.Collections.Generic; using System.Configuration; using Sys ...

  5. java web(七): mybatis的动态sql和mybatis generator自动生成pojo类和映射文件

    前言: MyBatis 的强大特性之一便是它的动态 SQL.如果你有使用 JDBC 或其它类似框架的经验,你就能体会到根据 不同条件拼接 SQL 语句的痛苦.例如拼接时要确保不能忘记添加必要的空格,还 ...

  6. T4模板根据DB生成实体类

    1.前言 为什么会有这篇文章了,最近看到了一些框架,里面要写的代码太多了,故此就想偷懒,要是能写出一个T4模板,在数据库添加表后,根据模板就可以自动生成了类文件了,这样多好,心动不如行动.记得使用T4 ...

  7. 如何通过java反射将数据库表生成实体类?

    首先有几点声明: 1.代码是在别人的基础进行改写的: 2.大家有什么改进的意见可以告诉我,也可以自己改好共享给其他人: 3.刚刚毕业,水平有限,肯定有许多不足之处: 4.希望刚刚学习java的同学能有 ...

  8. 重构 ORM 中的 Sql 生成

    Rafy 领域实体框架设计 - 重构 ORM 中的 Sql 生成   前言 Rafy 领域实体框架作为一个使用领域驱动设计作为指导思想的开发框架,必然要处理领域实体到数据库表之间的映射,即包含了 OR ...

  9. ANTLR和StringTemplate实例:自动生成单元测试类

    ANTLR和StringTemplate实例:自动生成单元测试类 1. ANTLR语法 要想自动生成单元测试,首先第一步就是分析被测试类.这里以Java代码为例,用ANTLR对Java代码进行分析.要 ...

随机推荐

  1. webstorm-在不删除硬盘文件的条件下移除项目

    一段时间没用之后会忘记如何在webstorm里移除一个项目,要花很长的时间去找到底如何才能移除,所以特地把它记录下来了,方便下次忘记的时候可以查阅 把鼠标移在你要移除的那个项目上然后按下Delete键 ...

  2. nginx之启停操作及配置文件语法检测

    nginx的启停操作 ----nginx  启动 ----nginx -s stop 停止 ----nginx -s reload 重新加载 nginx -t 修改配置文件之后进行语法检验

  3. Django视图函数之三种响应模式

    视图函数响应处理: from django.shortcuts import render,HttpResponse,redirect (1)render 处理模板文件,可以渲染模板,第一个参数必须为 ...

  4. 用了这么多年的 Java 泛型,你对它到底有多了解?

    作为一个 Java 程序员,日常编程早就离不开泛型.泛型自从 JDK1.5 引进之后,真的非常提高生产力.一个简单的泛型 T,寥寥几行代码, 就可以让我们在使用过程中动态替换成任何想要的类型,再也不用 ...

  5. STM32F103出现CPU could not be halted问题的解决方案

    问题描述: **JLink Warning: CPU could not be halted ***JLink Error: Can not read register 15 (R15) while ...

  6. 深入理解Java虚拟机(1)

        对于Java程序员,在虚拟机自动内存管理机制的帮助下,不需要再为每一个操作写配对的释放资源操作,不容易出现内存泄露和内存溢出问题.加深对Java虚拟机的理解,有助于在发现问题时精准定位问题,排 ...

  7. Linux上,最常用的一批命令解析【10年精选】

    原文链接:https://mp.weixin.qq.com/s/QkqHexs_kOgy_5OwbwyFww 建议点击原文链接查看 不同平台linux客户端连接工具分享: windos终端神器:SSH ...

  8. SQL——AUTO INCREMENT(字段自增)

    AUTO INCREMENT -- 在新记录插入表中时生成一个唯一的数字.插入表数据时,该字段不需规定值.    在每次插入新记录时,自动地创建主键字段的值.在表中创建一个 auto-incremen ...

  9. CentOS下搭建Git服务器

    1.首先需要安装Git,可以使用yum源在线安装: [root@localhost Desktop]# yum install -y git 2.创建一个git用户,用来运行git服务 # addus ...

  10. springboot的springMVC配置,源码

    1,前端控制器自动管理 DispatcherServletAutoConfiguration 中 此方法创建了前端控制器 注册了前端控制器 其中标黄色一行最后的  .getPath()方法点进去 St ...