本文目录导读:

- 目录导读
- 为什么需要Java与MySQL的交互案例?
- 环境准备:JDK、MySQL、驱动下载与配置
- 核心代码:三步实现数据库查询
- 常见坑点与解决方案
- 问答环节:实现过程中的高频问题
- 进阶建议:从案例到生产环境的注意事项
Java连接MySQL数据库执行查询完整指南:从零搭建到性能优化
目录导读
- 为什么需要Java与MySQL的交互案例?
- 环境准备:JDK、MySQL、驱动下载与配置
- 核心代码:三步实现数据库查询
- 常见坑点与解决方案
- 问答环节:实现过程中的高频问题
- 进阶建议:从案例到生产环境的注意事项
为什么需要Java与MySQL的交互案例?
对于Java开发者而言,连接MySQL并执行查询是后端开发中最基础也最核心的技能之一,无论是搭建Web应用、数据处理系统,还是学习JDBC(Java Database Connectivity)规范,一个完整的“案例”能够帮助你:
- 快速理解JDBC工作流程:从加载驱动到关闭连接,每个步骤都有明确的目的。
- 避免“纸上谈兵”:搜索引擎上大量理论文章,但缺少可直接运行的代码片段,一个可复现的案例能让你立刻验证结果。
- 为ORM框架打下基础:理解原生JDBC后,学习MyBatis、Hibernate等框架会更加顺手。
如果你正在面试或自学中,这个案例就是你的“调试器”与“敲门砖”。
环境准备:JDK、MySQL、驱动下载与配置
在写代码前,请确保以下组件已正确安装:
-
JDK 8及以上版本(推荐JDK 11或17)
- 验证:终端执行
java -version
- 验证:终端执行
-
MySQL 5.7+ 或 8.0+
- 建议使用MySQL 8.0,因其性能与安全性更好。
- 验证:终端执行
mysql -u root -p登录。
-
MySQL JDBC驱动(JAR文件)
- 官方下载地址(如遇域名问题,请搜索“mysql-connector-java 8.0.33.jar”)。
- 如果你的项目使用Maven,在pom.xml中添加以下依赖(推荐):
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.33</version> </dependency> - 非Maven项目:将下载的JAR放到项目classpath下(如
lib文件夹)。
-
创建测试数据库与表
在MySQL中执行:CREATE DATABASE demo_db; USE demo_db; CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, email VARCHAR(100) UNIQUE, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); INSERT INTO users (name, email) VALUES ('Alice', 'alice@test.com'), ('Bob', 'bob@test.com');
核心代码:三步实现数据库查询
以下是一个完整的Java类,展示了连接MySQL、执行查询并打印结果的全过程,代码已包含异常处理与资源关闭。
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
public class MySQLQueryDemo {
public static void main(String[] args) {
// 1. 数据库连接参数
String url = "jdbc:mysql://localhost:3306/demo_db?useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true";
String username = "root";
String password = "your_password"; // 请替换为你的MySQL密码
// 2. 声明必要的资源
Connection conn = null;
Statement stmt = null;
ResultSet rs = null;
try {
// 3. 加载MySQL驱动(JDBC 4.0后可省略,但建议保留)
// Class.forName("com.mysql.cj.jdbc.Driver");
// 4. 建立连接
conn = DriverManager.getConnection(url, username, password);
System.out.println("数据库连接成功!");
// 5. 创建Statement对象
stmt = conn.createStatement();
// 6. 执行查询
String sql = "SELECT id, name, email, created_at FROM users";
rs = stmt.executeQuery(sql);
// 7. 遍历结果集
System.out.println("=== 用户列表 ===");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
String createdAt = rs.getTimestamp("created_at").toString();
System.out.printf("ID: %d, 姓名: %s, 邮箱: %s, 创建时间: %s%n", id, name, email, createdAt);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
// 8. 释放资源(逆序关闭)
try {
if (rs != null) rs.close();
if (stmt != null) stmt.close();
if (conn != null) conn.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
输出示例:
数据库连接成功!
=== 用户列表 ===
ID: 1, 姓名: Alice, 邮箱: alice@test.com, 创建时间: 2025-03-25 10:30:00.0
ID: 2, 姓名: Bob, 邮箱: bob@test.com, 创建时间: 2025-03-25 10:30:00.0
常见坑点与解决方案
-
驱动类找不到
- 错误:
ClassNotFoundException: com.mysql.cj.jdbc.Driver - 原因:JAR包未导入或版本不匹配。
- 解决:Maven项目检查
pom.xml;非Maven项目将JAR放入WEB-INF/lib或构建路径。
- 错误:
-
SSL连接警告
- 错误显示:
WARNING: Establishing SSL connection without server's identity verification... - 解决:在URL中添加
?useSSL=false(开发环境)或配置SSL证书(生产环境)。
- 错误显示:
-
时区错误
- 错误:
The server time zone value '�й���ʱ��' is unrecognized... - 解决:URL中追加
&serverTimezone=UTC或&serverTimezone=Asia/Shanghai。
- 错误:
-
Public Key Retrieval 错误
- 错误:
Public Key Retrieval is not allowed - 解决:在URL添加
&allowPublicKeyRetrieval=true(仅用于开发环境)。
- 错误:
问答环节:实现过程中的高频问题
Q1:为什么明明有数据,但rs.next()一直返回false?
A:最常见的原因是SQL语句写错表名或字段名,或者数据库连接到的不是目标数据库,请检查URL中的数据库名称(demo_db)是否正确,并确认表中确实有数据。
Q2:使用Statement和PreparedStatement有什么区别?
A:对于静态查询(如上例),两者均可,但PreparedStatement更安全,能防止SQL注入,且执行同构的批量查询时性能更好,建议在真实项目中始终使用PreparedStatement。
Q3:连接池是什么?我需要自己实现吗?
A:连接池是预先创建数据库连接并复用的技术。不需要自己实现,可以集成HikariCP或Druid,生产环境中强烈建议使用连接池,而不是每次请求都新建连接。
Q4:这个案例能用于Web项目吗?
A:可以直接用,但Web项目通常会将数据库操作封装到DAO层,并依赖连接池,你可以将此案例作为DAO的底层实现参考。
进阶建议:从案例到生产环境的注意事项
-
参数化查询防SQL注入
将Statement换成PreparedStatement,PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM users WHERE email = ?"); pstmt.setString(1, "alice@test.com"); ResultSet rs = pstmt.executeQuery(); -
使用try-with-resources自动关闭资源
Java 7+支持此语法,可简化finally块:try (Connection conn = DriverManager.getConnection(url, user, pass); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql)) { // 处理结果 } catch (SQLException e) { e.printStackTrace(); } -
日志记录代替printStackTrace
生产中应使用SLF4J + Logback等日志框架记录异常。 -
考虑使用ORM框架
对于复杂业务,MyBatis或Spring Data JPA能提升开发效率,但底层仍是JDBC,理解本案例后,你再学习框架会事半功倍。
本文提供的是一个经过读者验证的“最小可行案例”,能帮助你在10分钟内跑通Java+MySQL的查询流程,请将文中的密码替换为你自己的MySQL密码,并确保数据库与表已创建,如果遇到问题,欢迎在评论区留言,我将协助排查。