Skip to content

MySQL - Java 语法

要将 Java 应用程序与 MySQL 数据库连接,我们使用 Java 数据库连接 (JDBC) API。MySQL 的官方 JDBC 驱动程序称为 MySQL Connector/J。本指南介绍了使用 JDBC 的现代方法,强调了依赖管理、安全编码和正确的资源处理等最佳实践。

使用构建工具(Maven/Gradle)设置项目

Section titled “使用构建工具(Maven/Gradle)设置项目”

手动下载和管理 JAR 文件是一种过时的做法。现代 Java 项目使用 Maven 或 Gradle 等构建自动化工具来处理依赖项。这确保了一致性并简化了项目设置。

将以下依赖项添加到您的 pom.xml 文件中:

<dependencies>
<dependency>
<groupId>com.mysql</groupId>
<artifactId>mysql-connector-j</artifactId>
<version>8.0.33</version> <!-- Or the latest version -->
</dependency>
</dependencies>

将以下内容添加到您的 build.gradle 文件的 dependencies 块中:

dependencies {
implementation 'com.mysql:mysql-connector-j:8.0.33' // Or the latest version
}

对于现代 JDBC 驱动程序(4.0 版及更高版本),您不再需要使用 Class.forName() 手动加载驱动程序。当驱动程序在类路径 (classpath) 上时,它会自动注册。

使用 DriverManager.getConnection() 方法建立连接。正确管理数据库资源(Connection、Statement、ResultSet)以防止资源泄漏至关重要。Java 7 中引入的 try-with-resources 语句是执行此操作的标准方式,因为它保证在语句结束时关闭每个资源。

String url = "jdbc:mysql://localhost:3306/your_database?serverTimezone=UTC";
String user = "your_username";
String password = "your_password";
try (Connection conn = DriverManager.getConnection(url, user, password)) {
// 在此处使用连接
} catch (SQLException e) {
e.printStackTrace();
}

为防止 SQL 注入攻击,对于包含用户提供数据的查询,您务必始终使用 PreparedStatement。它会预编译 SQL 查询并安全地替换参数,使其比普通的 Statement 更安全,并且通常性能也更好。

String sql = "SELECT id, name, email FROM users WHERE id = ?";
try (Connection conn = ...; // 建立连接
PreparedStatement pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, userId); // 安全地设置用户 ID 参数
try (ResultSet rs = pstmt.executeQuery()) {
// 处理结果
}
}

executeQuery() 方法返回一个 ResultSet 对象,它充当查询返回的行的指针。您可以使用 while (rs.next()) 循环遍历它。

while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
System.out.printf("ID: %d, Name: %s, Email: %s%n", id, name, email);
}

当您需要将多个语句作为单个原子单元执行时,必须手动管理事务。这包括禁用自动提交 (auto-commit),执行您的语句,然后在成功时进行 commit()(提交),失败时进行 rollback()(回滚)。

conn.setAutoCommit(false); // 开启事务
try {
// ... 执行多个更新语句 ...
conn.commit(); // 结束事务
} catch (SQLException e) {
conn.rollback(); // 发生错误时回滚更改
}

此示例演示了如何创建表、使用 PreparedStatement 安全地插入数据,然后查询该数据。它对所有 JDBC 对象都使用了 try-with-resources。

import java.sql.*;
public class ModernMySQLExample {
// 替换为您的数据库详细信息
private static final String DB_URL = "jdbc:mysql://localhost:3306/TUTORIALS?serverTimezone=UTC&createDatabaseIfNotExist=true";
private static final String DB_USER = "root";
private static final String DB_PASSWORD = "password";
public static void main(String[] args) {
try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASSWORD)) {
System.out.println("Database connection established.");
setupTable(conn);
insertUser(conn, "Alice", "alice@example.com");
insertUser(conn, "Bob", "bob@example.com");
queryUsers(conn);
} catch (SQLException e) {
System.err.println("Database Error: " + e.getMessage());
e.printStackTrace();
}
}
private static void setupTable(Connection conn) throws SQLException {
String createTableSQL = "CREATE TABLE IF NOT EXISTS users (" +
"id INT AUTO_INCREMENT PRIMARY KEY," +
"name VARCHAR(100) NOT NULL," +
"email VARCHAR(100) NOT NULL UNIQUE" +
");";
try (Statement stmt = conn.createStatement()) {
stmt.execute(createTableSQL);
System.out.println("Table 'users' is ready.");
}
}
private static void insertUser(Connection conn, String name, String email) throws SQLException {
String insertSQL = "INSERT INTO users(name, email) VALUES (?, ?)";
try (PreparedStatement pstmt = conn.prepareStatement(insertSQL)) {
pstmt.setString(1, name);
pstmt.setString(2, email);
int affectedRows = pstmt.executeUpdate();
if (affectedRows > 0) {
System.out.printf("Successfully inserted user: %s%n", name);
}
}
}
private static void queryUsers(Connection conn) throws SQLException {
String selectSQL = "SELECT id, name, email FROM users";
try (Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(selectSQL)) {
System.out.println("\n--- Current Users ---");
while (rs.next()) {
int id = rs.getInt("id");
String name = rs.getString("name");
String email = rs.getString("email");
System.out.printf("ID: %-3d | Name: %-10s | Email: %s%n", id, name, email);
}
System.out.println("---------------------");
}
}
}