【Java 进阶篇】JDBC(Java Database Connectivity)详解

news2024/11/28 10:36:08

在这里插入图片描述

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 应用程序中有效地使用数据库。如果您有任何问题或需要进一步的帮助,请随时提出。

作者信息

作者 : 繁依Fanyi
CSDN: https://techfanyi.blog.csdn.net
掘金:https://juejin.cn/user/4154386571867191

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1055661.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vue.js3学习篇--Vue模板应用

目录 一,模板基础 1.模板插值 &#xff08;1&#xff09;基础插值 &#xff08;2&#xff09;HTML代码插值 &#xff08;3&#xff09;标签属性插值 2.模板指令 &#xff08;1&#xff09;定义 &#xff08;2&#xff09;指令参数 二.条件渲染 1.使用v-if指令渲染 2.使…

采集SEO方法-添加链接段落

采集大量的文章数据&#xff0c;要想批量做SEO添加链接段落方法&#xff0c;可以使用简数采集器的处理规则实现。 简数采集器的一个处理规则&#xff0c;可以包含多种SEO方法&#xff0c;还可自由组合&#xff0c;强大灵活方便。 添加补充链接段落的SEO技巧&#xff1a; 1&a…

vue2与vue3 v-model的区别

目录 Vue 2中的v-model 默认使用 自定义使用 修饰符.sync (Vue2) Vue3.x 使用 v-model vue 3 的v-model使用原理 多个 v-model 使用 总结 Vue 2中的v-model 在Vue 2中&#xff0c;v-model是一个用于在子组件和父组件之间双向绑定数据的指令。当在子组件中使用v-mode…

【数据结构】AVL树(C++实现)

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 上一篇博客&#xff1a;【数据…

性格敏感怎么办?改变性格敏感的方法有哪些?

有这么一群人&#xff0c;他们的情绪很容易受到外界的影响&#xff0c;就像一汪宁静的湖水&#xff0c;被风轻易地吹出皱纹。他们有着高度敏感的神经&#xff0c;外界稍微一点风吹草动&#xff0c;就会牵动他们紧张的情绪。 他们的思维就像脱缰的野马&#xff0c;生活中任何一…

String 进阶

字符串拼接 // 常量与常量的拼接结果放在常量池 // 常量池中不会存在相同的常量 String str1 "a" "b"; System.out.println(str1 "ab");// 拼接时有一个为变量&#xff0c;则结果会放在堆中。 // 变量拼接的原理是 StringBuilder append 最后…

C++代码示例:进制数简单生成工具

文章目录 前言代码仓库内容代码&#xff08;有详细注释&#xff09;编译和运行命令结果总结参考资料作者的话 前言 C代码示例&#xff1a;进制数简单生成工具。 代码仓库 yezhening/Programming-examples: 编程实例 (github.com)Programming-examples: 编程实例 (gitee.com) …

VSCode 在部分 Linux 设备上终端和文本编辑器显示文本不正常的解决方法

部分Linux设备上运行VSCode时&#xff0c;发现文本编辑器的缩放不明显&#xff0c;终端字体间距过大等。 这里以Kali Linux为例&#xff0c;其他Linux发行版请选择对应的系统内置的等宽字体 我们依次打开 设置 -> 外观 -> 字体 这里我们可以发现&#xff0c;Kali Linux默…

华为云云耀云服务器L实例评测|Elasticsearch的可视化Kibana工具安装 IK分词器的安装和使用

前言 最近华为云云耀云服务器L实例上新&#xff0c;也搞了一台来玩&#xff0c;期间遇到各种问题&#xff0c;在解决问题的过程中学到不少和运维相关的知识。 本篇博客介绍Elasticsearch的可视化Kibana工具安装&#xff0c;以及IK分词器的安装和使用。 其他相关的Elasticsea…

为什么需要工业物联网 (IIoT)?如何实施?

制造业数字化、网络化、智能化已经是大势所趋。这些特性都在改变着制造业的格局&#xff0c;进而影响着我们生活和工作的方式。工业物联网作为一种利用传感器、云计算、大数据和人工智能等技术&#xff0c;实现了工业设备、流程和服务的智能化&#xff0c;正逐渐成为制造业的发…

【U8+】查看余额表只有科目,没有借贷方发生额以及余额。

【问题描述】 使用用友U8时&#xff0c; 查询发生额及余额表过程中&#xff0c; 打开报表后&#xff0c;只有科目列&#xff0c;所有金额列都没有。 并且点击【还原列宽】没有没有任何反应&#xff1b;点击【栏目】后&#xff0c;发现栏目设置中全部为空。 【解决方法】 跟踪…

转转闲鱼交易猫链接源码搭建 独立后台

转转交易猫闲鱼后台源码&#xff0c;功能强大包含了多种模板和功能等等 后台一键生成链接&#xff0c;独立后台管理 教程&#xff1a;修改数据库账号 不会可以看源码里有教程 下载源码&#xff1a;https://pan.baidu.com/s/16lN3gvRIZm7pqhvVMYYecQ?pwd6zw3

2023年汉字小达人市级比赛题型示例和全真在线练习题

上一篇文章中&#xff0c;六分成长介绍了2023年汉字小达人市级比赛的相关安排和常见的问题解答&#xff0c;这篇文章我来给大家介绍具体的题型和典型试题&#xff0c;并且将这些模拟题做成了电子版&#xff0c;每次抽题150道&#xff0c;和市级比赛完全一样&#xff0c;尽早熟悉…

PHP 反序列化漏洞:身份标识

文章目录 参考环境访问修饰符访问修饰符PHP 与访问修饰符 手写身份标识身份标识定义身份标识控制字符 NUL在 PHP 中如何表示空字符&#xff1f; 通过空字符尝试构建包含非公共属性对象的序列化文本 空字符的传输控制字符的不可打印性结论另辟蹊径URL 字符编码将非 ASCII 字符文…

c#设计模式-结构型模式 之 组合模式

&#x1f680;简介 组合模式又名部分整体模式&#xff0c;是一种 结构型设计模式 &#xff0c;是用于把一组相似的对象当作一个 单一的对象 。组合模式 依据树形结构来组合对象 &#xff0c;用来表示部分以及整体层&#xff0c;它可以让你将对象组合成树形结构&#xff0c;并且…

UE5报错及解决办法

1、编译报错&#xff0c;内容如下&#xff1a; Unable to build while Live Coding is active. Exit the editor and game, or press CtrlAltF11 if iterating on code in the editor or game 解决办法 取消Enable Live Coding勾选

摆脱推荐算法,实现万物皆可『RSS』

前言 相信各位对推荐算法已经很熟悉了&#xff0c;平台基于推荐算法不断推送我们感兴趣的信息&#xff0c;但是身处推荐算法中心&#xff0c;有时我们可能感觉视野越来越闭塞&#xff0c;原来节约我们时间的推荐系统&#xff0c;这时却成了困住我们的信息茧房 那么也许 RSS&a…

007:连续跌三天,第四天上涨的概率--可视化优化1

接着006&#xff0c;有一些问题&#xff0c;要手动改文件&#xff0c;麻烦&#xff0c;直接出来一个按钮&#xff0c;点击出现弹窗可以选择文件。 二来就是&#xff0c;所统计的数据&#xff0c;没有展示细节。应该展示的细节包括&#xff1a;股票代码&#xff0c;K线周期&…

JDK11优化了哪些功能以及新增了哪些特性功能|JDK各个版本的特性分析

一、前言 上一期讲了JDK10的一些新特性&#xff0c;需要回顾的朋友们可以去该专栏回顾一下 这一期讲一讲JDK11的一些新功能 二、新增特性 以下是JDK 11的一些新增或变化的特性&#xff1a; 1. 纯字符串类型的 HTTP 客户端: JDK 11 引入了一个新的 HTTP 协议的客户端 API&…

【STM32基础 CubeMX】定时器的使用

文章目录 前言一、定时器是什么二、CubeMX配置定时器三、代码分析3.1 CubeMX代码分析3.2 几个库函数以中断的方式开启定时器定时器中断函数 四、定时器应用4.1 定时器闪烁LED 总结 前言 在嵌入式系统开发中&#xff0c;精确地控制时间和时序是至关重要的。STM32微控制器提供了…