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 == ? 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 == ? 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(' ')[].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() - )
throw new Exception("传递的实体中有值参数 和 sql 中需要的 数量不相等"); SqlParameter[] sp = new SqlParameter[tlist.Count()];
for (int i = ; i < s.Length - ; i++)
{
sp[i] = new SqlParameter(s[i + ].Trim(), tlist.FirstOrDefault(c => c.Name.ToLower() == s[i + ].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 = ; 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框架中 是功能最全 除去效率外 其他都很强大。

.Net 自己写个简单的 半 ORM (练手)的更多相关文章

  1. 简单的node爬虫练手,循环中的异步转同步

    简单的node爬虫练手,循环中的异步转同步 转载:https://blog.csdn.net/qq_24504525/article/details/77856989 看到网上一些基于node做的爬虫 ...

  2. (原创)如何使用boost.asio写一个简单的通信程序(二)

    先说下上一篇文章中提到的保持io_service::run不退出的简单办法.因为只要异步事件队列中有事件,io_service::run就会一直阻塞不退出,所以只要保证异步事件队列中一直有事件就行了, ...

  3. django写一个简单的登陆注册

    要写这个,前提还是需要知道三个知识: 一个是urls.py,它是写我们的路由关系的,之前我写了通过wsgiref写一个简单的服务端,也用到了路由,就是 请求过来的url和视图函数的对应关系. 二是就是 ...

  4. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  5. 如何写一个简单的http服务器

    最近几天用C++写了一个简单的HTTP服务器,作为学习网络编程和Linux环境编程的练手项目,这篇文章记录我在写一个HTTP服务器过程中遇到的问题和学习到的知识. 服务器的源代码放在Github. H ...

  6. 如何写一个简单的shell

    如何写一个简单的shell 看完<UNIX环境高级编程>后我就一直想写一个简单的shell来作为练习,因为有事断断续续的写了好几个月,如今写了差不多来总结一下. 源代码放在了Github: ...

  7. 用C#Winform写个简单的批量清空文件内容和删除文件的小工具

    用C#Winform写个简单的批量清空文件内容和删除文件的小工具 本文介绍这个简单得不能再简单的小项目.做这个项目,有以下目的. 1 当然是做个能用的工具 2 学习使用Github 关于用VS2013 ...

  8. 分享:计算机图形学期末作业!!利用WebGL的第三方库three.js写一个简单的网页版“我的世界小游戏”

    这几天一直在忙着期末考试,所以一直没有更新我的博客,今天刚把我的期末作业完成了,心情澎湃,所以晚上不管怎么样,我也要写一篇博客纪念一下我上课都没有听,还是通过强大的度娘完成了我的作业的经历.(当然作业 ...

  9. linux设备驱动归纳总结(十一):写个简单的看门狗驱动【转】

    本文转载自:http://blog.chinaunix.net/uid-25014876-id-112879.html linux设备驱动归纳总结(十一):写个简单的看门狗驱动 xxxxxxxxxxx ...

随机推荐

  1. Fiddler抓包工具的使用

    下载 自行去官网下载 http://www.telerik.com/fiddler 配置Fiddler 1.打开Fiddler, Tools-> Fiddler Options -> HT ...

  2. 菜鸟学sql,Oracle数据库结构比较

    转载自:http://www.cnblogs.com/tianqing/archive/2008/06/25/1229419.html 做oracle下数据库结构比较,比较具体详细差异,例如:2个库具 ...

  3. linux配置tns

    .三个配置文件都是放在$ORACLE_HOME\network\admin目录下. .sqlnet.ora确定解析方式 .listener.ora上设SID_NAME,通常用于JDBC访问,对应的错误 ...

  4. spring batch学习笔记

    Spring Batch是什么?       Spring Batch是一个基于Spring的企业级批处理框架,按照我师父的说法,所有基于Spring的框架都是使用了spring的IoC特性,然后加上 ...

  5. Java基础——左移和右移

    首先要明白一点,这里面所有的操作都是针对存储在计算机中中二进制的操作,那么就要知道,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的. 左移位:<<,有符号的移位操作 左移操作 ...

  6. PAT1024. Palindromic Number

    //自己方法只能拿到15分后边老是又过不了的点,用了网上别人的方法,用库函数的翻转reverse(),参数分别是起始位置个结束位置,注意只能在原存储空间翻转,即比较对称时,再生请一个空间,将原来字符串 ...

  7. H264转成RGB24格式-2016.01.21

    #include "libavcodec/avcodec.h" #include "libswscale/swscale.h" #include "l ...

  8. 用代码给TABLE 添加字段,设置属性并编译

    AOTTableFieldList AOTTableFieldList ,TableFieldNode; TableName tableName = "SML_InventTableExt& ...

  9. OpenGL函数解析之glMatrixMode(GLenum mode)

    函数原型:void glMatrixMode(GLenum mode) 函数说明:glMatrixMode函数只有一个枚举类型的参数mode,用来指定哪一个矩阵堆栈式下一个矩阵操作的目标. mode有 ...

  10. 使用SSL确保通信中的数据安全

    #region Server /// <summary> /// 用于保存非对称加密(数字证书)的公钥 /// </summary> private string public ...