自学内容网 自学内容网

JDBC讲解(第二篇)

上篇主要讲解了JDBC的介绍与下载驱动的方式,这篇主要讲解JDBC的运用。

API主要类/接口的功能

1.与数据库建立连接

1.DriverManager类:装载驱动程序,并为了创建新的数据库连接提供支持。

2.Connection接口:负责连接数据库并担任传送数据的任务。

2.发送SQL语句

1.Statement接口:由Connection产生,负责执行SQL语句。

2.PreparedStatement接口:Statement的子接口,也由Connection产生,同样负责执行SQL语句。与Statement接口相比,PrearedStatement接口具有高安全性、高性能、高可读性和高可维护性等优点。

3.返回处理结果

ResultSet接口:负责保存和处理Statement执行后产生的查询结果。

使用Statement的作用

Statement 是 Java 数据库连接(JDBC)API 中的一个核心接口,它用于执行静态的 SQL 语句并返回结果。以下是 Statement 的主要作用和特点:

主要作用

  1. 执行 SQL 查询
    • 使用 executeQuery(String sql) 方法执行 SQL 查询语句(如 SELECT),并返回一个 ResultSet 对象,该对象包含查询结果。
  2. 执行 SQL 更新
    • 使用 executeUpdate(String sql) 方法执行 SQL 更新语句(如 INSERTUPDATEDELETE),并返回一个整数,表示受影响的行数。
  3. 执行任何 SQL 语句
    • 使用 execute(String sql) 方法可以执行任何 SQL 语句,并根据语句类型返回相应的结果。对于查询语句,它返回 true 并设置 ResultSet 对象;对于更新语句,它返回 false 并更新受影响的行数。然而,由于 execute 方法的行为取决于 SQL 语句的类型,因此通常不如 executeQuery 和 executeUpdate 明确和方便。

特点

  • 简单直接Statement 接口提供了最直接的方式来执行 SQL 语句,无需额外的配置或处理。
  • 灵活性:可以执行任何类型的 SQL 语句,包括查询、更新和DDL(数据定义语言)语句。
  • 低安全性:由于 SQL 语句是直接拼接的,因此容易受到 SQL 注入攻击。对于包含用户输入的情况,应使用 PreparedStatement 来避免这种风险。
  • 低性能:对于需要重复执行的 SQL 语句,Statement 每次都会解析和编译 SQL,这可能导致性能下降。相比之下,PreparedStatement 会将 SQL 语句预编译并缓存起来,从而提高性能。

使用场景

  • 简单查询和更新:对于不涉及用户输入或不需要高性能的简单查询和更新操作,Statement 是一个可行的选择。
  • 一次性操作:对于只需要执行一次的 SQL 语句(如创建表、删除表等DDL操作),Statement 也是合适的。

注意事项

  • 关闭资源:使用完 Statement 后,应确保关闭它以释放数据库资源。这通常是在 finally 块中完成的。
  • 异常处理:捕获并处理 SQLException 以处理可能发生的数据库错误。
  • 避免 SQL 注入:对于包含用户输入的情况,应使用 PreparedStatement 而不是 Statement 来防止 SQL 注入攻击。

总的来说,Statement 是 JDBC API 中用于执行 SQL 语句的基本工具之一,但在实际开发中,根据具体需求和场景,可能需要考虑使用更安全的 PreparedStatement 或其他高级功能来提高性能和安全性。

案例:

下是一个使用JDBC进行增删改查(CRUD)操作的简单案例。这个案例将展示如何向一个名为employees的数据库表中插入、查询、更新和删除记录。

首先,假设你的employees表结构如下:

CREATE TABLE employees (
    id INT PRIMARY KEY AUTO_INCREMENT,
    name VARCHAR(100) NOT NULL,
    position VARCHAR(100) NOT NULL,
    salary DECIMAL(10, 2) NOT NULL
);

接下来是Java代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class EmployeeCRUD {

    // JDBC URL, 用户名和密码(请根据实际情况修改)
    private static final String JDBC_URL = "jdbc:mysql://localhost:3306/your_database";
    private static final String JDBC_USER = "your_username";
    private static final String JDBC_PASSWORD = "your_password";

    public static void main(String[] args) {
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        Statement statement = null;

        try {
            // 打开数据库连接
            connection = DriverManager.getConnection(JDBC_URL, JDBC_USER, JDBC_PASSWORD);

            // 插入数据
            String insertSQL = "INSERT INTO employees (name, position, salary) VALUES (?, ?, ?)";
            preparedStatement = connection.prepareStatement(insertSQL);
            preparedStatement.setString(1, "John Doe");
            preparedStatement.setString(2, "Software Engineer");
            preparedStatement.setBigDecimal(3, new BigDecimal("75000.00"));
            preparedStatement.executeUpdate();

            // 查询数据
            String selectSQL = "SELECT * FROM employees";
            statement = connection.createStatement();
            resultSet = statement.executeQuery(selectSQL);
            while (resultSet.next()) {
                System.out.println("ID: " + resultSet.getInt("id") +
                        ", Name: " + resultSet.getString("name") +
                        ", Position: " + resultSet.getString("position") +
                        ", Salary: " + resultSet.getBigDecimal("salary"));
            }

            // 更新数据
            String updateSQL = "UPDATE employees SET salary = ? WHERE id = ?";
            preparedStatement = connection.prepareStatement(updateSQL);
            preparedStatement.setBigDecimal(1, new BigDecimal("80000.00"));
            preparedStatement.setInt(2, 1); // 假设要更新的是id为1的记录
            preparedStatement.executeUpdate();

            // 删除数据
            String deleteSQL = "DELETE FROM employees WHERE id = ?";
            preparedStatement = connection.prepareStatement(deleteSQL);
            preparedStatement.setInt(1, 2); // 假设要删除的是id为2的记录
            preparedStatement.executeUpdate();

        } catch (SQLException e) {
            // 处理SQL异常
            e.printStackTrace();
        } finally {
            // 清理资源
            try {
                if (resultSet != null) resultSet.close();
                if (preparedStatement != null) preparedStatement.close();
                if (statement != null) statement.close();
                if (connection != null) connection.close();
            } catch (SQLException e) {
                // 处理关闭资源时的异常
                e.printStackTrace();
            }
        }
    }
}

注意事项

  1. JDBC URL:确保JDBC URL正确无误,并且数据库服务器正在运行。
  2. 异常处理:使用try-catch块捕获并处理SQLException
  3. 资源管理:在finally块中关闭ResultSetPreparedStatementStatementConnection,以确保数据库资源得到释放。
  4. 数据安全性:使用PreparedStatement来防止SQL注入攻击。
  5. 事务处理:在实际应用中,你可能需要处理事务,以确保数据的一致性。这通常涉及到在多个操作之间设置保存点、回滚或提交事务。

这个案例展示了如何使用JDBC进行基本的CRUD操作。然而,在实际开发中,你可能会使用更高级的框架(如Spring JDBC、Hibernate或MyBatis)来简化数据库操作并提高代码的可维护性。


原文地址:https://blog.csdn.net/2401_88512872/article/details/143837325

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!