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 映射规则
-
类与表相对应(基本规则)
-
类的属性(或成员变量)与表的字段相对应(基本规则)
-
类的实例与表中具体的一条记录相对应(基本规则)
-
一个类可以对应多个表,一个表也可以对应多个类
-
数据库中的表可以没有主键,但是类中必须有主键字段
-
数据库中表与表之间的关系对应类与类之间的关系
-
数据库中表的字段个数和名称可以和类的属性(或成员变量)不一样
这7条 ORM 映射规则中,前3条是基本规则,也是最重要的规则。
ORM 框架
我们已经知道 ORM 是一种规范,而 ORM 本身并不能带来开发效率的提升,这就好比我们制定了一个好的班规,如果大家并不去遵守和执行它,也不会带来任何学习效率的提升。
ORM 框架就是指实现了 ORM 映射规则的框架,而 MyBatis 就是一种 ORM 框架,当然Hibernate也是。有了这些 ORM 框架,我们就不用自己手动编写代码去实现 ORM 规范,使用 ORM 框架就可以发挥 ORM 规范的威力,以提升开发效率。
总结
- ORM 作用是为对象与关系数据库之间搭建桥梁,以解决对象与关系数据库之间不协调的问题
- ORM 框架已实现 ORM 映射规则(MyBatis 为半自动 ORM 框架,而 Hibernate 为全自动 ORM 框架)