请选择 进入手机版 | 继续访问电脑版

[JDBC] JDBC设计理念浅析 JDBC简介(一)

编程语言 编程语言 7079 人阅读 | 0 人回复

概念

JDBC是J2EE的标准规范之一,J2EE就是为了规范JAVA解决企业级应用开发制定的一系列规范,JDBC也不例外。

JDBC是用于Java编程语言和数据库之间的数据库无关连接的标准Java API。

换句话说,使用JAVA语言连接数据库进行操作,就需要使用JDBC API。

统一的JDBC API接口,屏蔽了底层数据库的细节,可以使用一致性的编码(跨数据库)对数据库进行操作。

通过JDBC将JAVA应用于数据库访问连接进行解耦,可以相互独立发展,又能够结合使用。

image.png

简言之,JDBC就是对于java编码来说,在应用程序和数据库之间的一个中间层 API

有了中间层JDBC,你就可以面向JDBC API进行编程,不需要关注底层数据库细节。

可以认为JDBC代理了对于数据库的操作与访问,也可以认为JDBC将数据库的访问适配成一致性的访问接口,也可以理解成JDBC是对数据库访问的一层封装

不管怎么理解,他就是那么一套API的存在。

官方文档:

https://www.oracle.com/technetwork/java/javase/jdbc/index.html

image.png

Java数据库连接(JDBC) API是Java编程语言和一系列SQL数据库以及其他表格数据源,比如电子表格或文本文件之间的一个数据库连接的行业标准。

JDBC API为基于sql的数据库访问提供了一个调用级API。

JDBC技术允许您使用Java编程语言为需要访问企业数据的应用程序开发“一次编写,到处运行”的功能。

使用启用JDBC技术的驱动程序,您甚至可以在异构环境中连接所有企业数据

更详细的官方文档:

https://www.oracle.com/technetwork/java/overview-141217.html

JDBC功能核心

数据库查询

下图为windows cmd登录MYSQL查询数据的过程,主要是三个步骤:

  • 连接数据库
  • 执行SQL
  • cmd打印结果

image.png

JDBC用于JAVA应用程序与数据库的连接访问,是应用程序与数据库的中间层

但是不管怎样,他仍旧是要操作数据库,所以也需要连接和查询

cmd 作为客户端进行查询时,仅仅将信息打印出来就好了,这就是对cmd对数据库结果的处理

JDBC需要为JAVA应用程序服务,需要将结果交付到应用程序中,所以JDBC还需要对返回的数据进行处理。

所以JDBC连接数据库进行查询也是大致三个步骤

  1. 连接数据库
  2. 执行SQL
  3. 处理返回结果

image.png

JDBC架构设计

JDBC主要包括两类接口:

  • 提供了一套纯粹的JAVA API给应用程序开发者
  • 提供了一套低级别的JDBC driver API给数据库驱动开发者

应用程序开发者借助于API用于开发可以访问数据库的程序;

驱动开发者借助于API进而提供服务到JDBC;

image.png

提供给数据库驱动开发者的API则正好是为了实现提供给应用程序开发者的这套API,这句话有些令人迷惑

JDBC是对数据库操作访问的薄层封装,应用程序开发者借助于JDBC可以实现对数据库的操作访问,但是,最终提供的服务仍旧是数据库

是具体的数据库实现了具体SQL的执行

所以JDBC提供给应用程序开发者的API就是开发者使用JDBC访问数据库的接口

而提供给数据库驱动开发者的API则恰恰是为了让数据库驱动开发者来提供服务

接口与实现分离,是一种桥接模式的思想(可以参阅本人的桥接模式的文章)

理解了桥接模式就可以很好的理解这种“面向接口”的编程思维,将接口与实现进行分离。

接口提供出来用于应用程序开发者使用,数据库或者工具厂商负责提供实现。

JDBC的接口与实现之间,通过Driver Manager 进行联结

JDBC API从Driver Manager获取服务,Driver Manager用来管理驱动程序,驱动程序可以很方便的注册到管理器中

image.png

本文作者:程序员潇然 疯狂的字节X https://crazybytex.com/

JDBC API

JDBC基本步骤有三个:连接、执行SQL、处理结果

另外还需要驱动管理器对注册的驱动程序进行管理

既然是代码,必然可能出现异常,所以还需要对相关异常进行处理

为了能够更好地将SQL类型数据映射到应用程序还提供了更丰富的映射

有的时候不仅仅是应用程序对数据库数据集进行检索,可能还需要数据库自身的相关信息(元数据 )

ps:数据是指普通文件中的实际数据,而元数据指用来描述一个文件的特征的系统数据,诸如访问权限、文件拥有者以及文件数据块的分布信息(inode...)等等。

在JAVA中一切皆为对象,所以这些所有的元素,都被抽象为对象

连接、语句、结果、映射、元数据、异常、驱动管理器

https://docs.oracle.com/javase/8/docs/technotes/guides/jdbc/

https://docs.oracle.com/javase/8/docs/api/java/sql/package-summary.html

官方相关介绍

What the java.sql Package Contains

The java.sql package contains API for the following:* Making a connection with a database via the DriverManager facility 通过驱动管理器工具与数据库建立连接

    • DriverManager class 类 -- makes a connection with a driver 与驱动程序建立连接
    • SQLPermission class 类-- provides permission when code running within a Security Manager, such as an applet, attempts to set up a logging stream through the DriverManager在安全管理器(如applet)中运行的代码试图通过驱动程序管理器设置日志流时,提供权限
    • Driver interface 接口 -- provides the API for registering and connecting drivers based on JDBC technology ("JDBC drivers"); generally used only by the DriverManager class提供基于JDBC技术的驱动程序注册和连接API(“JDBC驱动程序”);通常只被DriverManager类使用
    • DriverPropertyInfo class 类 -- provides properties for a JDBC driver; not used by the general user 为JDBC驱动程序提供属性;一般用户不使用
  • Sending SQL statements to a database 向数据库发送SQL语句
    • Statement -- used to send basic SQL statements 执行对象,用于发送基本的SQL语句
    • PreparedStatement -- used to send prepared statements or basic SQL statements (derived from Statement) 用于发送准备好的语句或基本SQL语句(从Statement派生)
    • CallableStatement -- used to call database stored procedures (derived from PreparedStatement) 用于调用数据库存储过程(从PreparedStatement 派生)
    • Connection interface 接口 -- provides methods for creating statements and managing connections and their properties 提供用于创建语句和管理连接及其属性的方法
    • Savepoint -- provides savepoints in a transaction 在事务中提供Savepoint保存点
  • Retrieving and updating the results of a query 检索和更新查询的结果
    • ResultSet interface 接口
  • Standard mappings for SQL types to classes and interfaces in the Java programming language SQL类型到Java编程语言中的类和接口的标准映射
    • Array interface 接口-- mapping for SQL ARRAY   SQL ARRAY映射
    • Blob interface 接口-- mapping for SQL BLOB     SQL BLOB映射
    • Clob interface接口 -- mapping for SQL CLOB     SQL CLOB 映射
    • Date class 类-- mapping for SQL DATE
    • NClob interface 接口 -- mapping for SQL NCLOB
    • Ref interface 接口-- mapping for SQL REF
    • RowId interface 接口-- mapping for SQL ROWID
    • Struct interface 接口-- mapping for SQL STRUCT
    • SQLXML interface 接口-- mapping for SQL XML
    • Time class 类-- mapping for SQL TIME
    • Timestamp class 类-- mapping for SQL TIMESTAMP
    • Types class 类-- provides constants for SQL types 为SQL类型提供常量
  • Custom mapping an SQL user-defined type (UDT) to a class in the Java programming language 自定义将SQL用户定义类型(UDT)映射到Java编程语言中的类
    • SQLData interface -- specifies the mapping of a UDT to an instance of this class 指定UDT到该类实例的映射
    • SQLInput interface -- provides methods for reading UDT attributes from a stream 提供从流中读取UDT属性的方法
    • SQLOutput interface -- provides methods for writing UDT attributes back to a stream 提供将UDT属性写回流的方法
  • Metadata 元数据
    • DatabaseMetaData interface -- provides information about the database 提供有关数据库的信息
    • ResultSetMetaData interface -- provides information about the columns of a ResultSet object 提供有关ResultSet对象的列的信息
    • ParameterMetaData interface -- provides information about the parameters to PreparedStatement commands 为PreparedStatement命令提供有关参数的信息
  • Exceptions 异常
    • <strong>SQLException</strong> -- thrown by most methods when there is a problem accessing data and by some methods for other reasons 当访问数据存在问题时大多数方法都会抛出这个异常,还有一些方法是其他原因抛出这个异常。
    • <strong>SQLWarning</strong> -- thrown to indicate a warning 抛出以表示警告
    • <strong>DataTruncation</strong> -- thrown to indicate that data may have been truncated 抛出以指示数据可能已被截断
    • <strong>BatchUpdateException</strong> -- thrown to indicate that not all commands in a batch update executed successfully 抛出以指示批处理更新中并非所有命令都已成功执行

核心

image.png

本文作者:程序员潇然 疯狂的字节X https://crazybytex.com/

驱动管理器

DriverManager 管理一组JDBC驱动程序的基本服务。

连接

Connection 与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。

执行对象

Statement 用于执行静态 SQL 语句并返回它所生成结果的对象。

结果集

ResultSet 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。

一般流程

image.png

第一个JDBC示例

准备

以MYSQL为例,需要MYSQL驱动

image.png

数据库表、数据准备,本地安装了MYSQL,有数据库sampledb,内有表student,内容如下图

image.png

导包

比如在IDEA中,我的操作如下

image.png

示例代码

此示例代码只为最基本查询,并不完善

package jdbc.jdbc;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
/**
* 第一个JDBC
* @author noteless
*/
public class FirstJDBC {
public static void main(String[] args) throws Exception {
    //1、注册驱动
    Class.forName("com.mysql.jdbc.Driver");
    //数据库连接所需参数
    String user = "root";
    String password = "123456";
    String url = "jdbc:mysql://localhost:3306/sampledb?useUnicode=true&characterEncoding=utf-8";
    //2、获取连接对象
    Connection conn = DriverManager.getConnection(url, user, password);
    //设置sql语句
    String sql = "select * from student";
    //3、获得sql语句执行对象
    Statement stmt = conn.createStatement();
    //4、执行sql并保存结果集
    ResultSet rs = stmt.executeQuery(sql);
    //5、处理结果集
    while (rs.next()) {
        System.out.print("id:" + rs.getInt(1));
        System.out.print(",姓名:" + rs.getString(2));
        System.out.print(",年龄:" + rs.getInt(3));
        System.out.println(",性别:" + rs.getString(4));
    }
    //6、资源关闭
    rs.close();
    stmt.close();
    conn.close();
}
}

结果

image.png

总结

JDBC就是JAVA语言开发需要连接数据库的应用程序 ,所需要使用的JAVA API

提供了数据库驱动程序的管理,连接,语句执行,以及结果返回等工作,是应用程序与数据库之间的薄层封装

JDBC的理念遵循依赖倒置原则,面向抽象进行编程,通过桥接模式将抽象与实现继续分离

即保证了应用程序开发者通过JDBC对数据库访问操作的一致性,又可以使得数据库独立发展

通过驱动管理器驱动程序可以方便的注册进来进而通过JDBC提供服务。

JDBC简化了对数据库访问操作的复杂度,屏蔽了应用程序对底层数据库的依赖,将数据库的操作访问过程进行抽象分步,只需要按照既有的模块化流程就可以完成操作。

JDBC的核心内容就是与数据库建立连接,发送SQL语句,处理结果。

common_log.png 转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-168-1-1.html

关注下面的标签,发现更多相似文章
    黄小斜学Java

    疯狂的字节X

  • 目前专注于分享Java领域干货,公众号同步更新。原创以及收集整理,把最好的留下。
    包括但不限于JVM、计算机科学、算法、数据库、分布式、Spring全家桶、微服务、高并发、Docker容器、ELK、大数据等相关知识,一起进步,一起成长。
热门推荐
海康摄像头接入 wvp-GB28181-pro平台测试验
[md]### 简介 开箱即用的28181协议视频平台 `https://github.c
[若依]微服务springcloud版新建增添加一个
[md]若依框架是一个比较出名的后台管理系统,有多个不同版本。
[CXX1300] CMake '3.18.1' was not
[md][CXX1300] CMake '3.18.1' was not found in SDK, PATH, or