JDBC设计理念浅析 JDBC简介(一)
### 概念**JDBC是J2EE的标准规范之一,J2EE就是为了规范JAVA解决企业级应用开发制定的一系列规范,JDBC也不例外。**
JDBC是用于Java编程语言和数据库之间的数据库无关连接的标准Java API。
换句话说,使用JAVA语言连接数据库进行操作,就需要使用JDBC API。
统一的JDBC API接口,屏蔽了底层数据库的细节,可以使用一致性的编码(跨数据库)对数据库进行操作。
通过JDBC将JAVA应用于数据库访问连接进行解耦,可以相互独立发展,又能够结合使用。
!(data/attachment/forum/202208/27/162615qqj58qrl0vntrjtl.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
简言之,**JDBC就是对于java编码来说,在应用程序和数据库之间的一个中间层 API**
**有了中间层JDBC,你就可以面向JDBC API进行编程,不需要关注底层数据库细节。**
可以认为JDBC代理了对于数据库的操作与访问,也可以认为JDBC将数据库的访问适配成一致性的访问接口,也可以理解成JDBC是对数据库访问的一层封装
不管怎么理解,他就是那么一套API的存在。
官方文档:
`https://www.oracle.com/technetwork/java/javase/jdbc/index.html`
!(data/attachment/forum/202208/27/162656tmxhfftfwstss67h.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "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打印结果
!(data/attachment/forum/202208/27/162745candzmmeejiaiggd.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
JDBC用于JAVA应用程序与数据库的连接访问,是应用程序与数据库的中间层
但是不管怎样,他仍旧是要操作数据库,所以也需要连接和查询
cmd 作为客户端进行查询时,仅仅将信息打印出来就好了,这就是对cmd对数据库结果的处理
JDBC需要为JAVA应用程序服务,需要将结果交付到应用程序中,所以JDBC还需要对返回的数据进行处理。
所以JDBC连接数据库进行查询也是大致三个步骤
1. 连接数据库
2. 执行SQL
3. 处理返回结果
!(data/attachment/forum/202208/27/162805hdnzi4ynlvtty9sy.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
### JDBC架构设计
JDBC主要包括两类接口:
* 提供了一套纯粹的JAVA API给应用程序开发者
* 提供了一套低级别的JDBC driver API给数据库驱动开发者
**应用程序开发者借助于API用于开发可以访问数据库的程序;**
**驱动开发者借助于API进而提供服务到JDBC;**
!(data/attachment/forum/202208/27/162818ypq4tuqn8fqvu4cl.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
而**提供给数据库驱动开发者的API则正好是为了实现提供给应用程序开发者的这套API**,这句话有些令人迷惑
JDBC是对数据库操作访问的薄层封装,应用程序开发者借助于JDBC可以实现对数据库的操作访问,但是,最终提供的服务仍旧是数据库
是具体的数据库实现了具体SQL的执行
**所以JDBC提供给应用程序开发者的API就是开发者使用JDBC访问数据库的接口**
**而提供给数据库驱动开发者的API则恰恰是为了让数据库驱动开发者来提供服务**
接口与实现分离,是一种桥接模式的思想(可以参阅本人的桥接模式的文章)
理解了桥接模式就可以很好的理解这种“面向接口”的编程思维,将接口与实现进行分离。
接口提供出来用于应用程序开发者使用,数据库或者工具厂商负责提供实现。
JDBC的接口与实现之间,通过Driver Manager 进行联结
JDBC API从Driver Manager获取服务,Driver Manager用来管理驱动程序,驱动程序可以很方便的注册到管理器中
!(data/attachment/forum/202208/27/162831p8wjjmxojspjj5im.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "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抛出以指示批处理更新中并非所有命令都已成功执行
#### 核心
!(data/attachment/forum/202208/27/162926f9gk9c69d97ggkdv.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
`本文作者:程序员潇然 疯狂的字节X https://crazybytex.com/`
**驱动管理器**
DriverManager 管理一组JDBC驱动程序的基本服务。
**连接**
Connection 与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果。
**执行对象**
Statement用于执行静态 SQL 语句并返回它所生成结果的对象。
**结果集**
ResultSet 表示数据库结果集的数据表,通常通过执行查询数据库的语句生成。
#### 一般流程
!(data/attachment/forum/202208/27/162944y8pplpzcpaceecsp.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
### 第一个JDBC示例
#### 准备
以MYSQL为例,需要MYSQL驱动
!(data/attachment/forum/202208/27/162956qoj5ymw5w5bj45mh.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
数据库表、数据准备,本地安装了MYSQL,有数据库sampledb,内有表student,内容如下图
!(data/attachment/forum/202208/27/163007irr0ro22av1uuzm4.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
#### 导包
比如在IDEA中,我的操作如下
!(data/attachment/forum/202208/27/163026iftqmxnnkgqetjxw.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
#### 示例代码
此示例代码只为最基本查询,并不完善
```java
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();
}
}
```
#### 结果
!(data/attachment/forum/202208/27/163102k3orw995fdkj95ff.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "image.png")
### 总结
JDBC就是JAVA语言开发需要连接数据库的应用程序 ,所需要使用的JAVA API
提供了数据库驱动程序的管理,连接,语句执行,以及结果返回等工作,是应用程序与数据库之间的薄层封装
**JDBC的理念遵循依赖倒置原则,面向抽象进行编程,通过桥接模式将抽象与实现继续分离**
即保证了应用程序开发者通过JDBC对数据库访问操作的一致性,又可以使得数据库独立发展
通过驱动管理器驱动程序可以方便的注册进来进而通过JDBC提供服务。
JDBC简化了对数据库访问操作的复杂度,屏蔽了应用程序对底层数据库的依赖,将数据库的操作访问过程进行抽象分步,只需要按照既有的模块化流程就可以完成操作。
JDBC的核心内容就是与数据库建立连接,发送SQL语句,处理结果。
!(data/attachment/forum/202206/16/141330jha7st9soow8772i.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/300 "common_log.png")
`转载务必注明出处:程序员潇然,疯狂的字节X,https://crazybytex.com/thread-168-1-1.html `
页:
[1]