MySQL - Java 语法
现代 MySQL 与 Java 集成
Section titled “现代 MySQL 与 Java 集成”要将 Java 应用程序与 MySQL 数据库连接,我们使用 Java 数据库连接 (JDBC) API。MySQL 的官方 JDBC 驱动程序称为 MySQL Connector/J。本指南介绍了使用 JDBC 的现代方法,强调了依赖管理、安全编码和正确的资源处理等最佳实践。
使用构建工具(Maven/Gradle)设置项目
Section titled “使用构建工具(Maven/Gradle)设置项目”手动下载和管理 JAR 文件是一种过时的做法。现代 Java 项目使用 Maven 或 Gradle 等构建自动化工具来处理依赖项。这确保了一致性并简化了项目设置。
使用 Maven
Section titled “使用 Maven”将以下依赖项添加到您的 pom.xml 文件中:
<dependencies> <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.33</version> <!-- Or the latest version --> </dependency></dependencies>使用 Gradle
Section titled “使用 Gradle”将以下内容添加到您的 build.gradle 文件的 dependencies 块中:
dependencies { implementation 'com.mysql:mysql-connector-j:8.0.33' // Or the latest version}对于现代 JDBC 驱动程序(4.0 版及更高版本),您不再需要使用 Class.forName() 手动加载驱动程序。当驱动程序在类路径 (classpath) 上时,它会自动注册。
建立数据库连接
Section titled “建立数据库连接”使用 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();}使用 PreparedStatement 执行查询
Section titled “使用 PreparedStatement 执行查询”为防止 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()) { // 处理结果 }}处理 ResultSet 中的结果
Section titled “处理 ResultSet 中的结果”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(); // 发生错误时回滚更改}完整可运行示例
Section titled “完整可运行示例”此示例演示了如何创建表、使用 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("---------------------"); } }}