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 注入攻击。 - 如何使用事务确保数据操作的原子性和一致性。