概念

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技术的驱动程序,您甚至可以在异构环境中连接所有企业数据
更详细的官方文档:

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简介(一)的更多相关文章

  1. JDBC驱动程序注册 JDBC简介(二)

    使用JDBC进行数据库操作的第一步就是驱动注册(当然你得先导入JAR). 驱动注册有多种方式,第一步必然是获得正确的驱动名称与URL格式 驱动名称与URL格式 RDBMS 驱动程序名称        ...

  2. Mybatis配置信息浅析 MyBatis简介(二)

    官方文档入门篇中有明确说明 每个基于 MyBatis 的应用都是以一个 SqlSessionFactory 的实例为中心的. SqlSessionFactory 的实例可以通过 SqlSessionF ...

  3. Mybatis sql映射文件浅析 Mybatis简介(三)

    简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML为载体映射SQL 之前提到过,各项配置信息将Mybatis应用的整 ...

  4. Mybatis sql映射文件浅析 Mybatis简介(三) 简介

    Mybatis sql映射文件浅析 Mybatis简介(三)   简介 除了配置相关之外,另一个核心就是SQL映射,MyBatis 的真正强大也在于它的映射语句. Mybatis创建了一套规则以XML ...

  5. 理解JNDI中 java:comp/env/jdbc/datasource 与 jdbc/datasource 的不同之处(转)

    在描述JNDI,例如获得数据源时,JNDI地址有两种写法,例如同是  jdbc/testDS 数据源: A:java:comp/env/jdbc/testDS B:jdbc/testDS   这两种写 ...

  6. 【JDBC&Dbutils】JDBC&JDBC连接池&DBUtils使用方法(重要)

    -----------------------JDBC---------- 0.      db.properties文件 driver=com.mysql.jdbc.Driver url=jdbc: ...

  7. Unit01: JDBC原理 、 JDBC基础编程

    Unit01: JDBC原理 . JDBC基础编程 这个文件里面有两块内容: 1.用比较麻烦的方式连接数据库,test1(),test4() 2.创建DBTool,测试DBTool连接数据库 ,tes ...

  8. 通明讲JDBC(一)–认识JDBC

    本章记录了jdbc的简单使用方式! 0,jdbc的作用 1,jdbc入门准备工作 2,jdbc注册驱动 3,使用jdbc对数据库CRUD 0,jdbc的作用 与数据库建立连接.发送操作数据库的语句并处 ...

  9. oracle数据库连接问题org.springframework.jdbc.support.MetaDataAccessException: JDBC DatabaseMetaData method not implemented by JDBC driver - upgrade your driver...

    org.springframework.jdbc.support.MetaDataAccessException: JDBC DatabaseMetaData method not implement ...

随机推荐

  1. PHP常用日期加减计算方法实例

    PHP常用日期加减计算方法实例 实例总结了PHP常用日期加减计算方法.分享给大家供大家参考,具体如下: PHP 标准的日期格式 date("Y-m-d H:i:s"); PHP 简 ...

  2. Pycharm安装+python安装+环境配置

    Pycharm 工具: 1.安装jdk(64位):jdk-8u65-windows-x64.exe 路径:C:\Program Files\Java(默认路径) 2.配置环境 步骤一: 系统变量→新建 ...

  3. c#发送短息验证码

    <add key="WebReference.Service.PostUrl" value="http://106.ihuyi.cn/webservice/sms1 ...

  4. word文档最上面有一条不是页眉的线

    word2013文档最上面有一条不是页眉的线 在编辑Word文档时发现文档上面出现了一条实线,而且并非页眉,这里我采取了一个方式: 找到[设计]---[页面边框] 找到[边框和底纹]----[页面边框 ...

  5. 浏览器url地址殊字符转义编码

    网址URL中特殊字符转义编码字符    -    URL编码值 空格    -    %20"          -    %22#         -    %23%        -   ...

  6. Android进程间通信IPC

    一.IPC的说明 IPC是Inter-Process Communication的缩写,含义为进程间通信或跨进程通信,是指两个进程之间进行数据交换的过程. IPC不是Android独有的,任何一个操作 ...

  7. libevent入门介绍

    libevent是之前看到的一个别人推荐的清凉级网络库,我就想了解一下它.今天下载到了一个人写的剖析系列,从结构和源码方面进行了简要分析.只是这个分析文章是2010年的,有点过时了(跟现在的libev ...

  8. Linux一键安装宝塔控制面板

    Linux一键安装宝塔的命令行 yum install -y wget && wget -O install.sh http://download.bt.cn/install/inst ...

  9. Hadoop源码分析(1):HDFS读写过程解析

    一.文件的打开 1.1.客户端 HDFS打开一个文件,需要在客户端调用DistributedFileSystem.open(Path f, int bufferSize),其实现为: public F ...

  10. FFmpeg开发实战(五):FFmpeg 抽取音视频的视频数据

    如何使用FFmpeg抽取音视频的视频数据,代码如下: // FFmpegTest.cpp : 此文件包含 "main" 函数.程序执行将在此处开始并结束. // #include ...