[转帖]ORM框架的前世今生
ORM框架的前世今生
https://www.cnblogs.com/7tiny/p/9551754.html
目录
一、ORM简介
二、ORM的工作原理
三、ORM的优缺点
四、常见的ORM框架
一、ORM简介
ORM(Object Relational Mapping)对象关系映射,一般指持久化数据和实体对象的映射

数据存储是绝大多数软件系统都要接触到的技术,具有一定规模的软件产品,为了方便存储和管理数据,便引入了数据库这一工具,但是数据如何从程序写入数据库的呢?
为方便程序员通过代码将数据写入数据库,一般的语言开发的厂商都会为各种数据库适配数据库连接的驱动程序,比如ADO.Net,JDBC等。
但是数据库连接的驱动程序的职责在于管理连接数据库,设置连接参数等信息,通常会返回各自封装好的数据集类型,驱动程序封装的类型往往是以数据为核心进行描述的,现代化的软件设计为了简便描述事物的特征都而以面向对象思想为核心,两者之间的转换还有很多的路要走。
除却转换部分,Sql语句的编写也是一大学问,一般的编程语言都没有为sql语句定义类型,这是因为每种数据库的sql语句风格都是不一样的,难以给出一个统一的方案。退而求其次,一般的编程语言都采用字符串形式传递sql语句到数据库驱动程序。抛弃各种各样的sql语句的学习之外,这种方式有一个很大的弊端,那就是sql语句的拼写极容易由于手误而犯错。
在这种场景下,ORM框架诞生了!
二、ORM的工作原理
在讲解完ORM的前世之后,我们来聊聊ORM框架为我们做了什么。
在第一节我们提过了,没有ORM的情况下,主要有两个槽点:
1.驱动返回类型和对象不能良好映射
2.SQL语句的学习成本及易错率(多种数据库语句难以全部掌握)
那么,且看我们的ORM如何改善这两个槽点:

1.数据驱动返回的数据通常都是以数据为核心的数据集合,我们需要通过手动将类对象和数据库返回的列数据进行一一匹配获取,然后赋值到对象上。在这里要感谢泛型和反射两大语法,通过泛型和反射,我们可以获取到任何实体类的属性而不是具体到某一种类型,通过遍历实体类的属性去数据集合中一一获取并复制返回。这一操作便将数据集合的数据完美包装成了以面向对象为核心的和类相关的对象数据集合。
2.sql语句的拼写,我们可以提供一套公共sql语句模板,然后在具体实体对象操作的时候将实体对象的属性名称和属性值当作参数拼接进去,组装成完整的sql语句(例如java体系中的Mybatis框架)或者依旧采用封装一套浅显易懂的Api,Api内部通过对应方法和实体对象的组装成sql语句(例如.Net体系中EntityFramework框架)
ORM还为我们做了什么?
最重要的两个问题解决完之后,我们可以在框架中做一些对我们有帮助的其他事情。ORM框架做的最多的便是“缓存”。

作为程序员应该掌握的基础知识,数据库操作是要和硬盘打交道的,而程序是在内存中运行的,操作内存的速度要比操作硬盘快数十倍以上,可见一个访问量较高的大型系统很容易由于数据库操作过于频繁而拖慢整体速度,从而影响系统的使用。因此,ORM框架要帮助我们减少数据库的访问,加快系统速度。
ORM框架的缓存系统一般是较为复杂的,而且每种ORM框架对缓存的实现机制都是不同的。整体的思路却是一致的,对访问频率较高的数据进行缓存,并在对数据编辑的时候要对缓存进行更新,以免出现数据不一致的问题。详细的缓存实现策略这里不一一赘述,感兴趣可以针对某个ORM框架进行剖析。
三、ORM的优缺点
通过上面两节的描述,我们很容易总结出ORM框架的优缺点。我们先来说说优点。
ORM框架降低了学习门槛,一个对sql语句并不熟悉的开发人员也可以很容易通过简易的ORM框架Api进行数据库的操作。
提高了开发效率,ORM使我们减少很多繁琐重复的工作量,让我们的注意力集中在实现业务上。
一定程度上提高了程序的响应速度。
ORM框架的弊端也很明显,框架会自动生成Sql语句,所有场景的sql语句都是同一套模板,难以自动针对场景对sql语句进行良好的优化,某种场景下很容易生成执行很慢的sql语句。如果让DBA看到这样的执行sql,必定引来抓狂崩溃。
ORM框架只是为了满足绝大多数的场景而生的,特殊需要优化sql的场景下,我们完全可以直接使用驱动手动执行sql或使用ORM框架内提供的sql语句api进行自定义sql语句。
四、市面常见的ORM框架
.Net体系:
EntityFramework,功能强大,lambda api,有些庞大臃肿,很多功能用不上
Dapper,轻量级,数据库种类支持丰富,sql写法灵活,运行速度快
CYQ.Data,自动化,日志,分布式缓存,弱类型,api简介
Java体系:
MyBatis,映射采用Xml配置sql,多种映射关系灵活配置,sql需要手动编写到配置,轻量级,半自动
Hibernate,Xml配置sql,支持HQL语句,移植性好,日志,重量级,功能全,全自动
Speedment,lambda api,依赖java8

[转帖]ORM框架的前世今生的更多相关文章
- ORM框架的前世今生
		
目录 一.ORM简介二.ORM的工作原理三.ORM的优缺点四.常见的ORM框架 一.ORM简介 ORM(Object Relational Mapping)对象关系映射,一般指持久化数据和实体对象的映 ...
 - 轻量级ORM框架 Bankinate
		
[前言] 前面讲过ORM的前世今生,对ORM框架不了解的朋友可以参考博文:https://www.cnblogs.com/7tiny/p/9551754.html 今天,我们主要通过设计一款轻量级的O ...
 - hisql ORM 框架研究(国内第一个支持HANA的ORM框架)
		
HiSql 操作说明文档 V1.0 下一代ORM框架 国内第一个支持HANA的ORM框架 hisql源码下载 git clone https://github.com/tansar/HiSql.git ...
 - ASP.NET MVC 使用 Petapoco 微型ORM框架+NpgSql驱动连接 PostgreSQL数据库
		
前段时间在园子里看到了小蝶惊鸿 发布的有关绿色版的Linux.NET——“Jws.Mono”.由于我对.Net程序跑在Linux上非常感兴趣,自己也看了一些有关mono的资料,但是一直没有时间抽出时间 ...
 - 最好的5个Android ORM框架
		
在开发Android应用时,保存数据有这么几个方式, 一个是本地保存,一个是放在后台(提供API接口),还有一个是放在开放云服务上(如 SyncAdapter 会是一个不错的选择). 对于第一种方式, ...
 - [Android]Android端ORM框架——RapidORM(v2.1)
		
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/6020412.html [Android]Android端ORM ...
 - [Android]Android端ORM框架——RapidORM(v2.0)
		
以下内容为原创,欢迎转载,转载请注明 来自天天博客:http://www.cnblogs.com/tiantianbyconan/p/5626716.html [Android]Android端ORM ...
 - 轻量级ORM框架——第一篇:Dapper快速学习
		
我们都知道ORM全称叫做Object Relationship Mapper,也就是可以用object来map我们的db,而且市面上的orm框架有很多,其中有一个框架 叫做dapper,而且被称为th ...
 - ORM之殇,我们需要什么样的ORM框架?
		
最近在研究ORM,究竟什么样的框架才是我们想要的 开发框架的意义在于 开发更标准,更统一,不会因为不同人写的代码不一样 开发效率更高,无需重新造轮子,重复无用的代码,同时简化开发流程 运行效率得到控制 ...
 
随机推荐
- vxlan和macvlan操作
			
vxlan: 192.168.1.112 ———— 192.168.1.108 —— 192.168.1.109192.168.1.112配置:docker run -d -p 8500:8500 - ...
 - 纯JavaScript开发飞机大战项目
			
开发工具: HBuilder 编程语言:JavaScript 其他技术:Html + Css 项目截图: 视频: 源代码: 在线观看地址: (暂无) 百度网盘下载地址: 请加QQ群:915 ...
 - 【TensorFlow官方文档】MNIST机器学习入门
			
MNIST是一个入门级的计算机视觉数据集,它包含各种手写数字图片:它也包含每一张图片对应的标签,告诉我们这个是数字几.比如,下面这四张图片的标签分别是5,0,4,1. 从一个很简单的数学模型开始:训练 ...
 - MQ消息机制如何确认消费了消息?
			
消息队列如何保证消息能百分百成功被消费 目前常用的消息队列有很多种,如RabbitMQ,ActiveMQ,Kafka...下面以RabbitMQ为例来讲如何保证消息队列中的信息能百分百被消费掉. 其中 ...
 - 当fixed元素相互嵌套时,父元素会影响子元素的层叠关系,最好不要嵌套使用fixed
			
问题:fixed元素被另一个fixed元素包含的时候在chrome下fixed子元素的定位会受到父元素的影响. 解释:层叠关系是受层叠上下文影响的.文档中的层叠上下文由满足以下任意一个条件的元素形成: ...
 - Unix下可用的五种 I/O 模型
			
介绍 当TCP客户端同时处理两个输入时:标准输入和TCP套接字,当客户端fgets(在标准输入上)被阻塞并且服务器进程被终止时,我们遇到了问题.服务器TCP正确地将FIN发送到客户端TCP,但由于客户 ...
 - Android 调用WCF实例详解
			
上篇文章已经对Web Service及其相关知识进行了介绍(Android开发之WebService介绍 ),相信有的朋友已经忍耐不住想试试在Android应用中调用Web Service.本文将通过 ...
 - sublime 删除重复行
			
sublime 删除重复行 - 国内版 Binghttps://cn.bing.com/search?q=sublime+%E5%88%A0%E9%99%A4%E9%87%8D%E5%A4%8D%E8 ...
 - PHP 输出两个指定日期之间的所有日期
			
function printDates($start,$end){ $dt_start = strtotime($start); $dt_end = strtotime($end); while ($ ...
 - 为什么static成员必须在类外初始化,而不能在类的头文件中初始化
			
为什么static成员必须在类外初始化 为什么静态成员不能在类内初始化 在C++中,类的静态成员(static member)必须在类内声明,在类外初始化,像下面这样. class A { pri ...