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查询数据的过程,主要是三个步骤:
JDBC用于JAVA应用程序与数据库的连接访问,是应用程序与数据库的中间层
但是不管怎样,他仍旧是要操作数据库,所以也需要连接和查询
cmd 作为客户端进行查询时,仅仅将信息打印出来就好了,这就是对cmd对数据库结果的处理
JDBC需要为JAVA应用程序服务,需要将结果交付到应用程序中,所以JDBC还需要对返回的数据进行处理。
所以JDBC连接数据库进行查询也是大致三个步骤
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 检索和更新查询的结果
-
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语句,处理结果。