为什么出现ORM
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的更多相关文章
- 终于等到你:CYQ.Data V5系列 (ORM数据层)最新版本开源了
前言: 不要问我框架为什么从收费授权转到免费开源,人生没有那么多为什么,这些年我开源的东西并不少,虽然这个是最核心的,看淡了就也没什么了. 群里的网友:太平说: 记得一年前你开源另一个项目的时候我就说 ...
- 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 数据库 ...
- UWP开发之ORM实践:如何使用Entity Framework Core做SQLite数据持久层?
选择SQLite的理由 在做UWP开发的时候我们首选的本地数据库一般都是Sqlite,我以前也不知道为啥?后来仔细研究了一下也是有原因的: 1,微软做的UWP应用大部分也是用Sqlite.或者说是微软 ...
- 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】
前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...
- CYQ.Data 从入门到放弃ORM系列:开篇:自动化框架编程思维
前言: 随着CYQ.Data 开始回归免费使用之后,发现用户的情绪越来越激动,为了保持这持续的激动性,让我有了开源的念头. 同时,由于框架经过这5-6年来的不断演进,以前发的早期教程已经太落后了,包括 ...
- CYQ.Data V5 从入门到放弃ORM系列:教程 - Log、SysLogs两个日志类使用
Log 静态类介绍: Public Static (Shared) Methods GetExceptionMessage 获取异常的内部信息 WriteLogToDB Overloaded. 将日志 ...
- CYQ.Data V5 从入门到放弃ORM系列:教程 - MAction类使用
背景: 随着V5框架使用者的快速增加,终于促使我开始对整个框架编写完整的Demo. 上周大概花了一星期的时间,每天写到夜里3点半,终完成了框架所有功能的Demo. 同时,按V5框架名称空间的顺序,对每 ...
- ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...
- 最好的5个Android ORM框架
在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...
- Asp.Net Mvc通用后台管理系统,bootstrap+easyui+权限管理+ORM
产品清单: 1.整站源码,非编译版,方便进行业务的二次开发 2.通用模块与用户等基础数据的数据库脚本 3.bootstrap3.3.1 AceAdmin模板源码 4.easyui1.3.5源码 5.F ...
随机推荐
- HDU 5281 Senior's Gun 杀怪
题意:给出n把枪和m个怪.每把枪有一个攻击力,每一个怪有一个防御力.假设某把枪的攻击力不小于某个怪的防御力则能将怪秒杀,否则无法杀死.一把枪最多仅仅能杀一个怪,不能用多把枪杀同一个怪.每杀一次怪能够得 ...
- layout-代码中添加view
今天需要在代码中动态的给一个布局添加一个imageview,现在把方法记录如下.直接看demo代码 //创建容器 final LinearLayout layout = new LinearLayou ...
- android学习笔记五。1、Service深入学习
一.Service,服务是没有界面而在后台长期运行的程序,可以看做是后台的Activity. 1.在Android中按返回键退出一个应用并不会(内存充足时)直接销毁一个进程,所以其中的子线程也可以在后 ...
- AtCoder Grand Contest 018 A - Getting Difference
A - Getting Difference Time limit : 2sec / Memory limit : 256MB Score : 300 points Problem Statement ...
- readonly&&declare&&unset &&export&&env环境变量
readonly命令用于定义只读shell变量和shell函数.readonly命令的选项-p可以输出显示系统中所有定义的只读变量. 选项 -f:定义只读函数: -a:定义只读数组变量: -p:显示系 ...
- fc---输出历史命令列表
fc指令 fc指令可以用于输出历史命令列表,也可以通过调用vi编辑器对历史指令内容进行编辑输出. 语法: fc [-e ename] [-lnr] [first] [last] 选项: -l:显示历史 ...
- centos7基础配置
记录虚拟机安装完成后的初始配置: 1.网络: 桥接方式,设置静态ip,与物理机同一网段 Ip配置 配置完成 service network restart ,重启网络后 物理机可ssh连接虚拟机系统. ...
- [Python] Python's namedtuples can be a great alternative to defining a class manually
# Why Python is Great: Namedtuples # Using namedtuple is way shorter than # defining a class manuall ...
- JAVASE学习笔记:第十章 SWing经常使用控件类(二)
7.JComboBox 下拉列表 /* * 初始化下拉列表 */ public void addcomb(){ String[] area = {"山西省&qu ...
- Android学习笔记进阶十一图片动画播放(AnimationDrawable)
大家平时见到的最多的可能就是Frame动画了,Android中当然也少不了它.它的使用更加简单,只需要创建一个 AnimationDrawabledF对象来表示Frame动画,然后通过addFrame ...