Java调用MySQL命令是Java应用程序与MySQL数据库交互的核心操作,主要通过JDBC(Java Database Connectivity)实现,JDBC是Java提供的一套标准API,用于执行SQL语句、处理结果集以及管理数据库连接,以下是详细的实现步骤和注意事项。

环境准备
在开始之前,需确保以下环境已正确配置:
- JDK安装:确保Java开发工具包(JDK)已安装,并配置好环境变量
JAVA_HOME。 - MySQL数据库:安装MySQL服务器,并创建目标数据库及表,例如创建一个
test数据库和user表:CREATE DATABASE test; USE test; CREATE TABLE user (id INT PRIMARY KEY, name VARCHAR(50), age INT);
- JDBC驱动:下载MySQL JDBC驱动(如
mysql-connector-java-x.x.x.jar),并将其添加到项目的类路径中,若使用Maven项目,可在pom.xml中添加依赖:<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency>
Java调用MySQL的基本步骤
加载JDBC驱动
通过Class.forName()方法加载MySQL驱动类,驱动管理器会自动注册驱动:
Class.forName("com.mysql.cj.jdbc.Driver");
建立数据库连接
使用DriverManager.getConnection()方法获取连接,需提供数据库URL、用户名和密码:
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC"; String username = "root"; String password = "password"; Connection connection = DriverManager.getConnection(url, username, password);
url中的参数说明如下:
| 参数 | 说明 |
|------|------|
| localhost:3306 | 数据库服务器地址和端口 |
| test | 数据库名称 |
| useSSL=false | 禁用SSL连接(开发环境可设置) |
| serverTimezone=UTC | 设置时区 |

创建Statement对象
通过Connection对象创建Statement或PreparedStatement,后者用于防止SQL注入:
// Statement方式(不推荐,存在SQL注入风险) Statement statement = connection.createStatement(); // PreparedStatement方式(推荐) String sql = "INSERT INTO user (id, name, age) VALUES (?, ?, ?)"; PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, 1); preparedStatement.setString(2, "Alice"); preparedStatement.setInt(3, 25);
执行SQL命令
- 执行查询:使用
executeQuery()返回ResultSet对象:ResultSet resultSet = preparedStatement.executeQuery("SELECT * FROM user"); - 执行更新:使用
executeUpdate()返回受影响的行数:int rowsAffected = preparedStatement.executeUpdate();
处理结果集
遍历ResultSet获取查询结果:
while (resultSet.next()) {
int id = resultSet.getInt("id");
String name = resultSet.getString("name");
int age = resultSet.getInt("age");
System.out.println("ID: " + id + ", Name: " + name + ", Age: " + age);
}
关闭资源
按顺序关闭ResultSet、Statement和Connection,避免资源泄漏:
if (resultSet != null) resultSet.close(); if (preparedStatement != null) preparedStatement.close(); if (connection != null) connection.close();
完整代码示例
import java.sql.*;
public class MySQLExample {
public static void main(String[] args) {
String url = "jdbc:mysql://localhost:3306/test?useSSL=false&serverTimezone=UTC";
String username = "root";
String password = "password";
try (Connection connection = DriverManager.getConnection(url, username, password)) {
// 插入数据
String insertSql = "INSERT INTO user (id, name, age) VALUES (?, ?, ?)";
try (PreparedStatement insertStmt = connection.prepareStatement(insertSql)) {
insertStmt.setInt(1, 2);
insertStmt.setString(2, "Bob");
insertStmt.setInt(3, 30);
insertStmt.executeUpdate();
}
// 查询数据
String selectSql = "SELECT * FROM user";
try (Statement selectStmt = connection.createStatement();
ResultSet resultSet = selectStmt.executeQuery(selectSql)) {
while (resultSet.next()) {
System.out.println("ID: " + resultSet.getInt("id") +
", Name: " + resultSet.getString("name") +
", Age: " + resultSet.getInt("age"));
}
}
} catch (SQLException e) {
e.printStackTrace();
}
}
}
注意事项
- 异常处理:数据库操作可能抛出
SQLException,需使用try-catch或try-with-resources处理。 - 连接池:高并发场景下建议使用连接池(如HikariCP),避免频繁创建和销毁连接。
- SQL注入防护:始终使用
PreparedStatement拼接动态参数,而非直接拼接SQL字符串。 - 时区配置:MySQL 8.0+需在
url中明确指定时区,避免时间差问题。
相关问答FAQs
Q1: 如何解决MySQL时区错误“The server time zone value ‘Öйú±ê׼ʱ¼ä’ is unrecognized or represents more than one time zone”?
A1: 在数据库连接URL中添加时区参数,例如jdbc:mysql://localhost:3306/test?serverTimezone=UTC,明确指定UTC时区或本地时区(如Asia/Shanghai)。

Q2: 为什么推荐使用PreparedStatement而不是Statement?
A2: PreparedStatement预编译SQL语句,性能更高;同时通过参数化查询有效防止SQL注入攻击,而Statement直接拼接SQL字符串存在安全风险。
