一、简介

在Web开发中,不可避免地使用数据库来存储和管理数据。为了在Java语言中提供对数据库访问的支持,SUN公司于1996年提供一套访问数据库的标准Java类库,即 JDBC。

二、什么是JDBC?

JDBC 的全称是Java数据库连接(Java Database Connectivity),它是一套用于执行SQL语句的 Java API。
应用程序可以通过这套API连接到关系型数据库,并使用SQL语句来完成对数据库中的数据查询、更新、新增、和删除的操作。
不同种类的数据库(如:MySQL、Oracle等) 在其内部处理数据的方式是不同的。如果直接使用数据库厂商提供的访问接口操作数据库,应用程序的可移植性就会变得很差。
例如:用户当前在程序中使用的MySQL提供的接口操作数据库,如果换成Oracle数据库,则需要重新使用Oracle提供的接口,这样代码的改动量非常大。有了JDBC后,这种情况就不复存在了,因为它要求各个数据库厂商按照统一的规范来提供数据库驱动,而在程序中是由 JDBC 和具体的数据驱动联系所以用户就不必直接与底层的数据库交互,这使得代码的通用性更强。
应用程序使用 JDBC 访问数据库的方式如图 9-1 所示。
IMG20211119164210_BURST000_COVER.jpg

三、JDBC 常用的 API

首先了解一下 JDBC 常用的API 。JDBC API 主要位于 java.sql 包中,该包定义了一系列访问数据库的接口和类。

3.1、Driver 接口

Drive 接口 是 所有 JDBC 驱动程序必须实现的接口,该接口专门提供给数据库厂商使用。需要注意的是,在编写 JDBC 程序时,必须要把所使用的数据库驱动程序或类库 加载到项目的 classpath 中 (这里指Mysql 驱动 jar 包)

3.2、DriverManager 类

DriveManager 类用于加载 JDBC 驱动并且创建与数据库的连接。在DriverManager 类中,定义了两个比较重要的静态方法。

方法名称 功能描述
registerDriver(Driver driver) 该方法用于向DriverManager中注册给定的JDBC驱动程序
getConnection(String url, String user, String pwd ) 该方法用于建立和数据库的连接,并返回表示连接的Connetion对象

3.3、Connection 接口

Connection接口 代表Java程序和数据库的连接,只有获得该连接对象后

方法名称 功能描述
getMetaData() 该方法用于返回表示数据库的元数据的DatabaseMetaData对象
createStatement() 用于创建一个Statement对象并将SQL语句发送到数据库
prepareStatement(String sql) 用于创建一个PreparedStatement对象并将参数化的SQL语句发送到数据库
prepareCall(String sql ) 用于创建一个CallableStatement对象来调用数据库的存储过程

3.4、Statement 接口

Statement接口 用于执行静态的 SQL语句,并返回一个结果对象,该接口的对象通过Connection 实例的createStatement()方法获得。利用该对象把静态的SQL语句发送到数据库编译执行,然后返回数据库的处理结果。在Statement接口中,提供了3个常用的执行SQL语句的方法,具体如下:

方法名称 功能描述
execute(String sql) 用于执行各种SQL语句,该方法返回一个Boolean类型的值,如果为true,表示所执行的SQL语句有查询结果,可通过Statement的getResultSet()方法获得查询结果
executeUpdate(String sql) 用于执行SQL中的insert、update、和delete语句。该方法返回一个int 类型的值,表示数据库中受该SQL语句影响的记录条数
executeQuery(String sql) 用于执行SQL中的select 语句,该方法返回一个表示查询结果的ResultSet对象

3.5、PreparedStatement 接口

Statement接口封装了 JDBC 执行SQL语句的方法,可以完成Java程序执行SQL语句的操作。然而,在实际开发过程中往往需要将Java程序中的变量作为SQL语句的查询条件,而使用Statement接口操作这些SQL语句会过于繁琐,并且存在安全方面的问题。
针对这一问题,JDBC API 提供了扩展的PreparedStatement接口。该接口是Statement 接口的子接口,用于执行预编译的SQL语句。该接口扩展了带有参数SQL语句的执行操作,应用该接口中的SQL语句可以使用占位符“?”来代替其参数,然后通过setXxx()方法为SQL语句的参数赋值。在PreparedStatement 接口 中,提供了一些常用方法,具体如下:

方法名称 功能描述
executeUpdate() 在此PreparedStatement对象中执行SQL语句,该语句必须是一个DML语句或者是无返回内容的SQL语句,比如 DDL 语句
executeQuery() 在此PreparedStatement对象中执行SQL查询,该方法返回的是ResultSet对象
setInt(int parameterIndex, int x) 将指定参数设置为给定的int 值
setFlloat(int parameterIndex, float x) 将指定参数设置为给定的 float 值
setString(int parameterIndex, String x) 将指定参数设置为给定的 string 值
setDate(int parameterIndex, Date x) 将指定参数设置为给定的 date 值
addBatch() 将一组参数添加到此PreparedStatement 对象的批处理命令中
setCharacterStream(int parameterIndex, java.io.Reader reader, int length) 将指定的输入流写入数据库的文本字段
setBinaryStream(int parameterIndex, java.io.inputStream x, int length) 将二进制的输入流数据写入到二进制字段中

需要注意的是表中的Date 的类型是 Java.sql.Date ,而不是java.util.Date。

3.6、ResultSet 接口

ResultSet 接口用于保存 JDBC 执行查询时返回的结果集,该结果集封装在一个逻辑表格中。在ResultSet 接口内部有一个指向表格数据行的游标(或指针),ResultSet对象初始化时,游标在表格的第 1 行 之前,调用next()方法可将游标移动到下一行。如果下一行没有数据,则返回false 。在应用程序中经常使用next() 方法作为While循环的条件来迭代ResultSet结果集。
ResultSet 接口中的常用方法如表:

方法名称 功能描述
getString(String columnName) 用于获取指定字段的int类型的值,参数columnName代表字段的名称
getDate(int columnIndex) 用于获取指定字段的date类型的值,参数columnIndex代表字段的索引
getDate(String columnName) 用于获取指定字段的date类型的值,参数columnName代表字段的名称
next() 将游标从当前位置向下移一行
absolute( int row) 将游标移动到此 ResultSet 对象的指定行
afterLast() 将游标移动到此 ResultSet 对象的末尾,即最后一行
beforeLast() 将游标移动到此 ResultSet 对象的开头,即第一行 之前
previous() 将游标移动到此 ResultSet 对象的上一行
last() 将游标移动到此 ResultSet 对象的最后一行