Java Database Connectivity也就是JDBC,是Java官方提供的用于连接和操作各类关系型数据库的标准API,通过它可以实现Java程序与MySQL数据库的交互,完成数据的增删改查操作。本文将以查询表数据为例,完整讲解JDBC连接MySQL的全流程。

环境准备
在开始编写代码前,需要完成以下准备工作:
- 安装MySQL数据库并启动服务,提前创建好测试数据库和表,插入部分测试数据
- 下载对应版本的MySQL JDBC驱动,也就是mysql-connector-j的jar包
- 创建Java项目,将下载的驱动jar包导入项目的依赖中
核心步骤说明
1. 加载数据库驱动
JDBC 4.0之后支持自动加载驱动,但为了兼容性,手动加载驱动的代码依然常用,通过Class.forName方法可以注册MySQL驱动。
// 加载MySQL JDBC驱动
try {
Class.forName("com.mysql.cj.jdbc.Driver");
System.out.println("驱动加载成功");
} catch (ClassNotFoundException e) {
System.out.println("驱动加载失败:" + e.getMessage());
}
2. 建立数据库连接
使用DriverManager.getConnection方法建立连接,需要传入数据库URL、用户名和密码。数据库URL的格式为jdbc:mysql://主机地址:端口/数据库名?参数,常见参数可以设置字符编码和时区避免乱码问题。
// 数据库连接信息
String url = "jdbc:mysql://127.0.0.1:3306/test_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai";
String user = "root";
String password = "123456";
// 建立连接
java.sql.Connection conn = null;
try {
conn = DriverManager.getConnection(url, user, password);
System.out.println("数据库连接成功");
} catch (java.sql.SQLException e) {
System.out.println("数据库连接失败:" + e.getMessage());
}
3. 创建Statement并执行查询
通过连接对象创建Statement或者PreparedStatement,然后执行SQL查询语句,获取结果集对象。
// 编写查询SQL
String sql = "SELECT id, username, age, email FROM user_info";
java.sql.Statement stmt = null;
java.sql.ResultSet rs = null;
try {
stmt = conn.createStatement();
// 执行查询,返回结果集
rs = stmt.executeQuery(sql);
System.out.println("查询执行成功");
} catch (java.sql.SQLException e) {
System.out.println("查询执行失败:" + e.getMessage());
}
4. 处理结果集并显示数据
结果集ResultSet包含了查询返回的所有行数据,通过next方法遍历每一行,再通过列名或者列索引获取对应字段的值。
// 遍历结果集展示数据
try {
System.out.println("查询结果:");
System.out.println("IDt用户名t年龄t邮箱");
while (rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
int age = rs.getInt("age");
String email = rs.getString("email");
System.out.println(id + "t" + username + "t" + age + "t" + email);
}
} catch (java.sql.SQLException e) {
System.out.println("结果处理失败:" + e.getMessage());
}
5. 释放资源
数据库操作完成后,必须按照结果集、Statement、连接的顺序关闭资源,避免资源泄露,关闭操作需要放在finally块中确保执行。
// 释放资源
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
System.out.println("资源释放完成");
} catch (java.sql.SQLException e) {
System.out.println("资源释放失败:" + e.getMessage());
}
完整示例代码
以下是整合所有步骤的完整可运行代码:
import java.sql.*;
public class JdbcQueryDemo {
public static void main(String[] args) {
// 数据库配置信息
String driver = "com.mysql.cj.jdbc.Driver";
String url = "jdbc:mysql://127.0.0.1:3306/test_db?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai";
String user = "root";
String password = "123456";
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 1. 加载驱动
Class.forName(driver);
// 2. 建立连接
conn = DriverManager.getConnection(url, user, password);
// 3. 创建Statement并执行查询
stmt = conn.createStatement();
String sql = "SELECT id, username, age, email FROM user_info";
rs = stmt.executeQuery(sql);
// 4. 处理结果集
System.out.println("用户表数据:");
System.out.println("ID | 用户名 | 年龄 | 邮箱");
System.out.println("------------------------");
while (rs.next()) {
int id = rs.getInt("id");
String username = rs.getString("username");
int age = rs.getInt("age");
String email = rs.getString("email");
System.out.println(id + " | " + username + " | " + age + " | " + email);
}
} catch (ClassNotFoundException e) {
System.out.println("驱动加载异常:" + e.getMessage());
} catch (SQLException e) {
System.out.println("数据库操作异常:" + e.getMessage());
} finally {
// 5. 释放资源
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (SQLException e) {
System.out.println("资源关闭异常:" + e.getMessage());
}
}
}
}
常见问题排查
- 连接失败提示找不到驱动:检查驱动jar包是否正确导入项目依赖,驱动类名是否拼写正确
- 时区错误:在数据库URL中添加serverTimezone参数,设置为Asia/Shanghai或者UTC
- 表或字段不存在:检查SQL语句中的表名、字段名是否和数据库中的实际名称一致,注意大小写问题
- 访问被拒绝:检查数据库用户名、密码是否正确,该用户是否有对应数据库的访问权限