某一天,朋友跟咖啡兔抱怨说:
“用JDBC原生的API方法对数据库进行操作,虽然效率上是很好,但是顶不住SQL写的麻烦啊!!!,要是遇到某一个表字段又臭又复杂,写出来的SQL语句就不精致。我需要浪费大量的时间去写一堆繁琐的SQL,还容易出错,没准犯困写着写着就是一个BUG。
初见 ORM 框架:
什么是ORM框架
将ORM这几个拆开来看:O (Object) 对象 ,R (Relational) 关系 ,M (Mapping) 图。合在一起来说就是 对象关系映射图(Object/Relation Mapping)。
ORM 框架的核心思想: 将数据库中的表单记录数据通过关系映射规则,映射成为对象元素,以对象的方式展示数据,将传统意义上的对数据的操作改为基于对象进行操作。ORM框架是通过使用描述对象和数据库映射的元数据,将程序中的对象持久化到关系数据库中。
那么ORM的诞生主要是为了什么?
ORM框架的诞生主要好似为可解决对象关系映射。通常意义上来说,域模型和关系模型分别是建立在概念模型的基础上额。而域模型是面向对象的关系,但是关系模型则是面向关系的。在开发过程中的,一般情况下一个持久化对象类与一张数据表对应。类的每个实例对应表中的每一条数据记录,而类的属性是对应表中的每一个字段。
ORM 方法基于三个原则:
- 简单 :建模数据简单化,用最基本的形式进行数据建模。
- 传达性:数据库结构被任何人能理解的语言文档化。
- 精确性:基于数据模型创建标准化的结构。
ORM 的优点与缺点:
优点:
- 在传统的交互设计上提高了开发效率,大大缩减了开发人员的编码时间。自动的对实体对象与数据库中的表进行属性的映射。减少了SQL的编码,将传统的SQL编码演化为像操作对象一样简单。
- 将对数据库访问的细节隐藏,更加“封闭式”的交互成为了ORM的核心。
缺点:
- 映射和关联之间的管理实现了自动化,但是却是在牺牲性能的基础下。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。
- 面向对象的查询语言(X-QL)作为一种数据库与对象之间的过渡,虽然隐藏了数据层面的业务抽象,但并不能完全的屏蔽掉数据库层的设计,并且无疑将增加学习成本.
- ORM框架不适用于复杂场景下的查询,但是依旧是可以实现。视图可以解决大部分 calculated column,case ,group,having,order by, exists,但是查询条件较为繁琐。
常用的 ORM 框架:
Hibernate
Hibernate 是一个持久化框架和 ORM 框架,持久化和 ORM 是两个有区别的概念,持久化注重对象的存储方法是否随着程序的退出而消亡,ORM 关注的是如何在数据库表和内存对象之间建立关联。
Hibernate 使用 POJO 来表示 Model,使用 XML 配置文件来配置对象和表之间的关系,它提供了一系列 API 来通过对对象的操作而改变数据库中的过程。
Hibernate 更强调如何对单条记录进行操作,对于更复杂的操作,它提供了一种新的面向对象的查询语言:HQL。
MyBatis
MyBatis是另外一种 ORM 框架,和 Hibernate 擅长操作单条记录不同,MyBatis是基于 SQL 模板的,可以说,MyBatis 每次和数据库进行操作时,都有明确的 SQL 语句,而这些 SQL 语句,就是我们定义在配置文件中的。
(PS:咖啡🐰在后面大部分都是围绕 Mybatis 进行学习与开发的,毕竟许多公司已经逐渐淡化Hibernate的使用了。)