ORM概念和原理

ORM概念和原理

ORM 概念

我们在介绍 MyBatis 时说到,MyBatis是一种半自动 ORM 实现。那何为 ORM,何为半自动?

ORM(Object/Relation Mapping,对象/关系数据库映射)是一种描述对象与关系数据库之间映射的规范。怎么理解呢?就拿班规来说吧,它也是一种规范,描述学生与班集体之间行为的规范。

ORM 作用

我们知道班规的作用是约束学生的不良行为,目的是营造良好的班级学习氛围。那ORM的作用呢?ORM 作用是为对象与关系数据库之间搭建桥梁,以解决对象与关系数据库之间不协调的问题。

那对象与关系数据库之间到底哪里不协调了?我们都知道在 Java 一种面向对象的编程语言,在 Java 世界里万物皆对象,就是说 Java 编程玩的就是对象,涉及的核心概念就是对象、类和属性。我们回头再看关系数据库,它操作的是对象吗?它能否直接存储对象到数据库或者从数据库直接获取对象?显然不能,如果可以那就不叫关系数据库,而应该叫对象数据库。我们可以说,在关系数据库的世界里,万物皆关系,玩的就是二维表,涉及的核心概念是表、记录和字段

所以,Java对象和关系数据库如同马和牛,简直是牛头不对马嘴,存在不协调的问题。那这个不协调的问题导致怎样的结果呢?导致的结果就是我们在数据库编程时,使用 JDBC 从数据库里获取的不是对象,而是一个个数据库字段,需要手动创建一个 Java 对象实体,再把这些字段存放到 Java 对象实体的属性里。代码如下:

// 从数据库获取字段
int id = rs.getInt("id");
String userName = rs.getString("userName");
String password = rs.getString("password");
String name = rs.getString("name");
int age = rs.getInt("age");
int sex = rs.getInt("sex");
Date birthday = rs.getDate("birthday");
String created = rs.getString("created");
String updated = rs.getString("updated");

// 创建对象实体并将字段存放到对象属性中
UserEntity userEntity = new UserEntity();
userEntity.setId(id);
userEntity.setUserName(userName);
userEntity.setPassword(password);
userEntity.setName(name);
userEntity.setAge(age);
userEntity.setSex(sex);
userEntity.setBirthday(birthday);
userEntity.setCreated(created);
userEntity.setUpdated(updated);

由于 Java 对象与关系数据库之间不协调的问题,导致的结果就是数据库编程代码繁琐,开发效率低。

ORM 映射规则

  1. 类与表相对应(基本规则)
  2. 类的属性(或成员变量)与表的字段相对应(基本规则)
  3. 类的实例与表中具体的一条记录相对应(基本规则)
  4. 一个类可以对应多个表,一个表也可以对应多个类
  5. 数据库中的表可以没有主键,但是类中必须有主键字段
  6. 数据库中表与表之间的关系对应类与类之间的关系
  7. 数据库中表的字段个数和名称可以和类的属性(或成员变量)不一样

这7条 ORM 映射规则中,前3条是基本规则,也是最重要的规则。

ORM 框架

我们已经知道 ORM 是一种规范,而 ORM 本身并不能带来开发效率的提升,这就好比我们制定了一个好的班规,如果大家并不去遵守和执行它,也不会带来任何学习效率的提升。

ORM 框架就是指实现了 ORM 映射规则的框架,而 MyBatis 就是一种 ORM 框架,当然Hibernate也是。有了这些 ORM 框架,我们就不用自己手动编写代码去实现 ORM 规范,使用 ORM 框架就可以发挥 ORM 规范的威力,以提升开发效率。

软件框架

软件框架是面向某个领域的、可复用的半成品软件,为软件提供基础结构和一些规范约束。在软件框架的基础上进行开发,就可以避免从头开发,可以大大提高开发效率。软件框架其实很像开发商的清水房,清水房也是一个半成品房子,在清水房基础上进行装修,就比农村从挖地基开始自己一砖一瓦修建房子快很多。那精装房呢,那就相当于是成品软件,就没有程序员什么事了。

不过,框架也有不足的地方,就是开发的灵活性和扩展性要差一些。这个很好理解,清水房要装修开发商一般有一些规范约束,比如房屋结构是不能随便改的,特别是有些承重墙是不能打掉的。而农村修房子就没有那么多规范约束,想怎么修就怎么修,谁也管不着。那精装房呢?啥也不用改了,直接拎包入住。除非你是人傻钱多,拆了重新装修,和小品里的许君聪一样,任性、调皮。

软件架构

软件架构是面向复杂软件系统开发的最高级别的设计,架构设计就是把复杂软件系统分解为一些部件,并描述这些部件的职责及它们之间的协作行为,比如三层架构。软件架构师的工作就是进行复杂软件系统的架构设计,相当于建筑行业的建筑师;架构师输出的软件系统设计草图,而建筑师输出的是建筑系统设计草图,反正这两类人都是很牛逼的,位于金字塔顶端。那么程序员呢?这么给你说吧,程序员常被称为码农,工作被称为搬砖,这就相当于建筑行业搬砖的泥瓦匠,都是架构设计的具体实施者,位于金字塔的底端。听上去程序员好没有地位,但你想一想如果没有程序员的搬砖,再好的软件架构设计也只是一纸空谈,只有经过程序员的开发后,软件架构才可以体现在软件当中。

如果软件系统很简单,比如开发一个21点小游戏,那就没有必要杀鸡用牛刀,动用软件架构师啦,程序员就可以搞定啦。很多中小型软件公司里,就没有软件架构师,不是因为请不起,而是没有必要。因为本身开发的软件系统并不太复杂,使用行业已经比较成熟的软件架构设计方案即可,比如三层架构,就不需要软件架构师专门去设计架构。所以,架构师这种生物,主要在大厂里出没。而程序员就不一样了,如同打不死的小强,无处不在哈。

框架和架构总结

软件架构和软件框架其实都是人类为了解决日益复杂的软件系统所带来的开发困难而采取“分而治之”思想的结果。

  • 软件架构作用:降低开发复杂度

  • 软件框架作用:提高开发效率

ORM 总结

  • ORM 作用是为对象与关系数据库之间搭建桥梁,以解决对象与关系数据库之间不协调的问题
  • ORM 框架已实现 ORM 映射规则(MyBatis 为半自动 ORM 框架,而 Hibernate 为全自动 ORM 框架)
posted @ 2021-09-23 19:04  嘛了对就念来过倒  阅读(281)  评论(0编辑  收藏  举报