JDBC连接数据库的标准流程分为六个核心步骤:加载驱动、建立连接、创建语句、执行SQL、处理结果、关闭资源,这是所有JDBC编程的基石,掌握这六步就能应对绝大多数数据库操作,无论你是连接MySQL还是Oracle,流程基本一致,差异仅在于驱动和连接字符串。
JDBC连接数据库步骤详解
JDBC连接数据库的完整过程可以拆解为六个独立环节,每个环节都直接影响程序的稳定性和性能,下面我带你一步步拆解,同时给出可以直接运行的代码示例。
第一步:加载数据库驱动
在JDBC 4.0之前,需要显式调用Class.forName()加载驱动类,从JDBC 4.0开始,驱动自动加载,只要驱动jar包在classpath中即可,不过为了兼容旧版本和明确依赖,手动加载仍是常见做法。
// 手动加载MySQL驱动
Class.forName("com.mysql.cj.jdbc.Driver");
如果驱动不存在,会抛出ClassNotFoundException。确保驱动jar包版本与数据库版本匹配,这是多数新手忽略的细节,例如MySQL 8.x对应com.mysql.cj.jdbc.Driver,而5.x则用com.mysql.jdbc.Driver。
第二步:建立数据库连接
使用DriverManager.getConnection()方法,传入连接字符串、用户名和密码。
String url = "jdbc:mysql://localhost:3306/mydb?useSSL=false&serverTimezone=UTC"; String user = "root"; String password = "123456"; Connection conn = DriverManager.getConnection(url, user, password);
连接字符串格式是核心,不同数据库略有差异,MySQL的格式为jdbc:mysql://主机:端口/数据库名?参数,常见参数包括useSSL、serverTimezone、characterEncoding等。连接超时时间默认可能只有几秒,生产环境建议显式设置。
第三步:创建Statement对象
通过Connection创建Statement或PreparedStatement,推荐使用PreparedStatement,因为它能预编译SQL并防止SQL注入。
String sql = "SELECT FROM users WHERE id = ?"; PreparedStatement pstmt = conn.prepareStatement(sql); pstmt.setInt(1, 100);
PreparedStatement
的好处是对比明显:代码更安全,性能更优,尤其当同一SQL被多次执行时,数据库会重用预编译计划。
第四步:执行SQL语句
根据SQL类型选择不同的执行方法:
executeQuery():用于SELECT,返回ResultSet。executeUpdate():用于INSERT、UPDATE、DELETE,返回受影响行数。execute():通用方法,可用于任意SQL,返回boolean表示是否为结果集。
ResultSet rs = pstmt.executeQuery(); // 或 int rows = pstmt.executeUpdate();
第五步:处理查询结果
通过ResultSet遍历数据。ResultSet默认只进,一次一行。
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
// 处理每行数据
}
注意列索引从1开始,也可用列名获取。务必在读取完所有数据后关闭ResultSet,否则可能占用数据库游标资源。
第六步:关闭资源
关闭顺序与创建顺序相反:先关闭ResultSet,再关闭Statement,最后关闭Connection,最好在finally块中执行,避免异常导致资源泄漏。
finally {
if (rs != null) try { rs.close(); } catch (SQLException e) { e.printStackTrace(); }
if (pstmt != null) try { pstmt.close(); } catch (SQLException e) { e.printStackTrace(); }
if (conn != null) try { conn.close(); } catch (SQLException e) { e.printStackTrace(); }
}
据统计,相当一部分数据库连接失败和性能问题都源于资源未正确关闭,Java 7之后可以使用try-with-resources自动关闭,代码更简洁,但仍然需要理解底层机制。
JDBC连接MySQL数据库实例
以MySQL为例,展示完整的可运行代码,假设你已经将MySQL Connector/J的jar包添加到项目中。
准备工作:添加驱动依赖
- Maven项目在pom.xml中加入:
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency>
- 非Maven项目直接下载jar包置于classpath下。
连接字符串详解
常用格式:jdbc:mysql://localhost:3306/数据库名?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8
关键参数对照表:
| 参数 | 说明 | 推荐值 |
|---|---|---|
| useSSL | 是否使用SSL连接 | 开发环境false,生产环境true |
| serverTimezone | 服务器时区 | Asia/Shanghai 或 UTC |
| characterEncoding | 字符编码 | utf8或utf8mb4 |
| autoReconnect | 自动重连 | true(生产环境慎用) |
完整示例代码
public class JdbcDemo {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/testdb?useSSL=false&serverTimezone=UTC";
String user = "root";
String password = "root";
String sql = "SELECT id, name FROM users WHERE age > ?";
try (Connection conn = DriverManager.getConnection(url, user, password);
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, 18);
try (ResultSet rs = pstmt.executeQuery()) {
while (rs.next()) {
System.out.println(rs.getInt("id") + " - " + rs.getString("name"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
这段代码使用了try-with-resources,所有资源会自动关闭,实际项目中推荐这种写法。
JDBC连接池配置与优化
直接连接每次请求都会创建和销毁连接,开销很大。业界共识是在生产环境使用连接池,它维护一组复用的连接,大幅提升性能。
常用连接池对比
| 连接池 | 特点 | 性能 |
|---|---|---|
| HikariCP | 轻量级,速度快 | 最快,Spring Boot默认 |
| DBCP2 | 稳定,配置丰富 | 中等 |
| C3P0 | 老牌,自动重连 | 较慢,已不推荐 |
HikariCP是目前最流行的选择,其配置简单,性能极佳,以下是一个基本配置示例(HikariCP + MySQL):
HikariConfig config = new HikariConfig();
config.setJdbcUrl("jdbc:mysql://localhost:3306/mydb?useSSL=false");
config.setUsername("root");
config.setPassword("root");
config.setMaximumPoolSize(20);
config.setConnectionTimeout(30000);
HikariDataSource dataSource = new HikariDataSource(config);
Connection conn = dataSource.getConnection();
连接池参数需要根据实际负载调整,例如最大连接数、最小空闲数、连接超时等。业内专家指出,连接池的配置应结合数据库最大连接数和应用并发量,避免过大或过小。
JDBC连接数据库常见问题解答
为什么加载驱动时找不到类?
通常是驱动jar包未正确引入或版本不匹配,检查项目classpath中是否包含对应数据库的驱动jar,以及驱动类名是否正确,例如MySQL 8.x使用com.mysql.cj.jdbc.Driver,5.x使用com.mysql.jdbc.Driver。
连接超时或拒绝连接怎么处理?
首先检查数据库服务是否启动,防火墙是否开放端口,其次确认连接字符串中的主机、端口、数据库名是否正确。部分情况下,MySQL的max_connections参数满了也会导致拒绝连接,可以登录数据库检查并调整。
PreparedStatement和Statement哪个更好?
始终优先使用PreparedStatement,它不仅防止SQL注入,还能预编译SQL提升性能,尤其对于重复执行的SQL,Statement仅在少数动态表名或列名的场景下使用,但需谨慎处理拼接。
使用连接池后还需要手动关闭连接吗?
需要,连接池中的连接复用,但关闭操作不是销毁连接,而是回收到池中,仍需要调用close()方法,通常由连接池内部实现优雅归还。务必在finally块或try-with-resources中关闭所有资源,包括Connection、Statement和ResultSet。
JDBC连接数据库的步骤看似固定,但每个环节的细节都影响最终效果,从驱动加载到资源关闭,建议你在实际开发中反复验证,特别是连接池和异常处理。核心结论:记住六步流程,优先使用PreparedStatement和连接池,并确保资源正确关闭,就能避开绝大多数坑。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/547100.html

![[JDBC]用Java连数据库实战教程(超详细)](https://i1.hdslb.com/bfs/archive/77012199f0b00660faa24ed725419d0387ce1afa.jpg)


