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. babel的插件

    比如想编译es6的箭头函数,需要使用babel-plugin-transform-es2015-arrow-functions这个插件 此外babel提供了 prests(预设) 相当于是插件的集合 ...

  2. 实现人脸识别性别之路---try语句的使用

    Try语句 用法:处理异常信息 存在的形式:try-except X-except T...-except-else-finally(其中X T为错误的类型) 表达意思:try语句是执行正常语句,如果 ...

  3. 两种方法解决 "The License CNEKJPQZEX- has been cancelled..." 问题

    今天在使用 2017 的 IDEA 和 Pycharm 等IDE的时候,提示了如题的问题.之前实在 http://idea.lanyus.com/ 网站点击生成注册码,复制粘贴到 IDEA 中就好了, ...

  4. CSUOJ 1531 Jewelry Exhibition

    Problem G Jewelry Exhibition To guard the art jewelry exhibition at night, the security agency has d ...

  5. 【Eclipse中使用Git之一】把远程仓库的项目,clone到eclipse里面

    [Eclipse中使用Git之一]把远程仓库的项目,clone到eclipse里面 2015-01-29 19:25 15779人阅读 评论(1) 收藏 举报 .embody{ padding:10p ...

  6. VM虚拟机全屏显示

    在虚拟机中使用全屏界面会有更强的用户体验.在编辑该文章的时候就是在使用虚拟机windows2008 R2系统.我的笔记本是苹果双系统.虚拟机安装在win7 64位系统下 1.首先查看主机的屏幕分辨率 ...

  7. C++对象模型——Inline Functions(第四章)

    4.5 Inline Functions 以下是Point class 的一个加法运算符的可能实现内容: class Point { friend Point operator+(const Poin ...

  8. 解决 php7 cli 模式下中文乱码的两中方法

    解决 php7 cli 模式下中文乱码的两中方法1. 给PHP文件开头加上 exec('chcp 936'); 然后把该文件以 ANSI 格式编码2. 在 php.ini 中设置 default_ch ...

  9. C/C++(函数)

    函数 函数三要素:函数名,参数,返回值 重点研究函数的输入输出 随机数函数 //产生一组随机数 #include<stdio.h> #include<stdlib.h> #in ...

  10. CODEVS——T3008 加工生产调度

    http://codevs.cn/problem/3008/  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descr ...