在 Java 中使用 JDBC (Java Database Connectivity) 来连接和操作数据库是一种常见的方法。下面是 JDBC 操作数据库的完整流程,包括加载驱动、创建连接、执行 SQL 语句、处理结果集以及关闭资源等步骤。
JDBC 全流程步骤:
准备数据库驱动
确保项目中已引入对应数据库的 JDBC 驱动。
例如,MySQL 的 JDBC 驱动 jar 包:mysql-connector-java-x.x.x.jar。
如果使用 Maven 管理依赖:
1. 加载数据库驱动
首先需要加载并注册 JDBC 驱动程序,通常使用 Class.forName() 方法来加载。
Class.forName("com.mysql.cj.jdbc.Driver");
2. 创建数据库连接
使用 DriverManager.getConnection() 来获取数据库连接,通常需要提供数据库 URL、用户名、密码。
String url = "jdbc:mysql://localhost:3306/mydatabase"; // 数据库的 URL
String username = "root"; // 数据库用户名
String password = "password"; // 数据库密码
Connection connection = DriverManager.getConnection(url, username, password);
3. 创建 SQL 语句对象
通过 Connection 对象的 createStatement() 方法或 prepareStatement() 方法创建 SQL 语句对象。
使用 Statement 执行静态 SQL 语句
使用 PreparedStatement 执行参数化 SQL 语句(推荐,因为可以防止 SQL 注入)
使用 Statement 示例:
Statement statement = connection.createStatement();
使用 PreparedStatement 示例:
String sql = "SELECT * FROM users WHERE username = ?";
PreparedStatement preparedStatement = connection.prepareStatement(sql);
preparedStatement.setString(1, "Alice");
4. 执行 SQL 语句
使用 Statement 或 PreparedStatement 执行 SQL 语句,并获取结果。
对于 SELECT 查询,使用 executeQuery() 方法返回结果集 (ResultSet)。
对于 INSERT、UPDATE、DELETE 操作,使用 executeUpdate() 方法返回受影响的行数。
执行查询操作:
ResultSet resultSet = statement.executeQuery("SELECT * FROM users");
执行更新操作:
int rowsAffected = preparedStatement.executeUpdate();
5. 处理结果集
当执行查询操作时,结果集保存在 ResultSet 对象中,可以通过 next() 方法迭代读取每一行的结果。
while (resultSet.next()) {
int id = resultSet.getInt("id");
String username = resultSet.getString("username");
String email = resultSet.getString("email");
System.out.println("ID: " + id + ", Username: " + username + ", Email: " + email);
}
6. 关闭资源
完成数据库操作后,需要关闭 ResultSet、Statement、Connection 以释放资源。通常使用 try-with-resources 语法来自动关闭资源。
try (Connection connection = DriverManager.getConnection(url, username, password);
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery("SELECT * FROM users")) {
while (resultSet.next()) {
System.out.println(resultSet.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace();
}
或者手动关闭资源:
if (resultSet != null) resultSet.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
完整示例代码
以下是一个简单的 JDBC 完整示例,包括查询和插入数据的实现:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/mydatabase";
String username = "root";
String password = "password";
Connection connection = null;
Statement statement = null;
ResultSet resultSet = null;
try {
// 1. 加载 MySQL JDBC 驱动
Class.forName("com.mysql.cj.jdbc.Driver");
// 2. 创建数据库连接
connection = DriverManager.getConnection(url, username, password);
// 3. 创建 SQL 语句对象
String sql = "SELECT * FROM users";
statement = connection.createStatement();
// 4. 执行 SQL 查询
resultSet = statement.executeQuery(sql);
// 5. 处理结果集
while (resultSet.next()) {
int id = resultSet.getInt("id");
String user = resultSet.getString("username");
String email = resultSet.getString("email");
System.out.println("ID: " + id + ", Username: " + user + ", Email: " + email);
}
// 示例:插入数据
String insertSql = "INSERT INTO users (username, email) VALUES (?, ?)";
PreparedStatement preparedStatement = connection.prepareStatement(insertSql);
preparedStatement.setString(1, "Bob");
preparedStatement.setString(2, "bob@example.com");
int rowsInserted = preparedStatement.executeUpdate();
System.out.println("Inserted " + rowsInserted + " rows.");
} catch (SQLException | ClassNotFoundException e) {
e.printStackTrace();
} finally {
// 6. 关闭资源
try {
if (resultSet != null) resultSet.close();
if (statement != null) statement.close();
if (connection != null) connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
JDBC 操作步骤小结:
加载驱动:使用 Class.forName() 加载 JDBC 驱动程序。
创建连接:使用 DriverManager.getConnection() 创建数据库连接。
创建语句:使用 createStatement() 或 prepareStatement() 创建 SQL 语句对象。
执行 SQL 语句:使用 executeQuery()(查询)或 executeUpdate()(更新、插入、删除)执行 SQL 语句。
处理结果:通过 ResultSet 处理查询结果。
关闭资源:最后关闭 ResultSet、Statement 和 Connection 以释放资源。
这种结构是典型的 JDBC 工作流程,适用于大多数数据库操作。