在Java项目中,数据库连接是数据持久化的核心环节,承担着应用程序与数据库交互的关键角色,无论是企业级应用还是小型系统,稳定高效的数据库连接都是保障业务流畅运行的基础,本文将从基础原理到实践操作,系统介绍Java项目中连接数据库的完整流程、关键技术与最佳实践。

数据库连接的基本原理
Java连接数据库的标准方式是通过JDBC(Java Database Connectivity)API,这是Java平台提供的数据库访问规范,JDBC的核心思想是“统一接口,具体实现”,即由数据库厂商提供驱动程序(Driver),实现JDBC接口,开发者只需调用标准API即可操作不同数据库,JDBC的核心组件包括:
- 驱动(Driver):数据库厂商实现的接口,负责建立Java与数据库的连接;
- 连接(Connection):代表与数据库的会话,用于执行SQL语句;
- 语句(Statement/PreparedStatement):执行SQL语句的对象,支持静态SQL和预编译SQL;
- 结果集(ResultSet):存储查询结果,提供遍历和访问数据的方法。
理解这些组件的作用,是掌握数据库连接的基础。
JDBC驱动加载与配置
在建立连接前,需要加载对应的数据库驱动,JDBC驱动的加载方式经历了两个阶段:
- 显式加载(JDBC 4.0之前):通过
Class.forName("驱动类名")手动加载驱动类,例如MySQL 8.0的驱动类为com.mysql.cj.jdbc.Driver,这种方式会触发驱动的静态代码块,向DriverManager注册驱动实例。 - 自动加载(JDBC 4.0及之后):Java SPI(Service Provider Interface)机制会自动在类路径中查找
META-INF/services/java.sql.Driver文件,并加载文件中指定的驱动类,现代Java项目通常无需手动调用Class.forName(),但显式加载可提升代码可读性。
配置驱动依赖时,需根据项目构建工具添加对应依赖,在Maven项目的pom.xml中添加MySQL驱动依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
不同数据库的驱动依赖不同,如Oracle需添加ojdbc驱动,PostgreSQL需添加postgresql驱动,需根据实际数据库类型选择。
建立数据库连接
加载驱动后,通过DriverManager.getConnection()方法建立连接,该方法需三个参数:数据库URL、用户名和密码。

- 数据库URL格式:
jdbc:子协议://主机:端口/数据库名?参数- 子协议:标识数据库类型,如MySQL为
mysql,Oracle为oracle:thin; - 主机与端口:数据库服务器的地址和监听端口,默认MySQL端口为3306,Oracle为1521;
- 参数:可选配置,如MySQL的
useSSL=false(禁用SSL)、serverTimezone=UTC(设置时区)。
- 子协议:标识数据库类型,如MySQL为
示例代码(MySQL连接):
String url = "jdbc:mysql://localhost:3306/test_db?useSSL=false&serverTimezone=UTC"; String username = "root"; String password = "123456"; Connection connection = DriverManager.getConnection(url, username, password);
直接使用DriverManager获取连接存在性能问题(每次创建新连接),实际项目中推荐使用连接池(Connection Pool)管理连接,连接池通过复用连接减少频繁创建和销毁的开销,常用连接池有HikariCP、Druid、C3P0等,以HikariCP为例,配置步骤如下:
- 添加依赖:
<dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>5.0.1</version> </dependency> - 创建数据源并配置:
HikariConfig config = new HikariConfig(); config.setJdbcUrl("jdbc:mysql://localhost:3306/test_db"); config.setUsername("root"); config.setPassword("123456"); config.setMaximumPoolSize(10); // 最大连接数 config.setMinimumIdle(5); // 最小空闲连接数 HikariDataSource dataSource = new HikariDataSource(config); Connection connection = dataSource.getConnection();连接池配置需根据业务量调整参数,如
maximumPoolSize避免过大导致数据库压力,connectionTimeout设置连接超时时间。
执行SQL语句与处理结果
建立连接后,可通过Statement或PreparedStatement执行SQL语句。
- Statement:用于执行静态SQL语句,直接拼接SQL字符串,存在SQL注入风险,适用于固定SQL场景。
Statement statement = connection.createStatement(); ResultSet resultSet = statement.executeQuery("SELECT * FROM users WHERE age > 18"); - PreparedStatement:预编译SQL语句,使用作为占位符,通过
setXxx()方法设置参数,有效防止SQL注入,且预编译可提升重复执行SQL的性能,推荐优先使用。String sql = "SELECT * FROM users WHERE username = ? AND password = ?"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setString(1, "admin"); preparedStatement.setString(2, "password123"); ResultSet resultSet = preparedStatement.executeQuery();
处理结果集(ResultSet)时,通过next()方法遍历数据,结合getXxx()方法获取字段值(getString()、getInt()、getDate()等),需注意字段类型与Java类型的匹配,例如数据库DATETIME类型对应java.sql.Timestamp或java.util.Date,示例:
while (resultSet.next()) {
String username = resultSet.getString("username");
int age = resultSet.getInt("age");
Date createTime = resultSet.getTimestamp("create_time");
System.out.println("Username: " + username + ", Age: " + age);
}
资源管理与关闭
JDBC中的Connection、Statement、ResultSet等资源均需手动关闭,否则可能导致数据库连接泄漏,影响系统性能,关闭顺序需遵循“先创建后关闭”的原则,即ResultSet→Statement→Connection,推荐使用try-with-resources语句(Java 7+)自动关闭资源,避免遗忘关闭操作:

String sql = "SELECT * FROM users";
try (Connection connection = dataSource.getConnection();
Statement statement = connection.createStatement();
ResultSet resultSet = statement.executeQuery(sql)) {
while (resultSet.next()) {
// 处理结果集
}
} catch (SQLException e) {
e.printStackTrace();
}
try-with-resources会自动调用资源的close()方法,即使发生异常也能确保资源释放,大幅降低资源泄漏风险。
不同数据库的连接示例
不同数据库的连接URL和驱动类名存在差异,以下是常见数据库的连接配置:
- Oracle:
String url = "jdbc:oracle:thin:@localhost:1521:orcl"; String username = "scott"; String password = "tiger"; Class.forName("oracle.jdbc.OracleDriver"); Connection connection = DriverManager.getConnection(url, username, password); - PostgreSQL:
String url = "jdbc:postgresql://localhost:5432/test_db"; String username = "postgres"; String password = "123456"; Class.forName("org.postgresql.Driver"); Connection connection = DriverManager.getConnection(url, username, password); - SQL Server:
String url = "jdbc:sqlserver://localhost:1433;databaseName=test_db"; String username = "sa"; String password = "password"; Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver"); Connection connection = DriverManager.getConnection(url, username, password);
最佳实践与注意事项
- 使用连接池:避免直接使用
DriverManager获取连接,优先选择HikariCP(性能优异)或Druid(监控强大)。 - 防SQL注入:始终使用
PreparedStatement,禁止拼接SQL字符串。 - 异常处理:捕获
SQLException并记录日志,避免异常导致程序中断。try { // 数据库操作 } catch (SQLException e) { log.error("数据库操作异常", e); throw new RuntimeException("数据查询失败", e); } - 事务管理:默认情况下,JDBC事务为自动提交模式,可通过
connection.setAutoCommit(false)开启手动事务,提交或回滚需显式调用commit()或rollback():connection.setAutoCommit(false); try { // 执行多个SQL操作 statement.executeUpdate("UPDATE account SET balance = balance - 100 WHERE id = 1"); statement.executeUpdate("UPDATE account SET balance = balance + 100 WHERE id = 2"); connection.commit(); // 提交事务 } catch (SQLException e) { connection.rollback(); // 回滚事务 throw e; } - 配置外部化:数据库连接信息(URL、用户名、密码)应存储在配置文件(如
application.properties)中,避免硬编码,便于环境切换。spring.datasource.url=jdbc:mysql://localhost:3306/test_db spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
Java项目中连接数据库是开发的基础技能,从JDBC基础到连接池优化,再到事务管理与异常处理,每个环节都需细致处理,开发者需根据项目需求选择合适的技术方案,遵循最佳实践,确保数据库连接的高效、稳定与安全,通过不断实践和小编总结,才能构建出健壮的数据交互层,为业务系统提供可靠支撑。


















