一文捋清从DBMS到JDBC、驱动、Spring Data JPA、MyBatis的java操作数据库历史(概念篇)

186 阅读5分钟

1 数据库和数据库管理系统

数据库(DB)是结构化信息或数据的有序集合,一般以电子形式存储在计算机系统中。(来源于oracle官网)简单理解就是电脑上的一些存放数据的仓库,比如说学校里所有学生的信息,它们可以构成一个学生信息数据库。

假如我们想更改某个学生的信息,我们并不直接访问数据库,而是通过数据库管理系统(DBMS)来访问。这就是人、数据库、数据库管理系统的关系:人通过DBMS管理DB。

image.png

MySQL就是一个数据库管理系统,它使用“关系模型”来存储数据,进一步说MySQL是一个关系型数据库管理系统(RDBMS)

有的文章可能会称呼MySQL为关系数据库,其实这是一种省略说法,要注意MySQL不是数据库!!它是数据库管理系统,用来帮我们操作数据库!!

2 MySQL,MySQL server,MySQL workbench

当我们去官网下载MySQL时,会得到这三个组件,然而它们三者是全然不同的概念:

  • mysql是RDBMS的总称,包括客户端工具和服务器。
  • mysql server是mysql的核心组件,负责处理数据的存储、查询和管理。它是一个后台服务程序,运行在本地或远程服务器上。如果我们将mysql看作是一家负责连接你和数据库的中介公司,那mysql server就是负责接待你的前台。
  • 我们想对数据库进行操作,实际上是通过mysql server操作的。有两种方法与mysql server交互:直接使用终端中的命令行工具mysql,或使用GUI工具workbench,更直观地操作。

三个组件区别如下: image.png

3 其他

  1. 看本地mysql版本 mysql --version
  2. navicat是一个数据库管理工具,作用类似于mysql workbench。主要功能是用图形化界面代替手写命令行,让管理数据库变更简单、更直观。
  3. 除了MySQL这个DBMS,还有其他各种数据库管理系统,比如Oracle,DB2,PostgreSQL,SQL server等等。

4 JDBC是什么,为什么需要JDBC,驱动

我们可以使用SQL语言,通过命令行工具或者GUI工具来与数据库管理系统交互,从而达到操作数据库的目的。

通过JDBC,我们可以使用java语言与数据库管理系统交互,从而操作数据库。

JDBC(Java DataBase Connectivity)是sun公司定义的一套用于操作所有关系型数据库的接口,本质是一套API。不同的数据库厂商(如MySQL,Oracle,DB2)去实现这套接口,这些实现类打包成一个jar包,就叫做驱动

image.png

有了JDBC,开发人员可以用同一套Java代码,操作不同的关系型数据库。并且当底层数据库更换时,访问数据库的java代码基本不变。

从上面可以知道,mysql驱动,其实就是mysql厂商实现的JDBC接口的一套实现类,这些实现类打包成一个jar包,就叫做mysql驱动。

所以我们去mysql官网下载mysql驱动,下载的是一个mysql-connector-java-xxx.jar格式的jar包。

5 JPA的出现

在JPA出现之前,开发者需要使用传统的JDBC手动写大量SQL语句,处理复杂的数据库连接、查询等等,这种方式繁杂、容易出错,代码重复率高,维护也很麻烦。

那时已经出现了Hibernate这种流行的ORM框架,Hibernate把java对象和数据库关联起来,简化了数据库操作。它的成功让Java社区意识到,开发者需要一个标准化的方式来处理数据库操作。所以Sun公司参考了Hibernate等框架的设计,制定了JPA规范。

JPA的设计借鉴了Hibernate,Hibernate反过来实现JPA。这个我们稍后再说。

JPA(Java Persistence API)本质也是一组API(Sun公司作为行业大牛只制定接口),定义了一组标准接口,比如EntityManager,EntityTransaction等,规定了开发者应该如何操作数据,但不提供具体的功能实现。

JPA需要一个具体的实现才能工作,比如Hibernate、EclipseLink、OpenJPA等。

直观理解JPA的好处:假设我们想通过java代码往一张user表里插入用户的id、name和email信息,使用JPA来插入、查询数据,不需要开发者写任何sql语句:

  1. 定义java实体类
  2. 在配置文件中配置数据库连接
  3. 使用JPA提供的接口操作数据库

6 Sprig Data JPA

要在SpringBoot项目中使用JPA,我们需要使用spring-boot-starter-data-jpa依赖,由于Spring Boot默认集成了Spring Data JPA,所以默认使用的是Spring Data JPA。

它不是JPA的实现,而是基于JPA的进一步封装,提供了更加简洁的接口,减少了很多样板代码,你只需定义接口就能实现CRUD操作。Spring Data JPA的默认实现是Hibernate,你也可以换成其他JPA Provider。

image.png

7 MyBatis

上面我们说了,JPA是为了简化JDBC操作数据库而产生的,使用的设计思想借鉴了Hibernate的ORM框架。但是简化JDBC操作数据库,难道只有ORM框架一种吗?当然不是,JDBC写各种模板代码麻烦,写各种重复SQL麻烦,那把SQL绑定到特定java方法上,不就不用写那么多重复sql了吗?这就是SQL映射框架,不同于ORM框架。

所以MyBatis和JPA的关系就是没有关系!!为了同一个目的,但是全然不同的实现方式!

8 串联起来

image.png

参考资料:

  1. Java持久化详解:cloud.tencent.com/developer/a…
  2. Spring Data JPA操作数据库:blog.csdn.net/pengjunlee/…
  3. blog.csdn.net/JavaMonster…