ORM(Object Relational Mapping)对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术 。

为什么出现ORM?

面向对象的特征:我们通常使用的开发语言Java,.Net都是面向对象的。面向封装了对象,对象内部有属性和方法。

关系型数据库的特点:以表的形式组织我们的数据。以列的形式表述了表的特征。表中的一条记录=一个对象,表中的列代表了对象中的属性。表之间是建立了一定的联系。

如何表中的一条记录提取出来封装成一个对象?以前的做法是:通过对应的sql语句查询出记录,后把记录中的每一条数据取出来分别,去实例化一个对象,并送给对象的每一个属性,从而达到封装对象的目的。这样就实现了把一条数据转化为一个对象。

把对象经过CRUD放在数据库中?需要对数据库进行DML语句,拼写各种sql语句,把一种形态转换为另一种形态,需要用户手动代码实现。若项目表结构很多,则反复进行对象和库的转换会容易出错。而程序员更适合做对象的封装,而不是对库频繁的开关和对数据库的DML,那么有没有什么更好的方式呢?那就是ORM的出现。ORM是数据库与对象之间的桥梁,描述两种不同形式之间的转化关系。

工作原理:

ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。

ORM自动完成以下操作:1)把对象经过CRUD放在表中,最后表现在库中。2)把数据库经过DML语句转化包装为一个对象,最后返回过来。

.Net的三层架构中,最上面的表示层(U层),中间的业务层(B层),下面的数据访问层(D层)。在以前的项目中D层通常用?DAO、DAL表示,负责所有与数据库打交道的地方,简单CRUD,通过手工封装DBHelper来实现。而数据库品种很多,如果产品如要做的很完善,就需要支持不同种类的数据库驱动,并编写不同的D层。可以通过定义接口来实现,不同的数据源实现该接口。但是这样D层代码会非常庞大。更过的库的种类很多的话,就会有庞大的D层代码。那么该如何节省这样的操作?ORM目标是持久化,充当和数据库打交道的一层。并针对不同品种的数据库,会自动转化为对应语句。

NHibernate代码很复杂,这里我们只是提供基本使用。

五部曲

创建表。若要把对象转换为数据库中的表,自然要有对一个的表。因此,首先要在数据库中创建把.Net类持久化的对应表。创建类。创建需要被持久化的.Net类.对象。创建映射文件。 描述对象和库之间的关系,告诉NH怎样持久化这些类的属性.创建NH的配置文件,以告诉NH怎样连接数据库,以何种方式连接不同种类的数据库。使用NH提供的API。维护对象和库之间的关系,对对象的CRUD和对数据库的DML.

总结

NHibernate是实现了ORM的框架,由Java开源项目Hibernate发展来的。它为面向对象开发提供了持久的类(就是我们通常说的D层),解决了对象和数据库之间相互转化的问题。并提供API,实现了对象与不同种类的数据库相互转化的问题,并具有通用性。

为什么出现ORM的更多相关文章

  1. 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了

    前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...

  2. Enterprise Solution 3.1 企业应用开发框架 .NET ERP/CRM/MIS 开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    行业:基于数据库的制造行业管理软件,包含ERP.MRP.CRM.MIS.MES等企业管理软件 数据库平台:SQL Server 2005或以上 系统架构:C/S 开发技术 序号 领域 技术 1 数据库 ...

  3. UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?

    选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软 ...

  4. 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】

    前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...

  5. CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维

    前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...

  6. CYQ.Data V5 从入门到放弃ORM系列:教程 - Log、SysLogs两个日志类使用

    Log 静态类介绍: Public Static (Shared) Methods GetExceptionMessage 获取异常的内部信息 WriteLogToDB Overloaded. 将日志 ...

  7. CYQ.Data V5 从入门到放弃ORM系列:教程 - MAction类使用

    背景: 随着V5框架使用者的快速增加,终于促使我开始对整个框架编写完整的Demo. 上周大概花了一星期的时间,每天写到夜里3点半,终完成了框架所有功能的Demo. 同时,按V5框架名称空间的顺序,对每 ...

  8. ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库

    前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...

  9. 最好的5个Android ORM框架

    在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...

  10. Asp.Net Mvc通用后台管理系统,bootstrap+easyui+权限管理+ORM

    产品清单: 1.整站源码,非编译版,方便进行业务的二次开发 2.通用模块与用户等基础数据的数据库脚本 3.bootstrap3.3.1 AceAdmin模板源码 4.easyui1.3.5源码 5.F ...

随机推荐

  1. python爬虫批量抓取ip代理

    使用爬虫抓取数据时,经常要用到多个ip代理,防止单个ip访问太过频繁被封禁.ip代理可以从这个网站获取:http://www.xicidaili.com/nn/.因此写一个python程序来获取ip代 ...

  2. MySQL架构组成之逻辑模块组成

    MySQL 能够看成是二层架构   第一层SQL Layer.包含权限推断.sql 解析.运行计划优化,query cache 的处理等等.   第二层存储引擎层(Storage Engine Lay ...

  3. easyui datagird 总计栏

    在使用easyui 的表格的时.非常多时候须要加一个总计栏,当然easyui中有加总计栏的方法,写一个footer就好,然而我认为这样的方法并不好.由于加入的总计栏是和列表每一个单元格相应的,有长度限 ...

  4. android 图片特效处理之模糊效果

    这篇将讲到图片特效处理的模糊效果.跟前面一样是对像素点进行处理,算法是通用的,但耗时会更长,至于为什么,看了下面的代码你就会明白. 算法: 一.简单算法:将像素点周围八个点包括自身一共九个点的RGB值 ...

  5. js插件---datatables如何使用

    js插件---datatables如何使用 一.总结 一句话总结:a.引入css和js(不要忘记css):b.js代码启动插件(里面可以用参数控制各种功能) 1.dataTables如何显示控制行(比 ...

  6. vue --- 解读vue的中webpack.base.config.js

    const path = require('path') const utils = require('./utils')// 引入utils工具模块,具体查看我的博客关于utils的解释,utils ...

  7. 项目: python爬虫 福利 煎蛋网妹子图

    嘿嘿嘿! 嘿嘿嘿! 福利一波, 之前看小甲鱼的python教学视频的时候, 看到上面教的爬虫, 爬美女图片的, 心很痒痒, 但是不知道为啥, 按照视频一个字一个字敲的代码,总是报错, 有一天花了 一下 ...

  8. Exercise : Self-Taught Learning

    First, you will train your sparse autoencoder on an "unlabeled" training dataset of handwr ...

  9. sync---强制将被改变的内容立刻写入磁盘

    sync命令用于强制被改变的内容立刻写入磁盘,更新超块信息. 在Linux/Unix系统中,在文件或数据处理过程中一般先放到内存缓冲区中,等到适当的时候再写入磁盘,以提高系统的运行效率.sync命令则 ...

  10. hdu2768Cat vs. Dog (反建法,最大独立集)

    Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...