什么是ORM?

ORM,即对象关系映射(Object Relational Mapping)表示一种技术,用来把(对象模型)表示的对象映射到基于SQL的(关系模型)数据结构中去。

说得通俗点,就是在对象的属性与关系表的字段之间建立一套规则,来实现数据的交互。我们只需使用对象提供给我们的接口来完成数据操作,而无需关心数据到底是如何被查询,被插入的,省去了我们写sql语句的麻烦。一般一个关系表对应两个类,即实体类和操作类。

如何实现ORM?

ORM,只是一个概念,不是一种实现。我们完全可以在这个概念上实现自己的ORM框架。而实现这个框架的核心是反射(reflect)技术。通过它,我们可以根据对象属性和表字段名的关系,获取和设置对象的字段值,或者构造sql语句进行表操作。

很多语言中,都有自己的比较成熟的ORM框架,拿来即可。Java中的Hibernate,C#中的NHibernate,C++中的ODB,Android中的ormlite、db4o。当然,它们各自的封装程度不同,为了重用和方便调用,有的(如odb,hibernate)需要你自己配置和进行进一步的封装,有的(ormlite、db4o)则封装得很好,你只需建立一个对象,框架会自动为你生成关系表和操作类,很方便。

不论是别人的还是自己的框架,为了保持接口的统一,降低耦合性,我们通常对数据操作类做如下接口约定,

public class TableName{//使用表名称作为操作类名称

/*item=Tb前缀+TableName,即实体类*/

item GetById(id),                       //按id获取表中的一行记录

List<item> GetByClause(clause),//按条件子句获取表中的记录

List<item> GetAll(),                   //获取表中的所有记录

List<item> GetByPage(start,count,clause,sort,dir),//按页获取

Insert(item),   //插入

Update(item),//更新

Delete(id)     //删除

};//end of class

以上接口仅供参考,读者可以根据自己的业务场景建立自己的约束,这样可以方便的更换Orm框架,并为代码生成器的使用作铺垫。

ORM框架的使用

这里,主要介绍C#中,NHibernate框架的具体使用,这个用起来相对复杂。

首先引入NHibernate.dll库文件。它主要由实体类、映射文件,配置文件(注意配置文件在1.x和2.x下有较大差别)构成。当然为了使用的方便,还需要一个操作类(select,update,insert,update)如上述。通过NHbernate.cfg里的 Configuration对象来加载映射文件,以关联数据库的表与相应的实体类,如下。

Configuration cfg = new Configuration();

string path =@"D:\..\Books.hbm.xml";//这里使用相对路径未成功

cfg.AddXmlFile(path);

再由cfg来创建会话工厂,再由会话工厂创建会话线程,再由会话开启一个数据库事务。结构如下:

【创建过程及依赖关系图】

注意:映射文件中的<class name="className,namespace" table="Tb_Books">,其中className必须为包含完整namespce的名称。

这里,提供一个我当时在CSDN上写的一个,关于C++ORM框架ODB的扩展性应用实例。

地址:http://download.csdn.net/detail/phongf/5072780

批量ORM

重复劳动是程序员的天敌,要为几十个表建立映射关系,是很痛苦的。是时候推出,我们的利器,代码生成器了。代码生成器可以做得很复杂,多数据库,多语言,组件、模板化。也可以很简单,VS里的T4引擎就是一个简单的代码生成器。有了它,我们就可以很容易为上百个表创建配置、映射、操作对象。如果操作逻辑或者表明发生变动,Once agin即可。当然,代码生成器的作用不仅于此,任何基于数据的批处理问题,都可以交给它来完成。

这里,时间有限,下次再对代码生成器做深入介绍。

水平有限,如有不当之处,还请各位拍砖指教,谢过。

大话细说ORM的更多相关文章

  1. 细说ORM之Entity FrameWork系列(被替换)

    一. 谈情怀 从第一次接触开发到现在(2018年),接近五年时间了,最初阶段连接数据库,使用的是[SQL语句+ADO.NET],那时候,什么存储过程.什么事务 统统不理解,生硬的将SQL语句传入SQL ...

  2. 作为一个.net程序猿,需要掌握这些有点前途的人才,一些开发---Shinepans

    1.基础 C#基础                    参考书目:   <c#入门经典>         <ASP.NET揭秘> IIS  HTML              ...

  3. Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点)

    Django---静态文件配置,post提交表单的csrf问题(日后细说),创建app子项目和分析其目录,ORM对象关系映射简介,Django操作orm(重点) 一丶Django的静态文件配置 #we ...

  4. 轻量级ORM框架初探-Dapper与PetaPoco的基本使用

    一.EntityFramework EF是传统的ORM框架,也是一个比较重量级的ORM框架.这里仍然使用EF的原因在于为了突出轻量级ORM框架的性能,所谓有对比才有更优的选择. 1.1 准备一张数据库 ...

  5. 吉特仓库管理系统-ORM框架的使用

    最近在园子里面连续看到几篇关于ORM的文章,其中有两个印象比较深刻<<SqliteSugar>>,另外一篇文章是<<我的开发框架之ORM框架>>, 第一 ...

  6. [转]Android ORM系列之GreenDao最佳实践

    GreenDAO是一个可以帮助Android开发者快速将Java对象映射到SQLite数据库的表单中的ORM解决方案,通过使用一个简单的面向对象API,开发者可以对Java对象进行存储.更新.删除和查 ...

  7. 大话分页(补充)——Threadlocal封装offSet和pageSize简化分页工具类

    经过前两篇文章(大话分页一.大话分页二)的介绍,我认为我想介绍的东西已经介绍完了,不过想精益求精的童鞋可以继续看本篇文章. 在第一篇文章中介绍了一个分页的工具类(具体请看大话分页一),从实现功能上来说 ...

  8. 从壹开始前后端分离【 .NET Core2.0 +Vue2.0 】框架之七 || API项目整体搭建 6.2 轻量级ORM

    更新 1.在使用的时候,特别是更新数据的时候,如果不知道哪里有问题,可以查看数据库 和 实体类 的字段,是否大小写一致,比如 name 和 Name 2.在使用Sqlsugar 的 CodeFirst ...

  9. 我的第一个python web开发框架(24)——系统重构与ORM

    小白弄完代码版本管理和接口文档后,兴奋的找到老菜. 小白:老大,我已经按你讲的要求,将代码版本管理和接口文档都搞好了.从项目开始到现在,除了代码编写,感觉学会好多东西啊. 老菜:嗯嗯,实战确实需要掌握 ...

随机推荐

  1. 【memcache缓存专题(1)】memcache的介绍与应用场景

    简介 Memcached是一个高性能的分布式的内存对象缓存系统,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各 ...

  2. springmvc常用注解之@Controller和@RequestMapping

    对于各种注解而言,排第一的当然是“@Controller”,表明某类是一个controller. “@RequestMapping”请求路径映射,如果标注在某个controller的类级别上,则表明访 ...

  3. Spring两种实现AOP的方式

    有两种实现AOP的方式:xml配置文件的方式和注解的形式 我们知道通知Advice是指对拦截到的方法做什么事,可以细分为 前置通知:方法执行之前执行的行为. 后置通知:方法执行之后执行的行为. 异常通 ...

  4. Git教程之版本回退(4)

    现在,我们已经学会了修改文件,然后把修改提交到Git版本库,现在再次修改readme.txt文件如下:

  5. NC / Netcat - 反弹Shell

    原理 实验环境: 攻击机:windows机器,IP:192.168.12.109 受害机:linux机器,IP:192.168.79.1 攻击机:设置本地监听端口2222 C:\netcat>n ...

  6. Android ActionBar的Overlay模式如何不遮盖顶部内容的问题

    关于actionbar的overlay模式请参考 如何让android的actionbar浮动且透明 一文.这篇文章讲的是如何在这种模式下让actionbar不遮住顶部的内容. 这 一般是这样的场景, ...

  7. varchar 保存英文中文区别。

    varchar在SQL Server中是采用单字节来存储数据的,中文字符存储到SQL Server中会保存为两个字节,英文字符保存到数据库中,如果字段的类型为varchar,则只会占用一个字节,而如果 ...

  8. java_十进制数转换为二进制,八进制,十六进制数的算法

    java_十进制数转换为二进制,八进制,十六进制数的算法 java Ê®½øÖÆÊýת»»Îª¶þ½øÖÆ,°Ë½øÖÆ,Ê®Áù½øÖÆÊýµÄË㕨 using System; using S ...

  9. IIS与ASP.NET中的队列

    一.IIS:应用程序池队列(Application pool queue,位于HTTP.SYS) 这是请求到达IIS后遇到的第一个队列,http.sys收到请求后会将请求放入对应的应用程序池队列,这样 ...

  10. BZOJ1048: [HAOI2007]分割矩阵

    题目:http://www.lydsy.com/JudgeOnline/problem.php?id=1048 题解:搞清题意之后来个记忆化爆搜就行了. 代码: #include<cstdio& ...