目录
1. 什么是JDBC
现在的应用系统大多数都离不开数据库,Java 程序访问数据库的基本实现方式是通过 JDBC。JDBC(Java DataBase Connectivity,Java 数据库连接)技术的简称,是一种用于执行 SQL 语句的 Java API。 它由一组用 Java 编写的类和接口组成。这个 API 由 java.sql.* 包中的一些类和接口组成,它为数据库开发人员提供了一个标准的 API,使他们能够用纯 Java API 来编写数据库应用程序。
注意:使用 JDBC 访问数据库需要相应数据库的 JDBC 驱动程序。
2. JDBC工作原理
JDBC 为多种关系型数据库提供了统一的访问方式,作为特定厂商数据库访问 API 的一种高级抽象,它主要包含一些通用的接口类。真正的数据库访问操作是有各自数据库厂商提供的。通常把厂商提供的特定用于数据库的访问 API 称为数据库 JDBC 驱动程序。
JDBC 通过特定抽象的数据库接口,使得程序开发人员在编程时可以不用绑定在特定数据库厂商的 API 上,大大增加了应用程序的可移植性。在实际运行过程中程序代码通过 JDBC 访问数据库时,仍需要调用特定数据库的访问 API。
3. JDBC使用步骤
3.1 JDBC工作流程
- 加载JDBC驱动程序
- 建立数据库链接
- 创建操作命令
- 执行 SQL 语句
- 处理结果集
- 释放资源
3.2 基于MySQL的JDBC开发案例
准备数据库驱动包(比如:MySQL数据库驱动包)
加载JDBC驱动
Class.forName("com.mysql.jdbc.Driver");
建立数据库连接
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/memo?user=root&password=xyxy&useUnicode=true&characterEncoding=UTF-8");
MySQL数据库连接的URL参数格式如下:
jdbc:mysql://服务器地址:端口号/数据库名?参数名=参数值
创建操作命令(statement)
Statement statement = connection.createStatement();
执行SQL语句
ResultSet resultSet = statement.executeQuery("select (id, name, created_time, modify_time) from memo_group");
处理结果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
Date createdTime = resultSet.getDate("created_time");
Date modifyTime = resultSet.getDate("modify_time");
System.out.println(String.format("MemoGroup: id=%d, name=%s, createdTime=%s, modifyTime=%s", id, name, createdTime.toString(), modifyTime.toString()));
}
释放资源(关闭结果集、命令、连接)
// 关闭结果集
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 关闭命令
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 关闭连接
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
完整代码:
import java.sql.*;
import java.util.Date;
/**
* @author: LiuWang
* @data: 2018/9/4 8:52
*/
public class MemoApplication {
private static Connection connection;
private static ResultSet resultSet;
private static Statement statement;
public static void main(String[] args) {
try {
// 加载数据库驱动
Class.forName("com.mysql.jdbc.Driver");
// 建立连接
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/memo?" +
"user=root&password=xyxy&useUnicode=true&characterEncoding=UTF-8");
// 创建命令
statement = connection.createStatement();
// 执行 SQL
resultSet = statement.executeQuery("select id, name, created_time," +
"modify_time from memo_group");
// 处理结果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
Date createdTime = resultSet.getDate("created_time");
Date modifyTime = resultSet.getDate("modify_time");
System.out.println(String.format("MemoGroup: id=%d, name=%s, createdTime=%s, " +
"modifyTime=%s", id, name, createdTime.toString(), modifyTime.toString()));
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭结果集
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 关闭命令
if (statement != null) {
try {
statement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
// 关闭连接
if (connection != null) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
4. JDBC常用的接口和类
4.1 JDBC API
在 Java JDBC 编程中对数据库的操作均使用 JDK 自带的 API 统一处理,通常与特定数据库的驱动类是完全解耦的。所以掌握 Java JDBC API(位于 java.sql 包下)即可掌握 Java 数据库编程。
4.2 数据库连接
Connection 接口实现类有数据库提供,获取 Connection 对象通常有两种方式:一种是通过 DriverManager 的静态方式获取,一种是通过 DataSource(数据源)对象获取。实际应用中会使用 DataSource 对象
4.3 Statement 对象
Statement 对象主要是将 SQL 语句发送到数据库中。JDBC API 中主要提供了三种 Statement 对象。
- Statement接口的对象用于执行简单的不带参数的SQL语句。
- PrepareStatement接口的对象用于执行预编译过的SQL语句,SQL语句被预编译后,存在PreparedStatement对象中,然后可以使用该对象高效的多次执行该语句。
- CallbleStatement接口的对象用于执行一个数据库的存储过程。
主要需要掌握的两种执行 SQL 的方法:
- executeQuery() 方法执行后返回单个结果集,通常用于 select 语句
- executeUpdate() 方法的返回值是一个整数,表示受影响的行数,通常用于 update、insert、delete 语句。
4.4 ResultSet 对象
ResultSet 对象被称为结果集,它代表复合 SQL 语句条件的所有行,并且它通过一系列的 getXXX 方法提供了对这些行中数据的访问。
ResultSet 里的数据一行一行排列,每行有多个字段,并且有一个记录指针,指针所指的数据行叫做当前数据行,我们只能来操作当前的数据行。我们如果想要取得某一条数据,就要使用 ResultSet 的 next() 方法,如果我们想要得到 ResultSet 里的所有记录,就应该用 while 循环。