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 语句 分类 等等
有兴趣的朋友可以自己做做 ,我就不弄了。