JDBC
Java Web JDBC 教程
1. 安装 JDBC
在现代的 Java 开发环境中,许多项目已经转向了使用构建工具如 Maven 或 Gradle 来管理依赖库,而不再需要手动添加 JAR 文件。
1. 项目设置与依赖管理
如果你使用的是 Maven 或 Gradle,可以通过配置文件来自动下载和管理 JDBC 驱动程序,而不是手动添加 JAR 文件。
1.1 使用 Maven 作为依赖管理工具
如果你是使用 Maven 的项目,可以在项目的 pom.xml
文件中添加相应的 JDBC 驱动依赖:
<dependencies><!-- MySQL JDBC 驱动 --><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.33</version></dependency>
</dependencies>
添加依赖后,Maven 会自动下载并管理这些库。
1.2 使用 Gradle 作为依赖管理工具
对于 Gradle 项目,可以在 build.gradle
文件中添加依赖:
dependencies {implementation 'mysql:mysql-connector-java:8.0.33'
}
1.3 手动添加 JDBC 驱动(传统方法)
如果没有使用 Maven 或 Gradle,可以下载 MySQL JDBC 驱动程序 并将其添加到项目中。
- 在 Eclipse 中:右键点击项目 >
Properties
>Java Build Path
>Libraries
>Add External JARs
,选择下载的 JAR 文件。 - 在 IntelliJ IDEA 中:右键点击项目 >
Open Module Settings
>Dependencies
>+
>JARs or directories
,选择下载的 JAR 文件。
2. 数据库连接与驱动管理
2.1 创建数据库和表
我们以 MySQL 为例,先创建一个简单的 Users
表。可以在 MySQL 控制台执行以下 SQL 命令:
mysql -u root -p
CREATE DATABASE yourdatabase;
USE yourdatabase;CREATE TABLE Users (id INT PRIMARY KEY,name VARCHAR(50),email VARCHAR(100)
);
2.2 数据库连接代码
使用 JDBC 连接到 MySQL 数据库的 Java 代码示例:
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;public class DatabaseConnection {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/yourdatabase";String user = "root";String password = "password";try (Connection conn = DriverManager.getConnection(url, user, password)) {System.out.println("成功连接到数据库!");} catch (SQLException e) {e.printStackTrace();}}
}
- URL 格式:
jdbc:mysql://localhost:3306/yourdatabase
jdbc:mysql://
指定使用的数据库是 MySQL。localhost:3306
是 MySQL 数据库的地址与端口。yourdatabase
是数据库名。
- Connection 类: 用于建立与数据库的连接。
- DriverManager: 管理 JDBC 驱动程序的加载与连接。
3. SQL 语句的执行
3.1 DML 操作:插入、更新和删除
你可以使用 Statement
或 PreparedStatement
执行插入、更新或删除数据的 SQL 语句:
import java.sql.*;public class DMLExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/yourdatabase";String user = "root";String password = "password";try (Connection conn = DriverManager.getConnection(url, user, password);Statement stmt = conn.createStatement()) {// 插入数据String insertSQL = "INSERT INTO Users (id, name, email) VALUES (1, 'Alice', 'alice@example.com')";stmt.executeUpdate(insertSQL);// 更新数据String updateSQL = "UPDATE Users SET email = 'alice.new@example.com' WHERE id = 1";stmt.executeUpdate(updateSQL);// 删除数据String deleteSQL = "DELETE FROM Users WHERE id = 1";stmt.executeUpdate(deleteSQL);System.out.println("DML 操作成功!");} catch (SQLException e) {e.printStackTrace();}}
}
3.2 DQL 操作:查询数据
查询操作需要使用 executeQuery()
方法,并处理 ResultSet
对象:
import java.sql.*;public class QueryExample {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/yourdatabase";String user = "root";String password = "password";try (Connection conn = DriverManager.getConnection(url, user, password);Statement stmt = conn.createStatement()) {String query = "SELECT * FROM Users";ResultSet rs = stmt.executeQuery(query);while (rs.next()) {int id = rs.getInt("id");String name = rs.getString("name");String email = rs.getString("email");System.out.println("用户ID: " + id + ", 姓名: " + name + ", 邮箱: " + email);}} catch (SQLException e) {e.printStackTrace();}}
}
4. 批处理操作
批处理操作可以通过一次性提交多条 SQL 语句提高性能:
try (Connection conn = DriverManager.getConnection(url, user, password);Statement stmt = conn.createStatement()) {conn.setAutoCommit(false); // 禁用自动提交stmt.addBatch("INSERT INTO Users (id, name, email) VALUES (2, 'Bob', 'bob@example.com')");stmt.addBatch("INSERT INTO Users (id, name, email) VALUES (3, 'Charlie', 'charlie@example.com')");int[] results = stmt.executeBatch(); // 执行批处理conn.commit(); // 提交事务System.out.println("批处理操作成功!");
} catch (SQLException e) {conn.rollback(); // 在出现错误时回滚e.printStackTrace();
}
5. 防止 SQL 注入:使用 PreparedStatement
PreparedStatement
可以防止 SQL 注入攻击,并能动态传递参数:
import java.sql.*;public class SafeQuery {public static void main(String[] args) {String url = "jdbc:mysql://localhost:3306/yourdatabase";String user = "root";String password = "password";try (Connection conn = DriverManager.getConnection(url, user, password)) {String loginSQL = "SELECT * FROM Users WHERE name = ? AND email = ?";PreparedStatement pstmt = conn.prepareStatement(loginSQL);pstmt.setString(1, "Alice");pstmt.setString(2, "alice@example.com");ResultSet rs = pstmt.executeQuery();if (rs.next()) {System.out.println("登录成功!");} else {System.out.println("登录失败!");}} catch (SQLException e) {e.printStackTrace();}}
}
6. 事务管理
事务管理在涉及多条 SQL 语句时非常重要,尤其是在数据一致性要求较高的情况下:
try (Connection conn = DriverManager.getConnection(url, user, password)) {conn.setAutoCommit(false); // 禁用自动提交,开始事务// 插入和更新操作String sql1 = "INSERT INTO Users (id, name, email) VALUES (4, 'David', 'david@example.com')";String sql2 = "UPDATE Users SET email = 'david.new@example.com' WHERE id = 4";try (Statement stmt = conn.createStatement()) {stmt.executeUpdate(sql1);stmt.executeUpdate(sql2);}conn.commit(); // 成功后提交事务System.out.println("事务提交成功!");
} catch (SQLException e) {conn.rollback(); // 出现错误时回滚e.printStackTrace();
}
总结:
- 使用 Maven 或 Gradle 管理 JDBC 依赖。
- 如何使用 JDBC 连接数据库,执行 DML(数据操作语言)和 DQL(数据查询语言)操作。
- 实现批处理和
PreparedStatement
,以避免 SQL 注入攻击。 - 如何使用事务确保数据操作的原子性和一致性。