.Net自己写个简单的ORM(练手)

王朝学院·作者佚名  2016-08-28
窄屏简体版  字體: 小  |  中  |  大  |  超大  

ORM 大家都知道, .Net 是EF 还有一些其他的ORM 从java中移植过来的 有 , 大神自己写的也有

不管ORM 提供什么附加的 乱七八糟的功能

但是 最主要的 还是 关系映射 的事情。

我自己一直在使用ORMDapper 这个很小的ORM 第一次看到这个ORM 是通过一个帖子中 有人搞了个常见ORM 效率排行榜 ,自己也试了试 然后就看上 ORMDapper 这个了

这是把轻量级发挥到极致了! 只有一个 96KB 的 一个Class 文件。其中还有很多是空格和注释信息。

最近在学习研究JAVA 觉得JAVA 比.NET有趣点。 也为了 以后 .NET 不行了 还能弄JAVA

直接上代码:

PRivatestaticstringConnectionString ="**";///<summary>///更新数据 没有sql参数就直接执行///</summary>///<param name="sql">需要执行的 sql</param>///<param name="o">传递的实体类对象 要求该类中字段必须和 sql参数名称一致 不区分大小写</param>///<returns></returns>publicstaticintUpdateModel(stringsql,objecto)

{vars = sql.Split('@');returnUpdate(sql, s.Length ==1?null: GetSqlParameters(o, s));

}///<summary>///查询数据///</summary>///<typeparam name="T">映射的实体类</typeparam>///<param name="sql">执行的SQL语句</param>///<param name="o">传递的实体类对象 要求该类中字段必须和 sql参数名称一致 不区分大小写</param>///<returns></returns>publicstaticList<T> SeleteModel<T>(stringsql,objecto)whereT :class,new()

{vars = sql.Split('@');returnSelect<T>(sql, s.Length ==1?null: GetSqlParameters(o, s));

}///<summary>///动态创建SqlParameter 对象///</summary>///<param name="o">传递的实体类对象 要求该类中字段必须和 sql参数名称一致 不区分大小写</param>///<param name="s">切割后的SQL 语句</param>///<returns></returns>privatestaticSqlParameter[] GetSqlParameters(objecto,string[] s)

{

s= s.Select(c => c.Split('')[0].Trim()).ToArray();

Type t=o.GetType();if(t ==typeof(object))thrownewException("UpdateModel 传递的类型是OBJECT 类型");//反射 读取字段 验证是否是 SQL 中的参数vartlist =t.GetFields(BindingFlags.Public|BindingFlags.Instance)

.Where(c=> c.GetValue(o) !=null& s.FirstOrDefault(a => a.ToLower() == c.Name.ToLower()) !=null)

.ToList();//判断得到的数据 是否和 需要的数据 数量一致if(tlist.Count() != s.Count() -1)thrownewException("传递的实体中有值参数 和 sql 中需要的 数量不相等");

SqlParameter[] sp=newSqlParameter[tlist.Count()];for(inti =0; i < s.Length -1; i++)

{

sp[i]=newSqlParameter(s[i +1].Trim(), tlist.FirstOrDefault(c => c.Name.ToLower() == s[i +1].ToLower()).GetValue(o));

}returnsp;

}privatestaticList<T> SeleteModel<T>(SqlDataReader data)whereT :class,new()

{//获取列 个数intiFieldCount =data.FieldCount;

List<T> list =newList<T>();while(data.Read())

{

T tType=newT();for(inti =0; i < iFieldCount; i++)

{//反射注入字段值stringdataName =data.GetName(i);

FieldInfo fie=tType.GetType().GetField(dataName);if(fie ==null)continue;

fie.SetValue(tType, data[dataName]);

}

list.Add(tType);

}returnlist;

}privatestaticList<T> Select<T>(stringsql, SqlParameter[] sp)whereT :class,new()

{using(SqlConnection conn =newSqlConnection(ConnectionString))

{using(SqlCommand com =newSqlCommand(sql, conn))

{

conn.Open();if(sp !=null)

com.Parameters.AddRange(sp);returnSeleteModel<T>(com.ExecuteReader());

}

}

}privatestaticintUpdate(stringsql, SqlParameter[] sp)

{using(SqlConnection conn =newSqlConnection(ConnectionString))

{using(SqlCommand com =newSqlCommand(sql, conn))

{

conn.Open();if(sp !=null)

com.Parameters.AddRange(sp);returncom.ExecuteNonQuery();

}

}

}

调用示例:

public class TestCalss

{

public static void Main()

{

string sql = @"SELECT TOP 1000 [ID]

,[ExpressID]

,[OrderID]

,[MailCode]

,[Sendxml]

,[SendFlag]

,[SendCount]

FROM [SendStateTest] where id=@id and SendXML=@SendXML ";

string sql2 = @"update [DangDang_SendStateTest] set SendXML='0000' where id=@id ";

int i = AdoConnection.UpdateModel(sql2, new Na() { ID = 1 });

List<Na> a = AdoConnection.SeleteModel<Na>(sql, new Na() { ID = 1, SendXML = "0000" });

Console.WriteLine(a);

}

public class Na

{

public int ID;

public string ExpressID;

public string OrderID;

public string MailCode;

public string SendXML;

public int SendFlag;

public int SendCount;

}

}

只是提供一种自己做一个简单的 ORM 的方式

说实话,自己弄的在好,也不如 网上大家都在用的 ORM 框架

可以在这个简单的ORM 上经行加工 拓展, 比如 支持存储过程 不限定数据库 SQL 语句 分类 等等

有兴趣的朋友可以自己做做 ,我就不弄了。

 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
© 2005- 王朝網路 版權所有 導航