在Java中连接数据库需加载JDBC驱动,通过DriverManager获取Connection对象,使用Statement或PreparedStatement执行SQL语句,最后处理结果集并关闭资源。
核心步骤:Java连接数据库
Java通过JDBC(Java Database Connectivity) 标准接口实现数据库操作,需以下步骤:
准备数据库驱动
- 下载JDBC驱动:根据数据库类型选择驱动(如MySQL用
mysql-connector-java,Oracle用ojdbc)。 - 添加依赖:
- Maven项目(在
pom.xml中):<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> <!-- 使用最新版本 --> </dependency> - 手动导入:下载JAR文件,放入项目的
lib目录并添加到构建路径。
- Maven项目(在
建立数据库连接
使用DriverManager获取连接对象,需提供URL、用户名、密码:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DBConnection {
private static final String URL = "jdbc:mysql://localhost:3306/your_database?useSSL=false&serverTimezone=UTC";
private static final String USER = "your_username";
private static final String PASSWORD = "your_password";
public static Connection getConnection() throws SQLException {
return DriverManager.getConnection(URL, USER, PASSWORD);
}
}
关键参数说明:
URL格式:jdbc:数据库类型://主机:端口/数据库名?参数
例:MySQL需加时区参数serverTimezone=UTC。- 安全提示:避免硬编码密码,使用环境变量或配置文件(见下文)。
执行SQL操作
通过Connection创建Statement或PreparedStatement执行SQL:

try (Connection conn = DBConnection.getConnection();
PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE id=?")) {
stmt.setInt(1, 1001); // 设置参数(防SQL注入)
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
System.out.println(rs.getString("username"));
}
} catch (SQLException e) {
e.printStackTrace(); // 实际项目中应记录日志
}
关闭资源
使用 try-with-resources 自动关闭连接、语句和结果集(Java 7+支持),避免资源泄漏:
try (Connection conn = DriverManager.getConnection(URL, USER, PASSWORD);
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("SELECT * FROM products")) {
// 操作数据...
} // 自动调用rs.close()、stmt.close()、conn.close()
安全与优化实践
-
避免硬编码敏感信息
- 使用配置文件(如
config.properties):db.url=jdbc:mysql://localhost:3306/mydb db.user=admin db.password=secret
- Java读取配置:
Properties props = new Properties(); props.load(new FileInputStream("config.properties")); String url = props.getProperty("db.url");
- 使用配置文件(如
-
防SQL注入
务必用PreparedStatement替代Statement,禁止拼接SQL字符串:
// 错误示例(危险!) String sql = "SELECT * FROM users WHERE name='" + inputName + "'"; // 正确做法 PreparedStatement stmt = conn.prepareStatement("SELECT * FROM users WHERE name=?"); stmt.setString(1, inputName); -
连接池管理
高并发场景使用连接池(如HikariCP、Tomcat JDBC Pool)提升性能:HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb"); config.setUsername("user"); config.setPassword("password"); try (HikariDataSource ds = new HikariDataSource(config); Connection conn = ds.getConnection()) { // 操作数据库... }
常见问题解决
-
驱动加载失败:
检查JAR是否在类路径中,MySQL 8+驱动类名为com.mysql.cj.jdbc.Driver(无需显式调用Class.forName())。 -
时区错误:
MySQL URL中添加?serverTimezone=UTC。
-
连接超时:
检查数据库服务是否运行,防火墙是否开放端口(默认MySQL端口3306)。
完整示例代码
import java.sql.*;
import java.util.Properties;
public class DatabaseDemo {
public static void main(String[] args) {
// 从配置文件读取信息(安全推荐)
Properties props = new Properties();
try {
props.load(DatabaseDemo.class.getResourceAsStream("/config.properties"));
String url = props.getProperty("db.url");
String user = props.getProperty("db.user");
String password = props.getProperty("db.password");
// 连接并查询
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement stmt = conn.prepareStatement("SELECT email FROM users WHERE id=?")) {
stmt.setInt(1, 1001);
ResultSet rs = stmt.executeQuery();
if (rs.next()) {
System.out.println("Email: " + rs.getString("email"));
}
}
} catch (Exception e) {
System.err.println("数据库错误: " + e.getMessage());
}
}
}
引用说明
- JDBC官方文档:Oracle JDBC指南
- MySQL Connector/J下载:MySQL官网
- 连接池推荐:HikariCP GitHub
- 安全实践参考:OWASP SQL注入防护
重要提示:生产环境务必使用连接池、加密敏感信息(如Vault工具)、限制数据库账号权限,本文内容遵循Java最新标准(Java 17+),适用于MySQL、PostgreSQL等主流数据库(需调整URL和驱动)。
