目录java
1、ORM简介
2、ORM的工做原理
3、ORM的优缺点
4、常见的ORM框架程序员
ORM(Object Relational Mapping)对象关系映射,通常指持久化数据和实体对象的映射sql
数据存储是绝大多数软件系统都要接触到的技术,具备必定规模的软件产品,为了方便存储和管理数据,便引入了数据库这一工具,可是数据如何从程序写入数据库的呢?数据库
为方便程序员经过代码将数据写入数据库,通常的语言开发的厂商都会为各类数据库适配数据库链接的驱动程序,好比ADO.Net,JDBC等。编程
可是数据库链接的驱动程序的职责在于管理链接数据库,设置链接参数等信息,一般会返回各自封装好的数据集类型,驱动程序封装的类型每每是以数据为核心进行描述的,现代化的软件设计为了简便描述事物的特征都而以面向对象思想为核心,二者之间的转换还有不少的路要走。api
除却转换部分,Sql语句的编写也是一大学问,通常的编程语言都没有为sql语句定义类型,这是由于每种数据库的sql语句风格都是不同的,难以给出一个统一的方案。退而求其次,通常的编程语言都采用字符串形式传递sql语句到数据库驱动程序。抛弃各类各样的sql语句的学习以外,这种方式有一个很大的弊端,那就是sql语句的拼写极容易因为手误而犯错。缓存
在这种场景下,ORM框架诞生了!app
在讲解完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框架下降了学习门槛,一个对sql语句并不熟悉的开发人员也能够很容易经过简易的ORM框架Api进行数据库的操做。
提升了开发效率,ORM使咱们减小不少繁琐重复的工做量,让咱们的注意力集中在实现业务上。
必定程度上提升了程序的响应速度。
ORM框架的弊端也很明显,框架会自动生成Sql语句,全部场景的sql语句都是同一套模板,难以自动针对场景对sql语句进行良好的优化,某种场景下很容易生成执行很慢的sql语句。若是让DBA看到这样的执行sql,一定引来抓狂崩溃。
ORM框架只是为了知足绝大多数的场景而生的,特殊须要优化sql的场景下,咱们彻底能够直接使用驱动手动执行sql或使用ORM框架内提供的sql语句api进行自定义sql语句。
EntityFramework,功能强大,lambda api,有些庞大臃肿,不少功能用不上
Dapper,轻量级,数据库种类支持丰富,sql写法灵活,运行速度快
CYQ.Data,自动化,日志,分布式缓存,弱类型,api简介
MyBatis,映射采用Xml配置sql,多种映射关系灵活配置,sql须要手动编写到配置,轻量级,半自动
Hibernate,Xml配置sql,支持HQL语句,移植性好,日志,重量级,功能全,全自动
Speedment,lambda api,依赖java8