自己动手写ORM的感受
之前看到奋斗前辈和时不我待前辈的自己动手写ORM系列博客,感觉讲解的通俗易懂,清晰透彻。作为一个菜鸟,闲来也想着自己写一个ORM,一来加深自己对 ORM的理解,以求对EF,NHibernate等ROM框架的使用能更加轻车熟路。二来也可在写ORM之时熟悉反射的应用场景,反射的优缺点,优化方 法,Lambda表达式,表达式树等。,对自己也是一个不错的锻炼。
ORM的原理也就表映射,反射,拼接sql,缓存,Lambda进行方法调用。网上有很多源码参考和原理讲解,对着敲一敲完成一个简易的ORM并不是什么很难的事。
自己写之前对反射还算熟悉,所以从表映射,反射,拼接sql一路走来倒也没有什么很难理解的。写完第一个加载表数据的时候,也的确发现了反射用的太 多,太依赖反射,取值,赋值,调用。众所周知,反射是会有一定的性能消耗的,虽然一次使用的影响很小,但关键是量多啊,量变引发质变。
作为一个程序员,对每一丝可优化的代码有会想要去优化。于是我就去找资料啊,看各位大神的文章啊,看到有人介绍Lambda,有人介绍CodeDom,有 人介绍Emit,这么多选择我该选择什么呢?又是找了一番资料,最后选择了Lambda去优化。选好了优化手段,该去实现了,于是问题出现了,用 Lambda构建表达式树,生成委托,调用,对于一个很少写委托的菜鸟,看着源代码实在难以理解,看了几遍头都痛了。没办法,找资料,补全自己的知识。找 Demo,写例子,一条语句一条语句啃,慢慢的,也就稍微能理解源代码里各个方法,各个语句的作用了,对利用lambda优化的思路也开始清晰了。
ORM还在写,源码就不放上来了,菜鸟写的菜。ORM的例子,源码,讲解网上的文章不少,自己有兴趣找一下不会很难的。
下面是我设置属性值的代码,窥一斑而知全豹。
static Func<T, object, object> GetSetDelegate<T>(MethodInfo methodInfo,Type type)
{
//设置参数节点
var param_obj = Expression.Parameter(typeof(T), "obj");
//设置参数节点值
var param_val = Expression.Parameter(typeof(object), "val");
//转换类型
var body_val = Expression.Convert(param_val, type);
//表达式方法体
var body = Expression.Call(param_obj, methodInfo, body_val);
//生成Lambda表达式的委托
Action<T, object> set = Expression.Lambda<Action<T, object>>(body,param_obj, param_val).Compile();
//返回委托
return (instance, v) => { set(instance, v); return null; };
} static void FastSetValue<T>(this PropertyInfo prop, T t, object val)
{
//得到属性写方法
MethodInfo m = prop.GetSetMethod();
//调用方法
GetSetDelegate<T>(m, prop.PropertyType)(t, val);
}
菜鸟的理解可能不能入大神们的眼,如果我理解的有错误,或有偏差,还请大神们能不吝指教。
自己动手写ORM的感受的更多相关文章
- (新)自己动手写ORM框架(1)-增删查改的使用
之前写过一个系列文章自己动手写ORM框架,经过在多个项目的中的使用,对这套代码进行了许多改进,下面是使用方法: 新增学员信息代码预览: DBHelper db = DBHelper.getInstan ...
- 深入理解Activity -动手写实例来感受Activity的启动模式
介绍 上篇提到了Activity的任务,任务栈,以及启动模式.对这些概念有了了解以后,自己写一下例子来感受一下,就当作复习和加深印象了.如果对概念不熟悉的可以参考:深入理解Activity-任务,回退 ...
- 自己动手写ORM框架
提起ORM框架,大家都很熟悉,网上流行的ORM框架有很多,其中出名的有一些,不出名的更是数不胜数. 下面是自己实现的一个简单的ORM框架,实现了常用的增删查改功能,供大家研究ORM实现原理. 功能描述 ...
- 自己动手写ORM(02):Sql生成器实现
上一节中鄙人通过解析表达式树生成Sql碎片,其中我也把解析表达式类代码贴了出来,文章发布之后我对ExpressionAnalyzer类做了些改动,下面我还会将代码贴出来,废话不多说,直接进入今天的主题 ...
- 自己动手写ORM(01):解析表达式树生成Sql碎片
在EF中,我们查询数据时可能会用拉姆达表达式 Where(Func<T,ture> func)这个方法来筛选数据,例如,我们定义一个User实体类 public class User { ...
- 自己动手写ORM
http://blog.csdn.net/sundacheng1989/article/category/1350100
- Python - 动手写个ORM
Python - 动手写个ORM 任务: 模拟简单的ORM - Object Relational Mapping 为model添加create方法 代码很简单,直接上 字段类型类 class Fie ...
- 为初学者写ORM,ORM的原理及测试案例
提纲 一.什么是ORM.二.反射以及Attribute在ORM中的应用.三.创建一个数据库表和表对应的实体model.四.实体model如何映射出数据库表.五.组合ORM映射生成insert语句.六. ...
- 自己动手写把”锁”---LockSupport介绍
本篇是<自己动手写把"锁">系列技术铺垫的最后一个知识点.本篇主要讲解LockSupport工具类,它用来实现线程的挂起和唤醒. LockSupport是Java6引入 ...
随机推荐
- 通过圆形载入View了解自定义View
这是自定义View的第一篇文章,通过制作简单的自定义View来了解自定义View的流程. 自定义View是Android学习和开发中必不可少的一部分.通过自定义View我们可以制作丰富绚丽的控件,自定 ...
- 电脑桌面 IE 图标删除不了的解决方法
电脑换了系统之后想把桌面的IE浏览器给删掉,可是直接删除又删不掉,杀毒软件查杀也没有问题.找了很多方法,终于才把它给解决了.下面,就把我的方法分享给桌面ie图标删除不了的解决方法,希望能对大家有所帮助 ...
- Yii2-多表关联的用法示例
本篇博客是基于<活动记录(Active Record)>中对于AR表关联用法的介绍. 我会构造一个业务场景,主要是测试我比较存疑的各种表关联写法,而非再次介绍基础用法. 构造场景 订单ar ...
- php安装的一点点事 ---wampserver
安装wampserver后,需要配置一些文件 1. 首先修改httpd.conf <Directory /> Options FollowSymLinks AllowOverride No ...
- WaitType:ASYNC_NETWORK_IO
官方文档的定义,是指SQL Server 产生的结果集需要经过Network传递到Client,Network不能很快将结果集传输到Client,导致结果集仍然驻留在SQL Server的Sessio ...
- 无法启动WP Emulator
记得以前Vware不能运行设置的东西了吗?http://www.cnblogs.com/dunitian/p/4480750.html 如果不清楚可以参考上面的链接 重启的时候选择第二项 重新打开就o ...
- javascript面向对象系列第四篇——选项卡的实现
前面的话 面向对象的应用并非只是读几本书那么容易,需要有大量的工程实践做基础才能真正理解并学会使用它.本文将用面向对象的技术来制作一个简单的选项卡 图示说明 由图示结果看到,这是一个非常简单的选项卡. ...
- 掌握 cinder-scheduler 调度逻辑 - 每天5分钟玩转 OpenStack(48)
上一节我们详细讨论了 cinder-api 和 cinder-volume,今天讨论另一个重要的 Cinder 组件 cinder-scheduler. 创建 Volume 时,cinder-sche ...
- Objective-C中把URL请求的参数转换为字典
上一篇博客中是把URL转换为字典,那么我们如何把URL请求中的参数封装成字典,然后再封装成数组呢?对OC中字符串操作熟练的小伙伴们应该觉得这是一个a+b的问题,没错把URL中的参数转换为字典主要是对字 ...
- webapp应用---cordova.js 3.7.0插件安装总结
今天是2014年的最后一天,年终总结什么的就不写了.记录一下今天的工作内容.如果不知道phoneGap,那么就不需要往下看了,phoneGap现在已经叫cordova了,叫什么不重要,重要的是它对we ...