JDBC(Java Database Connectivity)详解

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
云数据库 RDS MySQL,高可用系列 2核4GB
简介: JDBC(Java Database Connectivity)是 Java 中用于连接和操作数据库的标准 API。它允许 Java 应用程序与不同类型的数据库进行交互,执行查询、插入、更新和删除等操作。本文将详细介绍 JDBC 的各个类及其用法,以帮助您更好地理解和使用 JDBC。

JDBC(Java Database Connectivity)是 Java 中用于连接和操作数据库的标准 API。它允许 Java 应用程序与不同类型的数据库进行交互,执行查询、插入、更新和删除等操作。本文将详细介绍 JDBC 的各个类及其用法,以帮助您更好地理解和使用 JDBC。

JDBC 架构

在了解 JDBC 的各个类之前,让我们先了解 JDBC 的基本架构。JDBC 架构主要由以下几个部分组成:

  1. JDBC API:这是 JDBC 的核心部分,包括一组接口和类,用于在 Java 应用程序和数据库之间建立连接以及执行 SQL 查询和更新操作。
  2. JDBC 驱动程序管理器:这是 JDBC 驱动程序的管理器,用于加载并管理不同数据库的 JDBC 驱动程序。
  3. JDBC 驱动程序:JDBC 驱动程序是数据库供应商提供的实现 JDBC 接口的类库,用于连接和与数据库进行通信。每个数据库都有自己的 JDBC 驱动程序。
  4. 数据库:这是要访问和操作的实际数据库,可以是各种类型的数据库,如 MySQL、Oracle、SQL Server 等。
  5. JDBC 数据源:JDBC 数据源是一种管理数据库连接的方式,它可以在应用程序和数据库之间提供连接池的功能,以提高性能和资源利用率。

现在,让我们深入了解 JDBC 的各个类以及它们的作用。

1. java.sql.DriverManager

DriverManager 类是 JDBC 的入口点之一,用于管理 JDBC 驱动程序的加载和数据库连接的建立。您可以使用以下方法来与数据库建立连接:

  • getConnection(String url, String username, String password):通过指定数据库的 URL、用户名和密码来建立与数据库的连接。返回一个 Connection 对象,用于后续的数据库操作。

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBCDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";
        try {
            Connection connection = DriverManager.getConnection(url, username, password);
            // 使用 connection 执行数据库操作
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

2. java.sql.Connection

Connection 接口表示与数据库的连接,它提供了一系列方法用于执行 SQL 查询和更新操作,以及管理事务。一旦通过 DriverManager 建立了连接,您就可以创建 StatementPreparedStatementCallableStatement 对象来执行 SQL 语句。

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";
        try {
            Connection connection = DriverManager.getConnection(url, username, password);
            Statement statement = connection.createStatement();
            // 使用 statement 执行 SQL 查询或更新操作
            // ...
            // 关闭连接和 statement
            statement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

3. java.sql.Statement

Statement 接口用于执行简单的 SQL 查询和更新操作。它允许您执行一次性 SQL 语句,但不支持参数化查询。要执行参数化查询,通常使用 PreparedStatement

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;
public class JDBCDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";
        try {
            Connection connection = DriverManager.getConnection(url, username, password);
            Statement statement = connection.createStatement();
            // 执行查询
            String query = "SELECT * FROM employees";
            statement.executeQuery(query);
            // 执行更新
            String update = "UPDATE employees SET salary = 50000 WHERE department = 'IT'";
            statement.executeUpdate(update);
            // 关闭连接
            statement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

4. java.sql.PreparedStatement

PreparedStatement 接口用于执行参数化的 SQL 查询和更新操作。与 Statement 不同,PreparedStatement 可以提高性能和安全性,因为它允许您预编译 SQL 语句并设置参数值,以避免 SQL 注入攻击。

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class JDBCDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";
        try {
            Connection connection = DriverManager.getConnection(url, username, password);
            // 预编译 SQL 查询
            String sql = "SELECT * FROM employees WHERE department = ?";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            // 设置参数值
            preparedStatement.setString(1, "IT");
            // 执行查询
            preparedStatement.executeQuery();
            // 关闭连接和 preparedStatement
            preparedStatement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

5. java.sql.ResultSet

ResultSet 接口表示从数据库查询返回的结果集。它允许您迭代结果集并获取查询结果的数据。

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class JDBCDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";
        try {
            Connection connection = DriverManager.getConnection(url, username, password);
            // 预编译 SQL 查询
            String sql = "SELECT * FROM employees WHERE department = ?";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            // 设置参数值
            preparedStatement.setString(1, "IT");
            // 执行查询
            ResultSet resultSet = preparedStatement.executeQuery();
            // 迭代结果集
            while (resultSet.next()) {
                int id = resultSet.getInt("id");
                String name = resultSet.getString("name");
                double salary = resultSet.getDouble("salary");
                // 处理查询结果
                System.out.println("ID: " + id + ", Name: " + name + ", Salary: " + salary);
            }
            // 关闭连接、preparedStatement 和 resultSet
            resultSet.close();
            preparedStatement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

6. java.sql.CallableStatement

CallableStatement 接口用于执行存储过程或函数的调用。存储过程是一组预定义的 SQL 语句,可以在数据库中执行,并且可以包含输入参数、输出参数和返回结果。

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.CallableStatement;
import java.sql.Types;
import java.sql.SQLException;
public class JDBCDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";
        try {
            Connection connection = DriverManager.getConnection(url, username, password);
            // 调用存储过程
            String callProcedure = "{CALL calculate_salary(?, ?)}";
            CallableStatement callableStatement = connection.prepareCall(callProcedure);
            // 设置输入参数
            callableStatement.setInt(1, 1001);
            // 注册输出参数
            callableStatement.registerOutParameter(2, Types.DOUBLE);
            // 执行存储过程
            callableStatement.execute();
            // 获取输出参数值
            double salary = callableStatement.getDouble(2);
            System.out.println("Calculated Salary: " + salary);
            // 关闭连接和 callableStatement
            callableStatement.close();
            connection.close();
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

7. java.sql.BatchUpdateException

BatchUpdateException 是一个异常类,用于处理 JDBC 批处理操作时的异常情况。JDBC 批处理允许一次性执行多个 SQL 语句,通常用于提高数据库操作的性能。

示例代码:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.Statement;
import java.sql.BatchUpdateException;
import java.sql.SQLException;
public class JDBCDemo {
    public static void main(String[] args) {
        String url = "jdbc:mysql://localhost:3306/mydatabase";
        String username = "root";
        String password = "password";
        try {
            Connection connection = DriverManager.getConnection(url, username, password);
            Statement statement = connection.createStatement();
            // 添加多个 SQL 语句到批处理
            statement.addBatch("INSERT INTO employees (name, department, salary) VALUES ('Alice', 'HR', 5000)");
            statement.addBatch("INSERT INTO employees (name, department, salary) VALUES ('Bob', 'IT', 6000)");
            statement.addBatch("UPDATE employees SET salary = 5500 WHERE name = 'Alice'");
            // 执行批处理
            int[] result = statement.executeBatch();
            // 处理执行结果
            for (int i = 0; i < result.length; i++) {
                if (result[i] == Statement.EXECUTE_FAILED) {
                    System.err.println("SQL command failed: " + i);
                } else {
                    System.out.println("SQL command successful: " + i);
                }
            }
            // 关闭连接和 statement
            statement.close();
            connection.close();
        } catch (BatchUpdateException e) {
            int[] updateCounts = e.getUpdateCounts();
            for (int i = 0; i < updateCounts.length; i++) {
                if (updateCounts[i] == Statement.EXECUTE_FAILED) {
                    System.err.println("SQL command failed: " + i);
                } else {
                    System.out.println("SQL command successful: " + i);
                }
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

8. javax.sql.DataSource

DataSource 是 Java 中用于管理数据库连接池的接口。连接池可以帮助提高数据库连接的性能和资源利用率,因为它可以重复使用连接,而不需要每次都创建新连接。

示例代码:

import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
public class JDBCDemo {
    public static void main(String[] args) {
        // 使用连接池获取数据库连接
        DataSource dataSource = MyDataSourceFactory.getDataSource();
        try (Connection connection = dataSource.getConnection()) {
            // 执行数据库操作
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}

在上面的示例中,MyDataSourceFactory 是一个自定义的连接池工厂类,用于创建和配置连接池。使用连接池可以减少连接的创建和销毁开销,提高应用程序的性能和响应速度。

总结

本文介绍了 JDBC(Java Database Connectivity)的核心类和接口,包括 java.sql.Connectionjava.sql.Statementjava.sql.PreparedStatementjava.sql.ResultSetjava.sql.CallableStatementjava.sql.BatchUpdateExceptionjavax.sql.DataSource。这些类和接口允许 Java 应用程序与数据库进行连接、查询和更新操作,是与数据库交互的重要工具。

JDBC 提供了多种方式来执行 SQL 查询和更新操作,包括简单的 Statement、参数化的 PreparedStatement、存储过程的 CallableStatement,以及批处理操作。连接池也是 JDBC 中常用的工具,用于管理数据库连接的复用和释放。

希望本文能够帮助您更好地理解 JDBC,并在 Java 应用程序中有效地使用数据库。如果您有任何问题或需要进一步的帮助,请随时提出。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
Java 关系型数据库 数据库连接
JDBC:Java与数据库的“黄金搭档”,为何它如此重要?
JDBC:Java与数据库的“黄金搭档”,为何它如此重要?
47 8
|
3月前
|
Java 数据库连接 API
JDBC:Java数据库连接的“黑科技”大揭秘
JDBC:Java数据库连接的“黑科技”大揭秘
38 7
|
3月前
|
SQL Java 数据库连接
为何JDBC是Java开发者的“心头好”?原因竟然这么简单!
为何JDBC是Java开发者的“心头好”?原因竟然这么简单!
40 3
|
2月前
|
关系型数据库 MySQL Java
flywa报错java.sql.SQLSyntaxErrorException: Unknown database ‘flyway‘
flywa报错java.sql.SQLSyntaxErrorException: Unknown database ‘flyway‘
35 1
|
1月前
|
SQL Java 数据库连接
如何在 Java 脚本中有效地使用 JDBC
如何在 Java 脚本中有效地使用 JDBC
16 0
|
3月前
|
SQL Java 关系型数据库
探索Java数据库连接的奥秘:JDBC技术全攻略
探索Java数据库连接的奥秘:JDBC技术全攻略
58 8
|
3月前
|
SQL Java 数据库连接
JDBC之旅:从陌生到熟悉的Java数据库连接之路
JDBC之旅:从陌生到熟悉的Java数据库连接之路
29 9
|
3月前
|
SQL Java 数据库连接
Java开发者必知:JDBC连接数据库的“三大法宝”
Java开发者必知:JDBC连接数据库的“三大法宝”
34 7
|
6月前
|
SQL Oracle 关系型数据库
WARNING: Too Many Parse Errors With error=911 When Running a JDBC Application Connected to an Oracle 19c database
WARNING: Too Many Parse Errors With error=911 When Running a JDBC Application Connected to an Oracle 19c database (
91 2
|
6月前
|
Oracle 关系型数据库
19c 开启Oracle Database Vault
19c 开启Oracle Database Vault
162 1