「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战
上一主题我们对于 Mybatis 做了简介。 Mybatis 就是一个基于 ORM 的半自动轻量级持久层框架。这一小节就要对 ORM 概念做一下重点介绍了。
什么是 ORM
ORM 是啥?ORM 英文全称 Object Relational Maping,中文翻译对象关系映射。对象关系映射模式是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM 是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。那么,到底如何实现持久化呢?一种简单的方案是采用硬编码方式,为每一种可能的数据库访问操作提供单独的方法。
这种方案存在以下不足:
- 持久化层缺乏弹性。一旦出现业务需求的变更,就必须修改持久化层的接口
- 持久化层同时与域模型与关系数据库模型绑定,不管域模型还是关系数据库模型发生变化,毒药修改持久化曾的相关程序代码,增加了软件的维护难度。
ORM 提供了实现持久化层的另一种模式,它采用映射元数据来描述对象关系的映射,使得 ORM 中间件能在任何一个应用的业务逻辑层和数据库层之间充当桥梁。Java 典型的 ORM 中间件有:Mybatis、Hibernate。
ORM 的方法论基于三个核心原则:
- 简单:以最基本的形式建模数据。
- 传达性:数据库结构被任何人都能理解的语言文档化。
- 精确性:基于数据模型创建正确标准化了的结构。
几乎所有的程序里面,都存在对象和关系数据库。在业务逻辑层和用户界面层中,我们是面向对象的。当对象信息发生变化的时候,我们需要把对象的信息保存在关系数据库中。
当你开发一个应用程序的时候(不使用O/R Mapping),你可能会写不少数据访问层的代码,用来从数据库保存,删除,读取对象信息,等等。你在DAL中写了很多的方法来读取对象数据,改变状态对象等等任务。而这些代码写起来总是重复的。
ORM解决的主要问题是对象关系的映射。域模型和关系模型分别是建立在概念模型的基础上的。域模型是面向对象的,而关系模型是面向关系的。一般情况下,一个持久化类和一个表对应,类的每个实例对应表中的一条记录,类的每个属性对应表的每个字段。
ORM技术特点:
- 提高了开发效率。由于ORM可以自动对Entity对象与数据库中的Table进行字段与属性的映射,所以我们实际可能已经不需要一个专用的、庞大的数据访问层。
- ORM提供了对数据库的映射,不用sql直接编码,能够像操作对象一样从数据库获取数据。
前面这样介绍 ORM,有的人还是不太理解,接下我们就拆开来介绍。
O 是 Object 缩写,具体指的是对象模型,在具体化可以理解为实体对象。
R 是 Relational 缩写,具体指的是关系型数据库的结果模型,这样看起来有点抽象,在具体化其实就是数据库中的表。
M 是 Maping 缩写,具体指的是映射,将实体对象与数据库中的表建立映射关系。
现在有个问题,我们如何实现实体对象与数据库表建立映射关系。
假设有一个 User 实体类和一张 User 表,将 User 实体类和 User 表建立关系,需要借助 XML 或者注解来完成映射关系。至于 XML 和注解如何来实现,这是我们需要重点来学习掌握。
同时,在还要跟大家去说明一个实体,对应一张数据库表;一个对象对应数据库表中的一条记录。
因为一个 User 表中,可能会有多条记录。比如我们现在的 User 表中有 100 条记录。一个实体可以 new 出多个对象。
ORM 是一种思想,它会帮助我们跟踪实体的变化,把实体翻译成 SQL 脚本执行到数据库中。也就是将实体的变化映射到表的变化。
Mybatis 采用了 ORM 思想,解决了实体和数据库映射的问题,来对原始 JDBC 进行封装,屏蔽了 原始 JDBC API 底层访问细节,不用再与 JDBC API 来打交道,就可以完成对于数据库的一些持久化操作了。