Java 数据库调用代码怎么写
Java 数据库调用是开发中常见的操作,主要通过 JDBC(Java Database Connectivity)实现,以下是详细的步骤和示例代码,帮助开发者快速掌握数据库调用的方法。

准备工作
在开始编写数据库调用代码之前,需要确保以下准备工作已完成:
- 安装 JDK:确保已安装 Java 开发工具包(JDK),并配置好环境变量。
- 获取数据库驱动:根据使用的数据库(如 MySQL、Oracle、PostgreSQL 等),下载对应的 JDBC 驱动 JAR 包,并将其添加到项目的类路径中。
- 数据库连接信息:准备好数据库的 URL、用户名和密码。
加载 JDBC 驱动
JDBC 驱动是连接 Java 应用和数据库的桥梁,加载驱动的代码如下:
try {
Class.forName("com.mysql.cj.jdbc.Driver"); // MySQL 驱动
// Class.forName("oracle.jdbc.driver.OracleDriver"); // Oracle 驱动
} catch (ClassNotFoundException e) {
System.err.println("加载 JDBC 驱动失败:" + e.getMessage());
}
注意:对于较新版本的 JDBC(如 JDBC 4.0+),驱动可能会自动加载,但显式加载仍然是推荐做法。
建立数据库连接
使用 DriverManager 类获取数据库连接,以下是连接 MySQL 数据库的示例:
String url = "jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC";
String username = "用户名";
String password = "密码";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
System.out.println("数据库连接成功!");
// 后续操作...
} catch (SQLException e) {
System.err.println("数据库连接失败:" + e.getMessage());
}
使用 try-with-resources 语句可以自动关闭连接,避免资源泄漏。

创建 Statement 对象
通过 Connection 对象可以创建 Statement 或 PreparedStatement 对象,用于执行 SQL 语句,推荐使用 PreparedStatement 以防止 SQL 注入。
String sql = "SELECT * FROM users WHERE age > ?";
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setInt(1, 18); // 设置参数
// 执行查询...
} catch (SQLException e) {
System.err.println("创建 Statement 失败:" + e.getMessage());
}
执行 SQL 语句
根据需求执行查询(SELECT)或更新(INSERT、UPDATE、DELETE)操作。
1 执行查询
使用 executeQuery() 方法执行查询,并通过 ResultSet 获取结果:
String sql = "SELECT id, name FROM users";
try (Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql)) {
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
System.out.println("ID: " + id + ", Name: " + name);
}
} catch (SQLException e) {
System.err.println("查询执行失败:" + e.getMessage());
}
2 执行更新
使用 executeUpdate() 方法执行更新操作:
String sql = "INSERT INTO users (name, age) VALUES (?, ?)";
try (PreparedStatement preparedStatement = connection.prepareStatement(sql)) {
preparedStatement.setString(1, "张三");
preparedStatement.setInt(2, 25);
int affectedRows = preparedStatement.executeUpdate();
System.out.println("受影响的行数:" + affectedRows);
} catch (SQLException e) {
System.err.println("更新执行失败:" + e.getMessage());
}
处理结果集
ResultSet 对象包含了查询的结果,通过以下方法遍历数据:

next():移动到下一行数据。getXXX():获取列值,如getString()、getInt()等。
关闭资源
确保所有资源(如 Connection、Statement、ResultSet)在使用后关闭,推荐使用 try-with-resources 语句自动管理资源。
完整示例代码
以下是一个完整的查询示例:
import java.sql.*;
public class DatabaseExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String username = "root";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
String sql = "SELECT * FROM users";
try (Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql)) {
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
}
}
} catch (SQLException e) {
System.err.println("数据库操作失败:" + e.getMessage());
}
}
}
常见问题与优化
- SQL 注入:始终使用
PreparedStatement而非Statement。 - 连接池:高并发场景下使用连接池(如 HikariCP)提高性能。
- 事务管理:通过
connection.setAutoCommit(false)手动控制事务。
FAQs
Q1: 如何处理数据库连接泄漏?
A1: 使用 try-with-resources 语句自动关闭资源(Connection、Statement、ResultSet),确保每个资源在代码块结束时释放,避免手动关闭资源时出现异常,导致资源未释放。
Q2: 为什么推荐使用 PreparedStatement 而非 Statement?
A2: PreparedStatement 可以防止 SQL 注入攻击,因为它会对输入参数进行转义处理。PreparedStatement 可以预编译 SQL 语句,提高重复执行的效率。