您的位置:首页 > 其它

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

2015-09-14 15:34 399 查看
ORM 大家都知道, .Net 是EF 还有一些其他的ORM 从JAVA 中移植过来的 有 , 大神自己写的也有

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

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

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

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

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

直接上代码:

private static string ConnectionString = "**";

/// <summary>
///  更新数据   没有sql参数就直接执行
/// </summary>
/// <param name="sql"> 需要执行的 sql </param>
/// <param name="o">传递的实体类对象 要求该类中字段必须和 sql参数名称一致 不区分大小写 </param>
/// <returns></returns>
public static int UpdateModel(string sql, object o)
{
var s = sql.Split('@');
return Update(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>
public static List<T> SeleteModel<T>(string sql, object o) where T : class, new()
{
var s = sql.Split('@');
return Select<T>(sql, s.Length == 1 ? null : GetSqlParameters(o, s));
}

/// <summary>
/// 动态创建SqlParameter 对象
/// </summary>
/// <param name="o">传递的实体类对象 要求该类中字段必须和 sql参数名称一致 不区分大小写 </param>
/// <param name="s">切割后的SQL 语句</param>
/// <returns></returns>
private static SqlParameter[] GetSqlParameters(object o, string[] s)
{
s = s.Select(c => c.Split(' ')[0].Trim()).ToArray();

Type t = o.GetType();
if (t == typeof(object))
throw new Exception("UpdateModel  传递的类型是OBJECT 类型");
// 反射 读取字段 验证是否是 SQL 中的参数
var tlist =
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)
throw new Exception("传递的实体中有值参数 和 sql 中需要的 数量不相等");

SqlParameter[] sp = new SqlParameter[tlist.Count()];
for (int i = 0; i < s.Length - 1; i++)
{
sp[i] = new SqlParameter(s[i + 1].Trim(), tlist.FirstOrDefault(c => c.Name.ToLower() == s[i + 1].ToLower()).GetValue(o));
}
return sp;
}

private static List<T> SeleteModel<T>(SqlDataReader data) where T : class, new()
{
// 获取列 个数
int iFieldCount = data.FieldCount;
List<T> list = new List<T>();
while (data.Read())
{
T tType = new T();
for (int i = 0; i < iFieldCount; i++)
{
// 反射注入字段值
string dataName = data.GetName(i);
FieldInfo fie = tType.GetType().GetField(dataName);
if (fie == null)
continue;
fie.SetValue(tType, data[dataName]);
}
list.Add(tType);
}
return list;
}

private static List<T> Select<T>(string sql, SqlParameter[] sp) where T : class, new()
{
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
using (SqlCommand com = new SqlCommand(sql, conn))
{
conn.Open();
if (sp != null)
com.Parameters.AddRange(sp);
return SeleteModel<T>(com.ExecuteReader());
}
}
}

private static int Update(string sql, SqlParameter[] sp)
{
using (SqlConnection conn = new SqlConnection(ConnectionString))
{
using (SqlCommand com = new SqlCommand(sql, conn))
{
conn.Open();
if (sp != null)
com.Parameters.AddRange(sp);
return com.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” 的 方式 (没有连接池 还得写Sql )

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

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

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

如果你使用过多种ORM 你就会发现 越是功能全 越是强大的ORM 效率就越低 因为不管是哪个ORM 最后还是对JDBC/ADO.NET 的加工封装 。

EF 效率是低 但是 他的 是 我弄过的一下ORM框架中 是功能最全 除去效率外 其他都很强大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: