Java调用数据库的代码怎么写
Java调用数据库是开发中常见的操作,主要用于数据存储、查询和管理,本文将详细介绍Java调用数据库的基本步骤、核心代码示例、常见问题及解决方案,帮助开发者快速上手。

准备工作:环境配置与依赖引入
在编写Java调用数据库的代码之前,需要确保开发环境已配置好以下内容:
- JDK安装:确保已安装Java开发工具包(JDK),建议使用JDK 8或更高版本。
- 数据库驱动:根据使用的数据库(如MySQL、Oracle、PostgreSQL等),下载对应的JDBC驱动jar包,MySQL的驱动为
mysql-connector-java。 - 依赖管理工具:如果使用Maven或Gradle,需在项目中添加数据库驱动的依赖,以Maven为例,MySQL驱动的依赖如下:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency>
建立数据库连接
调用数据库的第一步是建立连接,通常使用DriverManager类获取数据库连接对象,以下是核心代码示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DatabaseConnection {
private static final String URL = "jdbc:mysql://localhost:3306/your_database";
private static final String USER = "username";
private static final String PASSWORD = "password";
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
}
说明:
URL格式为jdbc:数据库类型://主机名:端口/数据库名。USER和PASSWORD分别为数据库的用户名和密码。- 如果连接失败,会抛出
SQLException,需通过try-catch处理异常。
执行SQL查询
建立连接后,可以通过Statement或PreparedStatement执行SQL查询,推荐使用PreparedStatement,它能有效防止SQL注入。

查询数据示例
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class QueryExample {
public static void main(String[] args) {
String sql = "SELECT * FROM users WHERE age > ?";
try (Connection conn = DatabaseConnection.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, 18); // 设置参数
ResultSet rs = pstmt.executeQuery();
while (rs.next()) {
System.out.println("ID: " + rs.getInt("id") + ", Name: " + rs.getString("name"));
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
说明:
try-with-resources语句确保连接、语句和结果集自动关闭,避免资源泄漏。ResultSet用于遍历查询结果,通过rs.getXXX()方法获取字段值。
更新数据示例
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class UpdateExample {
public static void main(String[] args) {
String sql = "UPDATE users SET name = ? WHERE id = ?";
try (Connection conn = DatabaseConnection.getConnection();
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setString(1, "New Name");
pstmt.setInt(2, 1);
int rowsAffected = pstmt.executeUpdate();
System.out.println("Updated " + rowsAffected + " rows.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
说明:
executeUpdate()用于执行INSERT、UPDATE或DELETE语句,返回受影响的行数。
事务管理
事务用于确保一组操作要么全部成功,要么全部失败,以下是事务管理示例:
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class TransactionExample {
public static void main(String[] args) {
String sql1 = "UPDATE accounts SET balance = balance - 100 WHERE id = 1";
String sql2 = "UPDATE accounts SET balance = balance + 100 WHERE id = 2";
Connection conn = null;
try {
conn = DatabaseConnection.getConnection();
conn.setAutoCommit(false); // 开启事务
try (PreparedStatement pstmt1 = conn.prepareStatement(sql1);
PreparedStatement pstmt2 = conn.prepareStatement(sql2)) {
pstmt1.executeUpdate();
pstmt2.executeUpdate();
conn.commit(); // 提交事务
}
} catch (SQLException e) {
if (conn != null) {
try {
conn.rollback(); // 回滚事务
} catch (SQLException ex) {
ex.printStackTrace();
}
}
e.printStackTrace();
} finally {
if (conn != null) {
try {
conn.setAutoCommit(true); // 恢复自动提交
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
}
说明:

setAutoCommit(false)关闭自动提交,手动管理事务。commit()提交事务,rollback()回滚事务。
常见问题与最佳实践
- 资源泄漏:确保所有
Connection、Statement和ResultSet在使用后关闭,推荐使用try-with-resources。 - SQL注入:始终使用
PreparedStatement而非字符串拼接SQL语句。 - 连接池:高并发场景下,使用连接池(如HikariCP、Druid)管理数据库连接,避免频繁创建和销毁连接。
FAQs
Q1:如何处理数据库连接超时问题?
A:可以通过设置URL中的连接参数解决,
String URL = "jdbc:mysql://localhost:3306/your_database?connectTimeout=5000&socketTimeout=5000";
connectTimeout和socketTimeout分别表示连接超时和读取超时时间(单位:毫秒)。
Q2:为什么推荐使用PreparedStatement?
A:PreparedStatement可以预编译SQL语句,提高执行效率;同时通过参数化查询,有效防止SQL注入攻击,增强安全性。