2-【JavaWeb】深入理解JDBC

JDBC

Java Web JDBC 教程

1. 安装 JDBC

在现代的 Java 开发环境中,许多项目已经转向了使用构建工具如 MavenGradle 来管理依赖库,而不再需要手动添加 JAR 文件。

1. 项目设置与依赖管理

如果你使用的是 MavenGradle,可以通过配置文件来自动下载和管理 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 操作:插入、更新和删除

你可以使用 StatementPreparedStatement 执行插入、更新或删除数据的 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();
}

总结:

  1. 使用 Maven 或 Gradle 管理 JDBC 依赖。
  2. 如何使用 JDBC 连接数据库,执行 DML(数据操作语言)和 DQL(数据查询语言)操作。
  3. 实现批处理和 PreparedStatement,以避免 SQL 注入攻击。
  4. 如何使用事务确保数据操作的原子性和一致性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值