专栏首页notelessJDBC设计理念浅析 JDBC简介(一)

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

概念

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

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

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

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

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

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

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

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

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

官方文档:

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

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打印结果

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

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

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

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

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

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

JDBC架构设计

JDBC主要包括两类接口:

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

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

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

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

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

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

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

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

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

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

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

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

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

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   异常
    • SQLException -- thrown by most methods when there is a problem accessing data and by some methods for other reasons   当访问数据存在问题时大多数方法都会抛出这个异常,还有一些方法是其他原因抛出这个异常。
    • SQLWarning -- thrown to indicate a warning   抛出以表示警告
    • DataTruncation -- thrown to indicate that data may have been truncated  抛出以指示数据可能已被截断
    • BatchUpdateException -- thrown to indicate that not all commands in a batch update executed successfully  抛出以指示批处理更新中并非所有命令都已成功执行

核心

驱动管理器

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

连接

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

执行对象

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

结果集

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

一般流程

第一个JDBC示例

准备

以MYSQL为例,需要MYSQL驱动

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

导包

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

示例代码

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

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();
}
}

结果

总结

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

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

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

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

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

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

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

 原文地址:JDBC设计理念浅析 JDBC简介(一)

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • JDBC与ORM发展与联系 JDBC简介(九)

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访...

    noteless
  • java continue break 关键字 详解 区别 用法 标记 标签 使用 示例 联系

    java continue break 关键字 详解 区别  用法 标记  标签 使用 示例 联系   跳出循环 带标签的continue和break 嵌套循环...

    noteless
  • [八]基础数据类型之Double详解

    这些属性,看过浮点数简介的话,可以很清晰的理解,再次说明下,但凡本人的系列文章,全部都是有顺序的

    noteless
  • 2019面试题:谈谈对JDBC的理解(最简洁!)

    JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API(Application Pro...

    葆宁
  • Java面试手册:JDBC

    南风
  • JDBC编程

    前面我们已经讨论了数据库的安装和简单的使用,还没完成的可以先去Mysql的安装和Mysql数据库的简单操作回顾一下哦!今天我们来简单学习JDBC编程的准备和链...

    企鹅号小编
  • 为了给你们讲清楚数据库中间件有哪些,我也是拼了!

    卖羊肉串首先就得有羊肉,于是我就联系了很多养殖场,我又是一个比较负责任的人,为了保证羊肉的质量,我就去考察了一家又一家养殖场,同时我也是个“小气”的人,所以我考...

    Java技术江湖
  • 利用PowerDesigner连接Mysql数据库并逆向所有表关系图【两种方式】

    最近需要梳理公司的一个项目,四年多的了。看代码、dubbo、消息队列……哎妈呀,那个头大啊。想想还是从数据库入手吧。于是想到了在2015年还是2016年的时候在...

    凯哥Java
  • 到底该不该使用存储过程

    看到《阿里巴巴java编码规范》有这样一条 ? 关于这条规范,我说说我个人的看法 我觉得用不用存储过程要视所使用的数据库和业务场景而定的,不能因为阿里巴巴的技术...

    用户1608022
  • java数据库操作 (附带数据库连接池的代码)

    本文来自:曹胜欢博客专栏。转载请注明出处:http://blog.csdn.net/csh624366188

    bear_fish

扫码关注云+社区

领取腾讯云代金券