一、简介
在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 所示。
三、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 对象的最后一行 |