其实市面上的orm框架多的是,而且成熟的比比皆是,没必要自己开发,sql的有Nhibernate,entity,notsql就不用说了,直接文档存储,方便的要死,可是我就不明白有许多的公司,热衷于自己写,而且写的真不怎么样,一定要用他的,参数传递,object数组,多了,少了,没提示,类型对与不对,也不知道,结果返回值,object,好嘛,一个对象在它里面装箱拆箱捣腾好几次,出来的还是他妈的object,或者类似List<object>的东西。当宝一样到处炫耀,这套框架如何的好,不用写sql语句,真的不用吗?复杂查询的时候还不是一样要拼sql语句。
我写这个的目的其实没别的,就是证明随随便便一周时间就可以做一个比他更好的东西。
其实做法和思路都挺简单,最终还是通过sql对着sqlhelper来完成,我这里就直接用sqlhelper了,灵活。
前期准备,实体属性,通过实体属性标识字段,建立一个属性标识标识字段,PrimaryKeyAttribute
[System.AttributeUsage(System.AttributeTargets.Property, AllowMultiple = true)] public class PrimaryKeyAttribute : System.Attribute { public PrimaryKeyAttribute(bool noIsIdentiy=false) { IsPrimary = true; NoIsIdentity = noIsIdentiy; } public bool IsPrimary { get; private set; } public bool NoIsIdentity { get; private set; } }
只要数据库字段与实体字段一致,那就不用另外写属性对应字段名啦。
实体插入,insert 首先获取insert的sql语句及参数列表
#region 获取插入语句 /// <summary> /// 获取插入语句 /// </summary> /// <param name="bean"></param> /// <param name="param"></param> /// <returns></returns> public static string GetInsertSql(this BaseBean bean, out SqlParameter[] param) { List<string> keystrs = new List<string>(); List<string> valstrs = new List<string>(); List<SqlParameter> plist = new List<SqlParameter>(); Type type = bean.GetType(); string primaryKey = null; string listKey = null; foreach (var p in type.GetProperties()) { foreach (var a in p.GetCustomAttributes(false)) { if (string.IsNullOrEmpty(primaryKey) && a.GetType() == typeof(PrimaryKeyAttribute)) { PrimaryKeyAttribute primary = a as PrimaryKeyAttribute; if (primary.IsPrimary && !primary.NoIsIdentity) primaryKey = p.Name; break; } else if (a.GetType() == typeof(MapAttribute)) { MapAttribute primary = a as MapAttribute; if (primary.IsMap) listKey = p.Name; break; } } if (!p.Name.Equals(primaryKey) && !p.Name.Equals(listKey)) { var val = p.GetValue(bean, null); if (val != null) { keystrs.Add(string.Format("[{0}]", p.Name)); valstrs.Add(string.Format("@{0}", p.Name)); SqlParameter par = new SqlParameter(string.Format("@{0}", p.Name), val); foreach (var a in p.GetCustomAttributes(false)) { if (a.GetType() == typeof(SqlDateTypeAttribute)) { SqlDateTypeAttribute sqld = a as SqlDateTypeAttribute; par.SqlDbType = sqld.SqlDbType; break; } } plist.Add(par); } } } string tabelname = type.Name; foreach (var a in type.GetCustomAttributes(false)) { if (a.GetType() == typeof(TableNameAttribute)) { TableNameAttribute tablename = a as TableNameAttribute; if (!string.IsNullOrEmpty(tablename.TableName)) tabelname = tablename.TableName; break; } } param = plist.ToArray(); string keystr = string.Join(",", keystrs.ToArray()); string valstr = string.Join(",", valstrs.ToArray()); StringBuilder sql = new StringBuilder(); sql.AppendFormat("INSERT INTO {0} ({1})VALUES({2}) SELECT @@IDENTITY", tabelname, keystr, valstr); return sql.ToString(); } #endregion
接下来就是sqlhelper的方法了
#region 添加一条新数据 /// <summary> /// 添加一条新数据 /// </summary> /// <param name="bean"></param> /// <param name="getPrimark"></param> /// <returns></returns> public static object Insert(this BaseBean bean, bool getPrimark) { try { SqlParameter[] param = null; string sql = bean.GetInsertSql(out param); if (getPrimark) { return SqlHelper.ExecuteScalar(CommandType.Text, sql, param); } else { return SqlHelper.ExecuteNonQuery(CommandType.Text, sql, param); } } catch (Exception) { throw; } } #endregion
到此,凡是继承BaseBean的实体都可以用Insert的拓展方法了。
其他删改查还远吗?所以就不用细说了看代码吧!
#region 获取删除语句 /// <summary> /// 获取删除语句 /// </summary> /// <param name="bean"></param> /// <param name="param"></param> /// <returns></returns> public static string GetDeleteSql(this BaseBean bean, out SqlParameter[] param) { string primaryKey = null; Type type = bean.GetType(); SqlParameter par = null; foreach (var p in type.GetProperties()) { if (string.IsNullOrEmpty(primaryKey)) { foreach (var a in p.GetCustomAttributes(false)) { if (a.GetType() == typeof(PrimaryKeyAttribute)) { PrimaryKeyAttribute primary = a as PrimaryKeyAttribute; if (primary.IsPrimary) primaryKey = p.Name; break; } } par = new SqlParameter(string.Format("@{0}", p.Name), p.GetValue(bean, null)); foreach (var a in p.GetCustomAttributes(false)) { if (a.GetType() == typeof(SqlDateTypeAttribute)) { SqlDateTypeAttribute sqld = a as SqlDateTypeAttribute; par.SqlDbType = sqld.SqlDbType; break; } } } } string tabelname = type.Name; foreach (var a in type.GetCustomAttributes(false)) { if (a.GetType() == typeof(TableNameAttribute)) { TableNameAttribute tablename = a as TableNameAttribute; if (!string.IsNullOrEmpty(tablename.TableName)) tabelname = tablename.TableName; break; } } param = new SqlParameter[] { par }; string sql = string.Format("DELETE {0} WHERE {1}=@{1} ", tabelname, primaryKey); return sql; } #endregion #region 获取主键查询sql语句 /// <summary> /// 获取主键查询sql语句 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="id"></param> /// <param name="param"></param> /// <returns></returns> public static string GetSelectSql<T>(object id, out SqlParameter[] param) where T : BaseBean { string primaryKey = null; Type type = typeof(T); SqlParameter par = null; foreach (var p in type.GetProperties()) { if (string.IsNullOrEmpty(primaryKey)) { foreach (var a in p.GetCustomAttributes(false)) { if (a.GetType() == typeof(PrimaryKeyAttribute)) { PrimaryKeyAttribute primary = a as PrimaryKeyAttribute; if (primary.IsPrimary) primaryKey = p.Name; break; } } par = new SqlParameter(string.Format("@{0}", p.Name), id); foreach (var a in p.GetCustomAttributes(false)) { if (a.GetType() == typeof(SqlDateTypeAttribute)) { SqlDateTypeAttribute sqld = a as SqlDateTypeAttribute; par.SqlDbType = sqld.SqlDbType; break; } } } } string tabelname = type.Name; foreach (var a in type.GetCustomAttributes(false)) { if (a.GetType() == typeof(TableNameAttribute)) { TableNameAttribute tablename = a as TableNameAttribute; if (!string.IsNullOrEmpty(tablename.TableName)) tabelname = tablename.TableName; break; } } param = new SqlParameter[] { par }; string sql = string.Format("SELECT * FROM {0} WHERE {1}=@{1} ", tabelname, primaryKey); return sql; } #endregion #region 获取所有数据sql语句 /// <summary> /// 获取所有数据sql语句 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="param"></param> /// <returns></returns> public static string GetSelectAllSql<T>() where T : BaseBean { Type type = typeof(T); string tabelname = type.Name; foreach (var a in type.GetCustomAttributes(false)) { if (a.GetType() == typeof(TableNameAttribute)) { TableNameAttribute tablename = a as TableNameAttribute; if (!string.IsNullOrEmpty(tablename.TableName)) tabelname = tablename.TableName; break; } } string sql = string.Format("SELECT * FROM {0} ", tabelname); return sql; } #endregion
唯一,update有点纠结,为什么呢,我们不能判断什么字段需要更新,什么字段不需要更新。
#region 通过id获取单个数据实体 /// <summary> /// 通过id获取单个数据实体 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="id"></param> /// <returns></returns> public static T Get<T>(object id) where T : BaseBean { try { SqlParameter[] param = null; T t = null;//Activator.CreateInstance<T>(); string sql = SqlService.GetSelectSql<T>(id, out param); using (SqlDataReader read = SqlHelper.ExecuteReader(CommandType.Text, sql, param)) { if (read.HasRows) { t = Activator.CreateInstance<T>(); Type type = t.GetType(); if (read.Read()) { foreach (var p in type.GetProperties()) { try { object obj = read[p.Name]; if (obj != null && !(obj is DBNull)) p.SetValue(t, obj, null); } catch (IndexOutOfRangeException) { //不做处理 } catch (Exception) { throw; } } } } } return t; } catch (Exception) { throw; } } #endregion
其他就不用贴出来了吧。
下面我就将相关的几个文件共享出来,仅供参考
http://dl.vmall.com/c0nalvukhv
转载请注明出处:http://qinnailin.cn/article/65
浙公网安备 33010602011771号