Java 数据库访问技术概述

前言

前面我们已经写了一个 SpringBoot 版本的 hello word 程序。这只是显示了 SpringBoot 强大功能的冰山一角,实际情况当然远比这个样例复杂。在我们的应用中,一个最常见的功能就是对关系数据库数据的存取。下面一些列文章主要讲述在 SpringBoot 中如何和数据库进行交互。在这之前,我们有必要聊一聊 Java 数据库访问相关的技术。

Java 数据库访问技术概述

JDBC

JDBC 的英文是 Java DataBase Connectivity 。它是 Java 原生的数据库访问技术。JDBC 是 Java 的发明者 SUN 提出的访问数据库的规范接口。它由一组 Java 访问数据的类和接口组成。每种数据库按照这个规范来实现该数据的数据库驱动程序。通过这种方式,无论存储数据的实际数据库是 Oracle、MySQL、MS SQLServer 还是其他的关系型数据库,我们都可以在一份代码里,通过配置的方式加载不同的数据库驱动程序,访问不同的数据库数据。配合标准的 SQL 语句,已经编写好的 Java 程序几乎可以在不修改任何代码的情况下无缝的切换后端的数据库类型。这个方式极大的提高了 Java 应用程序的应用范围。

JDBC 技术提供了访问数据库的基础能力。在实际使用的过程中,还是非常繁琐的。按照一般的过程,采用 JDBC 访问数据库要经过一下几个步骤

  1. 加载选择的数据库驱动程序类
  2. 通过数据库连接字符串和可选的用户名密码获取数据库连接
  3. 成功获取数据库连接后,在数据库连接上根据情况创建某种类型的 Statement
  4. 根据情况在 Statement 上执行 SQL语句。如果是查询,返回查询的 ResultSet 对象
  5. 如果是查询数据的操作,则遍历 ResultSet 对象,逐行取出里面每一列的数据。
  6. 如果是查询数据的操作,关闭 ResultSet 对象
  7. 关闭数据库连接对象

JDBC 是 Java 里面数据库访问的基础,其他的 ORM 、JPA 等 Java 的数据库访问技术都是以 JDBC 技术为基础的。

JDBC 技术存在的问题

从上面 JDBC 使用的过程描述中我们可以看出,原生的 JDBC 的数据库访问方式存在这下面几个问题

  1. 建立数据库连接是个系统开销很大的操作系统,每次使用都要建立、释放,这个效率非常低下
  2. 大量的操作都是在建立数据库连接,释放连接这种准备工作上。
  3. 使用的过程是以数据库的表为视图,按照记录集行和列的概念操作数据,但是 Java 是面向对象的语言,在程序中,一般都是对象的操作。这两种视图的转换要人工来完成,不符合程序员的思维,也比较低效。

对于这些存在的问题,Java 又发展出几种技术来解决。

数据库连接池

鉴于建立一次数据库连接的系统开销非常大,建立连接的速度较慢的问题,开发者自然就想到了是否可以将建立的连接长期保持,重复使用的方案。这就是数据库连接池的基本思想。

Java 用一个 javax.sql.DataSource 接口来定义数据库连接池的实现,它只有两个需要实现的方法。都是用来从连接池中获取数据库连接的。

Connection getConnection() throws SQLException;

Connection getConnection(String username, String password) throws SQLException;

Java 数据库连接池的实现有很多。例如 C3P0、DBCP、Tomcat Jdbc Pool、BoneCP、Druid 等。

一般来说,一个实现良好的数据库连接池产品应该具备下面的特性

  1. 多路连接复用。在连接池中保持多个数据库连接,一个或者多个线程需要使用连接的时候能够马上获得连接,并且尽量减少多线程竞争的冲突。
  2. 连接中断检测。如果连接池中的一个或者多个连接中断,在使用前应该有检测机制,避免让程序使用中断的连接导致程序故障
  3. 容量控制。要在连接池中动态的保持合理数量的数据库连接,减少临时建立连接的情况,也不能无限制的新建连接导致系统资源耗尽。

现在在开发 Java 数据库相关的程序的时候,基本上大家都在使用数据库连接池的方式来管理数据库连接。

ORM

有了 JDBC 后,Java 程序员已经可以容易的对数据库进行操作了。但是这个操作的方式让很多的 Java 程序员并不满意,因为 Java 是面向对象的开发语言,大家的思维都是面向对象的。而到了 JDBC 这里后,程序员需要将对象转换成为 SQL 语句来执行。这个过程对很多人来说是非常别扭不可接受的。他们希望用对象的方式来操作数据库。这就要求有一个方式能做自动的做 Java 的对象和数据库对象之间的映射。这个方式就是 ORM。

Object-Relation Mapping 用来把对象模型表示的对象映射到基于S Q L 的关系模型数据库结构中去。这样,我们在具体的操作实体对象的时候,就不需要再去和复杂的 SQ L 语句打交道,只需简单的操作实体对象的属性和方法。

Java 里面比较著名的 ORM 框架有 Hibernate、MyBatis 等。

JPA

JPA 就是 Java Persistence API,它 的主要目标之一就是提供更加简单的编程模型。因为各个 ORM 框架的流行,SUN 老大一看,各个 ORM 框架的使用都不一样,觉得有必要统一 ORM 技术,简化Java 开发,所以就推出了 JPA 规范。类似于 JDBC 统一了 Java 中访问数据库的底层 Api 一样,JPA 的目标就是让程序员用统一的方式来使用多个不同的 ORM 框架。

JPA 也有很多的实现,包括 Hibernate、Spring、OpenJPA。

后记

后面我将用三篇文章分别来说明在 SpringBoot 中使用 JDBC、MyBatis、Spring Data JPA 方式来访问数据库的样例。

你可能感兴趣的:(Java 数据库访问技术概述)