在Java应用程序中连接数据库是开发过程中常见的需求,无论是构建企业级应用还是小型工具软件,都离不开与数据库的交互,Java提供了多种方式连接数据库,其中JDBC(Java Database Connectivity)是标准且广泛使用的API,本文将详细介绍Java中连接数据库的步骤、常用方法及注意事项。

JDBC基础
JDBC是Java语言中用于规范客户端程序如何访问数据库的应用程序接口,由一组用Java语言编写的类和接口组成,JDBC为开发者提供了一个统一的方式来访问不同类型的数据库,无论是MySQL、Oracle还是SQL Server,都可以通过JDBC进行操作,使用JDBC连接数据库通常需要经历加载驱动、建立连接、创建执行对象、执行SQL、处理结果以及关闭资源等步骤。
连接数据库的具体步骤
添加数据库驱动依赖
需要根据所使用的数据库类型添加对应的JDBC驱动,以MySQL为例,可以通过Maven项目的pom.xml文件添加依赖:
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
如果是非Maven项目,需要手动下载JDBC驱动JAR包并将其添加到项目的类路径中。
加载JDBC驱动
在Java代码中,需要使用Class.forName()方法加载数据库驱动类,加载MySQL驱动:
Class.forName("com.mysql.cj.jdbc.Driver");
注意:从JDBC 4.0开始,驱动会自动注册,通常可以省略此步骤,但显式加载可以确保代码的兼容性。
建立数据库连接
通过DriverManager.getConnection()方法获取数据库连接对象,该方法需要三个参数:数据库URL、用户名和密码,MySQL的URL格式通常为:

String url = "jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=UTC"; String username = "root"; String password = "password"; Connection connection = DriverManager.getConnection(url, username, password);
localhost是数据库服务器地址,3306是默认端口,数据库名是要连接的数据库实例。
创建执行SQL语句的对象
通过Connection对象可以创建Statement或PreparedStatement对象。Statement用于执行静态SQL语句,而PreparedStatement用于执行预编译SQL语句,能有效防止SQL注入攻击。
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM users WHERE id = ?");
preparedStatement.setInt(1, 1);
执行SQL语句并处理结果
使用executeQuery()方法执行查询语句,返回ResultSet对象;使用executeUpdate()方法执行更新、插入或删除语句,返回受影响的行数。
ResultSet resultSet = preparedStatement.executeQuery();
while (resultSet.next()) {
String name = resultSet.getString("name");
System.out.println("Name: " + name);
}
关闭资源
为了释放数据库连接,避免资源泄漏,需要按照相反的顺序关闭ResultSet、Statement和Connection对象:
if (resultSet != null) resultSet.close(); if (preparedStatement != null) preparedStatement.close(); if (connection != null) connection.close();
使用连接池优化性能
在频繁连接数据库的场景下,直接使用DriverManager获取连接会导致性能问题,可以使用数据库连接池(如HikariCP、DBCP等)来管理连接,以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/数据库名");
config.setUsername("root");
config.setPassword("password");
HikariDataSource dataSource = new HikariDataSource(config);
Connection connection = dataSource.getConnection();
连接池会复用已建立的连接,显著提高应用程序的性能和稳定性。
异常处理与最佳实践
在数据库操作中,必须妥善处理可能出现的异常,如SQLException,建议使用try-catch-finally或try-with-resources语句确保资源释放。
try (Connection connection = DriverManager.getConnection(url, username, password);
PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM users")) {
ResultSet resultSet = preparedStatement.executeQuery();
// 处理结果集
} catch (SQLException e) {
e.printStackTrace();
}
应避免在代码中硬编码数据库连接信息,建议使用配置文件(如properties或yaml文件)管理敏感数据。
相关问答FAQs
Q1: 为什么使用PreparedStatement而不是Statement?
A1: PreparedStatement可以预编译SQL语句,提高执行效率;同时通过参数化查询有效防止SQL注入攻击,增强安全性,对于需要多次执行的相似SQL语句,PreparedStatement的优势更加明显。
Q2: 数据库连接池的作用是什么?如何选择合适的连接池?
A2: 数据库连接池用于管理和复用数据库连接,减少频繁创建和销毁连接的开销,提高系统性能,选择连接池时,应考虑其稳定性、性能、易用性及社区支持度,HikariCP是目前性能优秀的开源连接池,而Druid则提供了更丰富的监控功能,适合生产环境使用。